0

那些数据包会消失吗?还是他们等待目的地?或者数据包返回然后抛出异常?

在java中,DatagramPacket构造函数中的byte []缓冲区与长度有什么区别?

DatagramPacket dp = new DatagramPacket(new byte[...], length);
4

4 回答 4

3

来自维基百科

UDP is... Unreliable – 发送消息时,无法知道它是否会到达目的地;它可能会在途中迷路。没有确认、重传或超时的概念。

于 2011-01-03T17:32:15.193 回答
1

即使目的地在线,也不能保证UDP数据包会到达,按照发送的顺序到达,或者不被分片。(我相信小于 532 字节的数据包不会被分片)这三个都有可能;对于同一个数据包,碎片化、乱序和不完整。

网络的简单性和稳定性将决定 UDP 数据包传输的稳健程度,但您必须假设它至少在某些时候是不可靠的。你所能做的就是尽量减少损失。

如果数据包丢失以及如何检测它,您可以决定如何处理。

如果您想要广播、可靠地传递消息,我建议您查看 JMS 主题或队列,例如 ActiveMQ。

于 2011-01-03T17:41:34.023 回答
0

如果使用 UDP 协议,你不能保证你的数据包会被接收。所以答案是,它会被发送,即使它的目的地不在线。

TCP协议,它保证客户会收到数据包。即使他离线,一旦他上线,就会收到该数据包。

于 2011-01-03T19:05:01.600 回答
0

那些数据包会消失吗?还是他们等待目的地?或者数据包返回然后抛出异常?

会发生什么取决于“离线”状态的性质。

  • 如果 UDP 消息到达主机,但应用程序没有监听,它通常会被静默丢弃。它绝对不会排队等待应用程序监听。(那将毫无意义,并且有潜在危险。)

  • 如果 UDP 消息由于主机本身离线而无法到达主机,则该消息将被静默丢弃。(如果数据包可以到达目标主机的本地网络,那么除了主机本身之外,没有任何东西可以判断主机是否真的收到了数据包。)

  • 如果网络不知道如何将 IP 数据包路由到 UDP 服务器(以及其他一些情况),则可能会向发送者发送 ICMP“目标不可达”数据包,并且通常会报告为 Java 异常。但是,这不能保证。所以可能的结果是:

    • UDP 数据包是黑洞,发送者没有得到任何指示,或者

    • UDP 数据包是黑洞,发送方收到 Java 异常。

  • 如果 UDP 数据包被防火墙阻止,则行为难以预测。(防火墙在响应不需要的流量时经常“撒谎”。)

您期望 UDP 流量排队的唯一情况是当网络正常工作、主机正常工作且应用程序正在侦听时。如果应用程序接受数据包的速度很慢,则可以进行有限排队;receive即在数据报套接字上的连续调用之间花费的时间太长。但即使在那里,排队/缓冲也受到严格限制,除此之外,消息将被丢弃。

于 2014-11-09T01:26:47.303 回答