首页 文章

处理UDP不可靠性

提问于
浏览
0

我在Java中使用DatagramPacket和DatagramSocket类来发送带有UDP的消息 . 我对网络知识不完整 . 我知道:

  • 当发送数据报时,它实际上可以分成在网络上独立传输的多个数据(例如,如果我的数据报长度大于MTU) .

  • UDP不保证接收时消息的顺序(并且根本不保证接收消息) .

把这些信息放在一起,我“理解”如果我发送一个(大)DatagramPacket,我可能会以任何顺序收到我的数据报的字节(有些部分甚至可能丢失)!但我认为我误解了一些事情,因为如果是这样的话,没有人会使用这样的协议 .

我怎样才能确保收到的数据报(如果我收到的数据报)等于我发送的数据报?

2 回答

  • 1

    将这些信息放在一起,我“理解”如果我发送一个(大)DatagramPacket,我可以按任何顺序接收我的数据报的字节

    没有 .

    (有些部分甚至可能缺失)!

    没有 .

    您将完整地收到UDP数据报,或者完全不收到 .

    但我认为我误解了一些事情,因为如果是这样的话,没有人会使用这样的协议 .

    正确 . 事实并非如此 .

    我如何确保收到的数据报(如果我收到)与我发送的数据报相同?

    它总是如此 . 如果它到了 . 但是它可能会到达零次,一次或多次,并且可能无序到达 .

    通常接受的最大实际UDP数据报大小是534字节的有效载荷 . 您可以保证IP不会在发送方或任何中间主机上对IP进行分段,并且非分段会降低丢包的可能性 . (如果任何片段丢失,数据报将丢失,如@ottomeister所述 . )

    如果序列对您很重要,则需要在数据报中使用序列号 . 这也有助于保护您免受重复,因为您知道您正在使用的序列号,以便您可以发现重复 .

    如果到达对您很重要,则需要基于ACK或NACK的应用程序协议 .

  • 0

    你的理解是不正确的 . 如果您的数据报在发送端通过IP(在UDP层之下)被分成片段,则接收器处的IP将以正确的顺序重新组合这些片段,然后将整个重组数据报传递到接收器的UDP层 . 如果数据报的任何片段丢失,则重组将失败,部分重建的数据报将被丢弃,并且不会将任何内容传递到接收器的UDP层 . 因此,接收UDP - 以及接收应用程序 - 获得完整的数据报或什么都不是 . 它永远不会得到部分数据报,它永远不会得到一个数据报,其内容因碎片而被扰乱 .

    如果传入数据报大于应用程序的接收缓冲区,则可以为接收应用程序提供部分(截断)数据报,但这与碎片无关 .

相关问题