Datagramsocket:接收(...)如何处理数据包的碎片

时间:2013-04-18 04:29:06

标签: java networking udp datagram

我从我的教授那里得知,使用UDP套接字发送的数据报包在较低层中被分段,可能在接收端以多个包的形式到达。例如,如果我在数据报包中发送1000字节数据,则在接收端可能到达,比如说2个字节,500个字节,12个字节,依此类推。因此,他建议多次接收(...)接收发送方发送的整个1000字节的数据包。

后来当我浏览数据报套接字接收(...)的Java文档时,有一行读取如下:“此方法阻塞,直到收到数据报。...”这是否意味着整个数据报我们使用Java时收到数据包并且不需要进行多次接收(即使理论上是这种情况)?

PLS。澄清。如果每个数据包的多次接收(...)是解决此问题的唯一选择,请参阅。提出如何做到这一点的建议。

1 个答案:

答案 0 :(得分:4)

receive()的任何调用都会给你一个完整的数据包 - 片段处理发生在套接字下面的两层。碎片和碎片整理发生在网络/ Internet层(IP)中,因此套接字永远不会看到碎片,只接收完整和完整的UDP / TCP数据包(只有完整的数据包才会被发送到监听端口)。

所以,不,你不需要多个receive()来获取单个数据包,但你应该知道UDP不可靠,所以如果一个片段在网络层中丢失(在某些情况下,如果它到达无序),你将无法获得数据包。

如果您在接收数据包时遇到问题,可能还需要检查方法getReceiveBufferSize()setReceiveBufferSize() - 如果缓冲区大小小于数据包大小,则无法保证您可以接收数据包分组。