Why system logging "kernel: tcp_parse_options: Illegal window scaling value 15 >14 received" error ?

环境

  • Linux

问题

  • 在 var/log/messages 文件中发现以下日志。
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.

解决

  • 如果系统收到的数据包的窗口比例 TCP 选项值大于 14,则会导致这种情况,在本例中它显示为 15。问题似乎出在远程主机上。请注意,连接仍然被接受,系统只是使用 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;
    ...
  • 根据其他因素,系统可能会或可能不会接受连接。

posted @ 2024-09-12 11:17  墨清竹  阅读(14)  评论(0编辑  收藏  举报