我有以下要求,
我有一台Linux PC直接连接到嵌入式主板。
Linux PC从Internet接收IP流量 - 需要将其转发到嵌入式主板。但是,嵌入式电路板无法重新组装IP片段。目前我们所做的是在linux pc中接收重组数据包,然后sendto()到emmbeded板。然而,考虑到高流量负载,这会占用Linux PC中太多的CPU周期 - 因为这会从内核空间向用户空间发送一个副本,并且同样的数据包会从用户空间复制到内核空间。
内核是否有办法重新组合fragements并将IP转发到嵌入式主板,而不必将数据包送到用户空间?注意:我可以灵活地将IP数据包的目标IP设置为Linux PC或嵌入式主板。
由于
答案 0 :(得分:1)
一般来说,内核中没有内置功能,特别是如果重组的数据包超出MTU大小,因此无法传输到嵌入式主板。如果你想这样做,我建议通过tun
设备进行路由并在用户空间重新组装,或者(如果你只是使用tcp)使用任何旧的tcp代理。如果有效编写,很难理解为什么如果嵌入式主板可以设法处理输出,linux PC将无法跟上这个问题。如果你坚持使用内核,我认为有一种tcp拼接技术(参见kernel-based (Linux) data relay between two TCP sockets)虽然它是否在段级别工作,因此不会重新组装,我不知道。
但是,你真的需要吗?看到: http://en.wikipedia.org/wiki/Path_MTU_Discovery
这里发送tcp会话时精确设置DF
位,因此不会发生碎片。这意味着大多数此类tcp会话实际上不需要支持碎片。
答案 1 :(得分:0)
根据问题的标题,您似乎需要在中间节点(Linux设备)上执行重组。这并不意味着你必须在内核空间中这样做。
看看DPDK。它是一个开源数据平面开发工具包。这可能听起来很复杂,但它只是使用轮询模式驱动程序将数据包送到用户空间而没有复制和中断开销。
请注意,它使用轮询模式驱动程序并占用CPU周期。如果您准备放弃几个核心,假设您还想在反向路径中对数据包进行分段,则可以在x86_64硬件上使用dpdk。
请查看DPDK的示例应用程序指南,了解数据包碎片和重组。