环境
- CentOS Linux
问题
- 在 var/log/messages 文件中发现以下日志。
Oct 6 21:01:05 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 154 >14 received.
Oct 6 21:01:05 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 154 >14 received.
Oct 7 10:57:22 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 154 >14 received.
Oct 7 10:57:23 mplttaxsx101 kernel: tcp_parse_options: Illegal window scaling value 154 >14 received.
解决
如果系统收到的数据包的窗口比例 TCP 选项值大于 14,则会导致这种情况,在本例中它显示为 154。问题似乎出在远程主机上。请注意,连接仍然被接受,系统只是使用 14 作为比例值。
我们可以使用 tcpdump 捕获数据包跟踪来识别发送数据包的主机。
根本原因
-
RFC1323 中将 TCP 窗口比例定义为最多 14:
/* 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; ...
根据其他因素,系统可能会或可能不会接受连接。