Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net 套接字是否将IP碎片数据包作为一个重新组装的UDP数据包交付?_.net_Sockets_Udp_Ip Fragmentation - Fatal编程技术网

.net 套接字是否将IP碎片数据包作为一个重新组装的UDP数据包交付?

.net 套接字是否将IP碎片数据包作为一个重新组装的UDP数据包交付?,.net,sockets,udp,ip-fragmentation,.net,Sockets,Udp,Ip Fragmentation,当接收TCP数据包时,Socket将给我重新组装的数据包,以防它们被IP碎片化,因为我保证得到一个有序的、无间隙的字节流 当接收UDP数据包时,我可能会以与发送不同的顺序接收数据包,或者重复接收数据包,而其他数据包可能会在接收过程中丢失,我希望在每个UDP/IP数据包到达时立即将其“原始”。另一方面,由于我没有得到IP报头,我无法自己重新组装数据包。换句话说,我必须依靠Socket来完成这项工作。但这意味着,对于这种单独的重组,如果一个片段不能成功,则必须对(碎片化的)数据包进行缓冲、排序、重复

当接收TCP数据包时,
Socket
将给我重新组装的数据包,以防它们被IP碎片化,因为我保证得到一个有序的、无间隙的字节流

当接收UDP数据包时,我可能会以与发送不同的顺序接收数据包,或者重复接收数据包,而其他数据包可能会在接收过程中丢失,我希望在每个UDP/IP数据包到达时立即将其“原始”。另一方面,由于我没有得到IP报头,我无法自己重新组装数据包。换句话说,我必须依靠
Socket
来完成这项工作。但这意味着,对于这种单独的重组,如果一个片段不能成功,则必须对(碎片化的)数据包进行缓冲、排序、重复数据消除和丢弃


这在现实中是如何工作的?

重组发生在IP层,对您来说是透明的。简而言之,除了性能方面的原因外,您不需要担心它,除非您自己拆分数据包。

通常,对于UDP,您会自己为每个数据包添加一种标头,这样您就可以识别数据并知道什么时候丢失了什么。您还可以选择足够小的数据包大小,以防止拆分。如果碎片真的发生了,我不知道如何处理它。换句话说,对于重新组装,IP层已经提供了类似于一些更高层TCP特性的特性:数据包的排序(并因此进行缓冲),以及丢弃未完成的碎片组时的超时。您有任何参考资料,我可以验证您的答案吗?那将是RFC 791,UDP不保证数据包的顺序,但将保证数据报在收到时完整…无论它们在传输过程中是否被分割。这样做的结果是,如果一个数据包被分割,并且其中一部分丢失或在时间窗口内没有收到,那么您将不会收到任何数据包。因此,通常最好保持较小的数据报大小。虽然重新组装确实发生在IP层,但它是最终目的地的IP层。不是目的地之前的路由器或交换机<代码>当IP数据报被分割时,它在到达最终目的地之前不会重新组装解释得很好,我建议您查看此代码并进行验证。