我发现我的 Linux 系统中存在一个奇怪的行为,当我卷动网页时,接收到的 TCP 段明显大于 MSS。
以下是 tcpdump 的输出:
00:00:00.000000 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [S],seq 248491621,win 29200,选项 [mss 1460,sackOK,TS val 294137 ecr 0,nop,wscale 7],长度 0 00:00:00.004210 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [S.],seq 1384820706,ack 248491622,win 29200,选项 [mss 1380,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 7],长度 0 00:00:00.000063 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 1,win 229,长度 0 00:00:00.000082 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [P.],序号 1:78,确认 1,获胜 229,长度 77 00:00:00.004187 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],ack 78,win 193,长度 0 00:00:00.002929 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [P.],序号 1:819,确认 78,获胜 193,长度 818 00:00:00.000032 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 819,win 241,长度 0 00:00:00.000075 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [P.],序列号 819:16385,确认 78,获胜 193,长度 15566 00:00:00.000016 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 16385,win 485,长度 0 00:00:00.000016 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 16385:19105,确认 78,获胜 193,长度 2720 00:00:00.000009 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 19105,win 527,长度 0 00:00:00.000086 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 19105:20465,确认 78,获胜 193,长度 1360 00:00:00.000009 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 20465,win 548,长度 0 00:00:00.001338 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 20465:28625,确认 78,获胜 193,长度 8160 00:00:00.000015 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 28625,win 676,长度 0 00:00:00.132259 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 28625:42225,ack 78,win 193,长度 13600 00:00:00.000027 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 42225,win 888,长度 0 00:00:00.003511 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [P.],序列号 42225:55825,确认 78,获胜 193,长度 13600 00:00:00.000035 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 55825,win 1101,长度 0 00:00:00.000041 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 55825:58545,确认 78,获胜 193,长度 2720 00:00:00.000033 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 58545,win 1143,长度 0 00:00:00.001683 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 58545:61265,确认 78,获胜 193,长度 2720 00:00:00.000012 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 61265,win 1186,长度 0 00:00:00.000027 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 61265:63985,确认 78,获胜 193,长度 2720 00:00:00.000007 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 63985,win 1228,长度 0 00:00:00.000034 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 63985:69425,确认 78,获胜 193,长度 5440 00:00:00.000008 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 69425,win 1313,长度 0 00:00:00.001476 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],序列号 69425:83025,确认 78,获胜 193,长度 13600 00:00:00.000033 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 83025,win 1300,长度 0 00:00:00.004061 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [P.],序列号 83025:89274,确认 78,获胜 193,长度 6249 00:00:00.000026 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 89274,win 1380,长度 0 00:00:00.000139 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [F.],序列号 78,ack 89274,win 1411,长度 0 00:00:00.004609 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [.],ack 79,win 193,长度 0 00:00:00.000038 IP 115.239.210.27.80 > 10.15.71.190.44503:标志 [F.],序列号 89274,确认 79,获胜 193,长度 0 00:00:00.000018 IP 10.15.71.190.44503 > 115.239.210.27.80:标志 [.],ack 89275,win 1411,长度 0
可以看出,在 TCP 握手中,MSS 是 1380。
我不知道这怎么会发生,我的本地链接的 MTU 是 1500。而且我在我的 Windows 中尝试过,在 Windows 中没有问题。
答案1
也许您的 Linux 系统中的 NIC 启用了一些硬件 TCP 卸载功能,因此内核在 NIC 处理数据包(并因此修改结果)之前看不到这些数据包。