如果系统收到的数据包的窗口比例 TCP 选项值大于 14,则会导致这种情况,在本例中它显示为 15。问题似乎出在远程主机上。请注意,连接仍然被接受,系统只是使用 14 作为比例值。 我们可以使用 tcpdump 捕获数据包跟踪来识别发送数据包的主机。 RFC1323 中将 TCP 窗口比例定义为最多 14: 在 根据其他因素,系统可能会或可能不会接受连接。环境
问题
Oct 6 21:01:05 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 15 >14 received.
Oct 6 21:01:05 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 15 >14 received.
Oct 7 10:57:22 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 15 >14 received.
Oct 7 10:57:23 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 15 >14 received.
解决
根本原因
/* Maximal number of window scale according to RFC1323 */
#define TCP_MAX_WSCALE 14U
tcp_parse_options
解析并测试此选项是否符合所需条件。如果比例因子高于最大比例,且所有其他条件均符合,则系统输出消息,将比例因子设置为最大比例因子,并接受该选项。void tcp_parse_options(const struct net *net,
const struct sk_buff *skb,
struct tcp_options_received *opt_rx, int estab,
struct tcp_fastopen_cookie *foc)
{
...
case TCPOPT_WINDOW:
if (opsize == TCPOLEN_WINDOW && th->syn &&
!estab && net->ipv4.sysctl_tcp_window_scaling) {
__u8 snd_wscale = *(__u8 *)ptr;
opt_rx->wscale_ok = 1;
if (snd_wscale > TCP_MAX_WSCALE) {
net_info_ratelimited("%s: Illegal window scaling value %d > %u received\n",
__func__,
snd_wscale,
TCP_MAX_WSCALE);
snd_wscale = TCP_MAX_WSCALE;
}
opt_rx->snd_wscale = snd_wscale;
}
break;
...