【问题标题】:Where did datagram packet go when their destination is offline?当目的地离线时,数据报包去了哪里?
【发布时间】:2011-01-03 17:27:13
【问题描述】:

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

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

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

【问题讨论】:

  • 数据报不是一个定义明确的术语——你的意思是 UDP/IP 数据包吗?另外,为什么这被标记为“java”?你有一些你遇到问题的java代码吗?如果有,请发布。
  • “离线”是什么意思?应用程序没有运行?电脑关机了?没有连接到互联网?
  • 所有这些,psmears 哦,对不起,是的,对不起,我用 java 标记了它,因为我还在学习 java 教程,是的,我的意思是 UDP 数据包

标签: java networking udp datagram


【解决方案1】:

来自Wikipedia

UDP is... Unreliable – 当一个消息 已发送,不知道是否会发送 到达目的地;它可以得到 途中迷路了。没有 承认的概念, 重传或超时。

【讨论】:

  • 确实如此,但在数据包误入歧途的许多情况下,将会有一个 ICMP 数据包被发回(通常是“无法到达”的情况之一,但如果出现问题,也可能会“超时”是路由问题)。良好的 IP 堆栈可以通知客户端应用程序此状态 - 例如,这是一些探测工具可以判断 UDP 端口是否打开的方式。
【解决方案2】:

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

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

如果数据包丢失该怎么办以及如何检测它,由您决定。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • TCP 无法保证网络中断时的传送。它将保证在正常操作期间交付,而 UDP 不这样做。它会让发送者知道连接失败,尽管它不会确切说明收到了哪些数据。
    • 好吧,我的老师欠我一个解释……谢谢@Peter Lawrey
    【解决方案4】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2014-06-19
      • 1970-01-01
      相关资源
      最近更新 更多