Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 中间节点的Ip重组_Linux_Sockets_Networking_Linux Kernel_Ip - Fatal编程技术网

Linux 中间节点的Ip重组

Linux 中间节点的Ip重组,linux,sockets,networking,linux-kernel,ip,Linux,Sockets,Networking,Linux Kernel,Ip,我有以下要求: 我有一台直接连接到嵌入式主板的Linux PC Linux PC接收来自Internet的IP通信-它需要将其转发到嵌入式板。但是,嵌入式电路板不能重新组装IP片段。目前我们要做的是在linux pc中接收重新组装的数据包,然后发送到EMMBED板。然而,考虑到高流量负载,这会在Linux PC中消耗太多的CPU周期,因为这涉及到从内核空间到用户空间的复制,同样的数据包也会从用户空间复制到内核空间 内核是否有办法重新组装碎片并将其转发到嵌入式板,而不必将数据包送到用户空间?注意:

我有以下要求:

我有一台直接连接到嵌入式主板的Linux PC

Linux PC接收来自Internet的IP通信-它需要将其转发到嵌入式板。但是,嵌入式电路板不能重新组装IP片段。目前我们要做的是在linux pc中接收重新组装的数据包,然后发送到EMMBED板。然而,考虑到高流量负载,这会在Linux PC中消耗太多的CPU周期,因为这涉及到从内核空间到用户空间的复制,同样的数据包也会从用户空间复制到内核空间

内核是否有办法重新组装碎片并将其转发到嵌入式板,而不必将数据包送到用户空间?注意:我可以灵活地将IP包的目标IP设置为Linux PC或嵌入式板


感谢

广义地说,不,这不是内置在内核中的,特别是如果重新组装的数据包超过了MTU大小,因此无法传输到嵌入式板。如果您想这样做,我建议通过
tun
设备进行路由,并在用户空间中重新组装,或者(如果您只是使用tcp)使用任何旧的tcp代理。如果编写效率高,很难理解如果嵌入式板能够处理输出,linux PC为什么不能跟上这一速度。如果您坚持使用内核,我认为有一种tcp拼接技术(请参阅),但我不知道它是否在段级别工作,因此不会重新组装

然而,你真的需要它吗?见:


在这里,发送tcp会话时,精确设置了
DF
位,所以不会出现碎片。这意味着大多数这样的tcp会话实际上不需要支持分段。

根据问题的标题,您似乎需要在中间节点(linux设备)上执行重新组装。这并不意味着您必须在内核空间中进行

看一看。它是一个开源的数据平面开发工具包。这听起来可能很复杂,但它所做的只是使用轮询模式驱动程序将数据包发送到用户空间,而不需要复制和中断开销

请不要,它使用轮询模式驱动程序,并将占用CPU周期。如果您准备放弃两个内核(假设您还希望以反向路径对数据包进行分段),那么可以在x86_64硬件上使用dpdk


请参阅DPDK的示例应用指南,了解数据包碎片和重新组装。

TCP?UDP?其他的?IP重组在IP堆栈中进行,而不是在用户空间。如果您使用TCP,您可以进行零拷贝传输。感谢您的回复。我知道路径MTU发现,但这是针对一个特定的需求,我们需要TCP流量与最大MTU大小相匹配。Linux PC还运行其他应用程序,因此cpu负载问题我不确定如果进行片段重组,内核与用户空间的负载是否会有显著差异,但看起来您需要查看上面的tcp拼接链接,据我所知,这是在没有自定义模块的情况下在内核空间工作的唯一方法。很抱歉,我犯了一个错误-UDP通信保证以片段的形式进入Linux PC。我希望在Linux PC中重新组装此UDP通信并转发到嵌入式板。(尽可能有效)好的,那么我认为我的答案是正确的(虽然不是你想听到的),也就是说,内核不能在内核空间中做这件事,除非你写一些特定的东西来做。我假设不可能(I)切换到tcp或(ii)将路径MTU大小(通过虚拟tcp会话发现)传输到客户端,以便客户端始终可以安排小于该值的UDP数据包,或(iii)使用保证小于最小IP MTU大小的UDP数据包(来自内存512字节,但请检查)为什么你一直说内核不能在内核空间中完成它?这就是IP重组发生的地方。