那些数据包会消失吗?还是他们等待目的地?或者数据包返回然后抛出异常?
在java中,DatagramPacket构造函数中的byte []缓冲区与长度有什么区别?
DatagramPacket dp = new DatagramPacket(new byte[...], length);
那些数据包会消失吗?还是他们等待目的地?或者数据包返回然后抛出异常?
在java中,DatagramPacket构造函数中的byte []缓冲区与长度有什么区别?
DatagramPacket dp = new DatagramPacket(new byte[...], length);
来自维基百科:
UDP is... Unreliable – 发送消息时,无法知道它是否会到达目的地;它可能会在途中迷路。没有确认、重传或超时的概念。
即使目的地在线,也不能保证UDP数据包会到达,按照发送的顺序到达,或者不被分片。(我相信小于 532 字节的数据包不会被分片)这三个都有可能;对于同一个数据包,碎片化、乱序和不完整。
网络的简单性和稳定性将决定 UDP 数据包传输的稳健程度,但您必须假设它至少在某些时候是不可靠的。你所能做的就是尽量减少损失。
如果数据包丢失以及如何检测它,您可以决定如何处理。
如果您想要广播、可靠地传递消息,我建议您查看 JMS 主题或队列,例如 ActiveMQ。
如果使用 UDP 协议,你不能保证你的数据包会被接收。所以答案是,它会被发送,即使它的目的地不在线。
TCP协议,它保证客户会收到数据包。即使他离线,一旦他上线,就会收到该数据包。
那些数据包会消失吗?还是他们等待目的地?或者数据包返回然后抛出异常?
会发生什么取决于“离线”状态的性质。
如果 UDP 消息到达主机,但应用程序没有监听,它通常会被静默丢弃。它绝对不会排队等待应用程序监听。(那将毫无意义,并且有潜在危险。)
如果 UDP 消息由于主机本身离线而无法到达主机,则该消息将被静默丢弃。(如果数据包可以到达目标主机的本地网络,那么除了主机本身之外,没有任何东西可以判断主机是否真的收到了数据包。)
如果网络不知道如何将 IP 数据包路由到 UDP 服务器(以及其他一些情况),则可能会向发送者发送 ICMP“目标不可达”数据包,并且通常会报告为 Java 异常。但是,这不能保证。所以可能的结果是:
UDP 数据包是黑洞,发送者没有得到任何指示,或者
UDP 数据包是黑洞,发送方收到 Java 异常。
如果 UDP 数据包被防火墙阻止,则行为难以预测。(防火墙在响应不需要的流量时经常“撒谎”。)
您期望 UDP 流量排队的唯一情况是当网络正常工作、主机正常工作且应用程序正在侦听时。如果应用程序接受数据包的速度很慢,则可以进行有限排队;receive
即在数据报套接字上的连续调用之间花费的时间太长。但即使在那里,排队/缓冲也受到严格限制,除此之外,消息将被丢弃。