Java的UDP API是否只接收具有正确校验和的数据包?

时间:2014-12-26 17:23:18

标签: java c sockets networking udp

我是UDP和Java的UDP API的新手,我知道数据包可能会被IP损坏,被IP分割或以其他任何方式出错。当然,如果这样的数据包到达分裂,UDP标头中的校验和将不正确。

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

2 个答案:

答案 0 :(得分:1)

简答:

是的,除非另有配置。

答案很长:

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

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

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

答案 1 :(得分:0)

IETF RFC 5405 section 3.4中,我引用:

  

[...]应用程序开发人员应该在数据完整性很重要的地方进行附加检查[...]

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

换句话说:

  • 通过定义,可以确保UDP数据包数据的完整性。
  • 根据规范,应用程序层中不能保证UDP数据包的完整性。

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

相关问题