【问题标题】:Does Java's UDP API only receive packets with correct checksum?Java 的 UDP API 是否只接收具有正确校验和的数据包?
【发布时间】:2015-02-23 22:23:09
【问题描述】:

我是 UDP 和 Java 的 UDP API 的新手,我知道数据包到达时可能已损坏、被 IP 分割或以任何其他方式出错。当然,如果这样的包分流到达,UDP头中的校验和就不对了。

在Java中读取像DatagramSocket.receive(DatagramPacket)这样的UDP数据包时,是否保证接收到的数据包的内容是正确的(意味着计算的校验和是正确的)?还是 Java 也会将损坏的 UDP 数据包传递给应用程序?

【问题讨论】:

  • 与Java无关。 操作系统不会将损坏的数据包传递给 JVM。
  • @EJP 所以如果我收到一个数据包,我可以确定它的内容是完整的并且没有损坏?
  • 您可以确定它通过了 IPv4 标头校验和、UDP 校验和(如果通过以太网传输,还有以太网校验和)。校验和仍然有一个非零值,但如果发生损坏,报告误报的可能性非常、非常

标签: java c sockets networking udp


【解决方案1】:

简答:

是的,除非另有配置。

长答案:

Udp 数据包包括您的操作系统使用的CHECKSUM 正在为您验证数据包。当收到校验和错误的数据包时,操作系统堆栈会丢弃(在到达应用层之前)。

我从未尝试过,但在 Ubuntu 中可以使用

禁用校验和
ethtool --offload eth0 rx off

【讨论】:

    【解决方案2】:

    来自IETF RFC 5405 section 3.4,我引用:

    [...] 应用程序开发人员应该在数据完整性很重要的地方实施额外的检查 [...]

    现在,数据完整性对您的应用程序有多重要,以及您如何重视大写字母中的“应该”,这取决于您。

    换句话说:

    • 根据定义,UDP 数据包数据的完整性得到保证。
    • 根据规范,应用层不保证 UDP 数据包数据的完整性。

    因此,通过在网络层实现,接收到的 UDP 数据包数据的完整性在应用层仍然不清楚。

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多