原始套接字的数据包碎片

时间:2010-11-15 19:04:41

标签: c++ sockets udp fragmentation

如果我使用原始套接字发送大小为3000字节的UDP数据包,我是否需要在代码中自己处理数据包碎片,或者原始套接字是否应该处理类似于DGRAM套接字的碎片?

5 个答案:

答案 0 :(得分:5)

好吧,如果您使用的是UDP,那么您并没有真正发送RAW。 RAW根本就不是IP,在这种情况下,你必须自己处理碎片。

使用UDP,您可以获得IP的碎片支持,这对于短距离网络来说,恕我直言,其中碰撞应该是最小的。使两个系统之间的链接成为一个专用子网,这根本不是问题。

TCP通过UDP(以及其他东西)购买的是堆栈能够重新发送一个片段(如果它丢失或以某种方式被冲洗)的能力。如果发生这种情况,则必须丢弃整个消息。虽然有这样的开销,但对于大多数现代网络来说,你可能会接受这种权衡。

答案 1 :(得分:2)

不,数据包碎片是在较低级别处理的。您应该确切地看到您放入数据包的内容。也就是说UDP保证消息边界。

答案 2 :(得分:2)

底层协议IP仍然处理碎片。我认为,只要你没有设置DF(不要碎片),就应该没问题。

答案 3 :(得分:0)

根据您的系统,可以采用完全不同的方式处理。例如,在Linux上,如果您尝试发送大于(已知)路径MTU的内容,可以要求较低层处理路径MTU发现并给出错误(EMSGSIZE)。

你所谈论的原始套接字是如何“原始”的?其他系统可以让你控制DF位(或者你可能自己构建大部分IP头),在这种情况下,行为也将依赖于此。

通常,如果使用DF设置进行传输,通常可以选择在用户空间中看到错误,或者让主机上的较低级别处理PMTU发现并停止发送过大的内容。如果你没有设置DF,那么你(可能)会在路径上看到路由器的适当碎片。

答案 4 :(得分:0)

对于Linux,答案是肯定的。如果您看一下Linux的raw socket implementation,原始套接字就不会重新组装。