我正在开发一个networkingstream量生成的应用程序。 应用程序在promiscous模式下有eth1 。 所以它直接处理所有传入和传出的stream量。
我正在实现的function之一是IP碎片和碎片整理。 传入的分片需要重新组合,如果传出分组的大小超过1500字节的MTU,则需要分片。
testing我的应用程序的一个简单的方法是发送ping命令到eth1的IP地址:
ping -c1 -s 20000 10.3.2.1
这工作正常。
但是,一旦数据包大小超过〜53000字节,就会失败。 根据Wireshark我接收片段,直到片段偏移〜51000,然后什么都没有,接着是重组超时。
IP数据包的最大大小是65535字节。 ping命令允许指定一个大小,直到65507.这实际上工作,如果我ping到eth0 (操作系统控制)。
用GDB从内部检查应用程序一切正常。 浏览代码,发现碎片进入我的应用程序,IP数据包被成功地重新组装,然后再被碎片化,碎片被发送回发件人。 即使对于最后一个片段, send(...) (套接字API)的返回值也等于片段的大小,表示成功。
有没有人有一个想法可能会出错?
操作系统是Linux(基于RTLinux)。
如果数据包正确碎片,然后在客户端重新组装,但反向不起作用,
A -----> B | A <--x-- B
我会build议首先尝试反转angular色(因为问题是在回来的路上),并检查是否这个时候,分段的数据包/重组可以由A
A <----- B | ?
如果没有,从B到A的数据包pipe理存在问题,可能是防火墙限制,或者您可能有的任何路由器或交换机。
The maximum TCP segment you can have is 65,495 bytes.
如果你关心标题…它可能是你正在寻找的界限:>
另外,你有一个不断的TCP窗口,或者它正在适应自己? 也许一个较小的窗口被使用,你不能发送更多的数据
问题是数据包丢失。 IP响应通过千兆线路发送到交换机。 这个交换机又通过一个100MB的线路转发这些消息。 这意味着数据包以比他们离开时更快的速度到达,导致交换机内部的内存使用量迅速上升。 一旦使用了所有内存,交换机就没有别的select,只能开始丢弃数据包。