为什么 Linux 服务器响应的 TCP 数据包大于客户端请求的 MSS

问题描述 投票:0回答:3

我看到了一件奇怪的事情,这不是我根据 TCP 理论所期望的:

客户端在握手时将 MSS(最大段大小)设置为 1360,窗口大小为 64K,但 Linux 服务器发送的 TCP 数据包包含 4KB、7KB、一些 8KB 的数据包,这超出了 1360,这是我所期望的小于 1360 字节。

我通过执行

tcpdump
然后在 Wireshark 中检查它来观察到这一点。

我没想到服务器每个 TCP 数据包发送超过 1360 字节。我对 TCP 工作原理的理论理解是否有错误?

networking tcp linux-kernel
3个回答
2
投票

首先,正如 @fernacolo 所说,不要混淆 MSS 和 MTU。

也许您的界面的通用分段卸载已开启 - 请阅读此处了解更多信息。


0
投票

如果您在服务器上捕获数据包,那么您可能会看到 TCP 发送的数据段大于 MTU。然而,线路上的数据包仅具有 MTU 大小。您可以通过在网络设备(交换机)等上捕获来验证这一点。或者,在远程(客户端)计算机上捕获数据包将显示每个数据包是<= MTU .

此行为是由于启用了 TSO/GSO 后,TCP 段被 NIC 硬件分割成 MTU 大小的数据包。由于

tcpdump
在软件层捕获,因此它会看到大于 MTU 的分段被发送到 NIC 卡以进行进一步传输。

如果禁用 NIC 的 TSO/GSO,那么您将看到所有传出数据包都为 <= MTU size (more likely pMTU size).


-1
投票

检查您是否混淆了 MSS 和 MTU。数据包大小受 MTU 限制,而不是 MSS。完整的 TCP 数据包包含 MAC 标头、IP 标头、TCP 标头、TCP 选项和有效负载。因此,TCP 数据包很可能大于 MSS。

© www.soinside.com 2019 - 2024. All rights reserved.