发送的 TCP 数据包超出了连接的 MSS——这怎么可能?

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

我对网络/网络驱动程序设计原理非常陌生,并且希望获得一些帮助和指导来解决我从设备内捕获的 tcpdump 中看到的奇怪行为。

日志显示设备(基于 Linux)偶尔会发送大小超过既定 MSS 值的数据包。我相当确定捕获的内容反映了网络上发送的内容。此假设基于以下事实:对等方不确认这些违反 MSS 的数据包,并且设备确实正在重新发送这些丢弃的数据包。对等方在确认正确大小的 TCP 数据包时没有问题,因此我坚信这是设备的问题。

我正在尝试缩小问题范围,但我想更清楚地了解可能出现此问题的不同情况。据我所知,来自主机的 tcpdump 日志意味着我看到的数据包是在内核和 NIC/硬件驱动程序层之间捕获的。我最初猜测问题出在内核上;这是基于我的业余假设,即内核/tcp 驱动程序应该负责在将数据发送到 NIC 之前正确分段数据。

如果该假设成立,那么这是否意味着网络接口硬件是问题所在,并且这些网络设备具有识别 TCP 数据包并将它们汇集到单个数据包中的处理能力?

如果该假设不成立,那么这是否意味着这些网络设备通常被设计为存储基于连接的信息,以便正确分段从 CPU 接收的数据?

另外,我觉得我需要注意,我正在分析的这台有问题的机器确实在其自身和电线之间有一个外部开关。

提前感谢您提供任何见解。

network-programming tcp linux-kernel embedded-linux
1个回答
0
投票

好吧,我想我找到了答案:

看起来 TCP 帧如何发送到 NIC 取决于设置/实现。对于 Linux,看起来他们有一个性能选项 (TSO),可以在将 TCP 分段发送到较低层之前自行进行 TCP 分段,或者只是将大量数据发送到 NIC 并将 TCP 分段工作卸载给它.

我看到设备上的以太网接口启用了 TSO,因此问题似乎出在外部交换机的软件中,该软件在将数据包发送到线路之前未正确分段。

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