我是UDP和Java的UDP API的新手,我知道数据包可能会被IP损坏,被IP分割或以其他任何方式出错。当然,如果这样的数据包到达分裂,UDP标头中的校验和将不正确。
当用DatagramSocket.receive(DatagramPacket)
这样的Java读取UDP数据包时,是否保证接收到的数据包的内容是正确的(意味着计算的校验和是正确的)?或者Java还会将损坏的UDP数据包传递给应用程序吗?
答案 0 :(得分:1)
简答:
是的,除非另有配置。
答案很长:
您的操作系统使用的Udp数据包包括CHECKSUM正在为您验证数据包。当接收到具有错误校验和的数据包时,OS栈将丢弃(在到达应用程序层之前)。
我从未尝试过,但在Ubuntu中可以使用
禁用校验和ethtool --offload eth0 rx off
答案 1 :(得分:0)
在IETF RFC 5405 section 3.4中,我引用:
[...]应用程序开发人员应该在数据完整性很重要的地方进行附加检查[...]
现在,数据完整性对您的应用程序有多重要,以及如何以大写字母表示“ SHOULD”,这取决于您。
换句话说:
因此,通过在网络层中实现,在应用层中仍不清楚接收到的UDP数据包数据的完整性。