假设我正在接收有效载荷小于 18 个八位字节的 IPv4 UDP 数据包,因此当它们通过以太网传输时,它们有一些尾随填充。在数据包的源和我的接收器之间有一个自定义设备,除其他外,它会修改 IP 标头,以便其总长度字段将包括以太网填充。因此,例如,具有 7 个八位字节长的有效载荷的数据包的 IP 总长度不会是 35,而是 46。这是错误的行为,但我无法摆脱设备或修改它,所以我必须处理它。
小问题:我是否正确理解根据RFC 894,这样的数据包一开始就被认为是无效的?
无论如何,Windows 和 Linux 都不会丢弃此类数据包,因此询问如何为它们计算 UDP 校验和是有意义的。
如果我正确理解RFC 768,则伪标头中的长度应该是 UDP 长度,因此 15 表示 7 个八位字节长的有效负载 - 就像实际 UDP 标头中的长度字段一样。这也是 Wireshark 的 UDP 解析器所做的。
另一方面,Windows 和 Linux 的网络堆栈都做了其他事情。当他们验证校验和时,他们将伪标头的长度设置为 IP 标头的总长度减去其大小。对于普通数据包,这与 UDP 标头中的长度字段的净值相同,因此没关系。但是,对于我的数据包,结果显然不同。
谁有错?这是 Wireshark 和我对RFC 768的理解中的错误吗?它是 Windows/Linux 中的错误吗?这个问题是否没有实际意义,因为这些数据包一开始就是非法的,在这种情况下,Wireshark 应该将它们标记为这样,而 Windows/Linux 无论如何都应该丢弃它们?