实施 IP 分片

实施 IP 分片

我正在开发一个生成网络流量的应用程序。该应用程序处于eth1混杂模式。因此它直接处理所有传入和传出的流量。

我正在实现的功能之一是 IP 分段和碎片整理。传入的碎片需要重新组合,如果传出的数据包大小超过 1500 字节的 MTU,则需要对其进行分段。

ping测试我的应用程序的一个简单方法是向以下 IP 地址发送命令eth1

ping -c1 -s 20000 10.3.2.1

一切正常。

但是,一旦数据包大小超过 ~53000 字节,它就会失败。根据 Wireshark,我收到片段,直到片段偏移量 ~51000,然后什么都没有,然后重组超时。

IP 数据包的最大大小为 65535 字节。该ping命令允许指定最大大小为 65507。如果我 ping 到eth0(操作系统控制),这实际上是可行的。

使用 GDB 从内部检查应用程序时,一切正常。单步执行代码显示,片段进入我的应用程序,IP 数据包成功重组,然后再次分段,并将片段发送回发送方。即使对于最后一个片段,send(...)(套接字 API)的返回值也等于片段的大小,表示成功。

有人知道可能出了什么问题吗?

操作系统是Linux(基于RTLinux)。

答案1

如果数据包正确分段,则在客户端重新组装,但反向操作不起作用,

A -----> B
         |
A <--x-- B

我建议首先尝试反转角色(因为问题在回程中),并检查这次碎片数据包/重组是否可以由 A 执行

A <----- B
|
?

如果不是,那么从 B 到 A 的数据包管理就有问题,可能是防火墙限制,或者是中间存在任何路由器或交换机。

答案2

The maximum TCP segment you can have is 65,495 bytes. 

如果您关心标题...它可能就是您正在寻找的边界:>

另外,TCP 是否有固定窗口,还是它自己调整?也许使用了较小的窗口,你无法发送更多数据

答案3

解决了

问题在于数据包丢失。IP 响应通过千兆线路发送到交换机。该交换机又通过 100 MBit 线路转发消息。这意味着数据包到达的速度比离开的速度要快,导致交换机内部的内存使用率迅速上升。一旦所有内存都用完,交换机就别无选择,只能开始丢弃数据包。

相关内容