Neh*_*ani 3 networking udp network-protocols
为什么 UDP 在其数据包中有两次“UDP 长度”字段?不是多余的吗?如果需要进行某种错误检查,请提供示例。
小智 5
你的观察是正确的。长度字段是多余的,因为 IP 报头和 UDP 报头都有一个长度字段。对于这种冗余的原因,我唯一的猜测是,它发生是因为 UDP 是在某个时候设计的,当时还不清楚 IP 协议套件会是什么样子。
所有合法的 UDP 数据包都应该有一个长度字段,它与从 IP 报头中的长度字段得出的内容完全匹配。如果您不这样做,您就无法确定接收方将如何处理数据包。
具有不一致长度字段的 UDP 数据包在 Internet 上随处可见。我猜他们正在探测缓冲区溢出,如果一个长度字段用于分配内存,而在将数据复制到分配的缓冲区时使用另一个长度字段,则可能会发生这种情况。
在较新的 UDP Lite 协议中,长度字段已被重新利用。UDP Lite 报头中的长度字段并不表示数据包中有多少数据,而是表示校验和覆盖了多少数据。UDP Lite 数据包中的数据长度始终根据 IP 标头中的长度字段计算得出。这是 UDP 和 UDP Lite 标头格式之间的唯一区别。
来自RFC 768:
长度是该用户数据报的八位字节长度,包括该标头和数据。(这意味着长度的最小值为 8。)
从概念上讲,伪标头是 UDP 标头的前缀,其中包含源地址、目标地址、协议和 UDP 长度。 该信息可以防止数据报被错误路由。该校验和过程与 TCP 中使用的相同。
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+
Run Code Online (Sandbox Code Playgroud)
真正的答案是,这是一个“伪标头” - 也就是说,它用于计算校验和,但实际上并未发送。至少这是我从 UDP/TCP 中使用的伪标头的意义是什么中得出的结论
| 归档时间: |
|
| 查看次数: |
3869 次 |
| 最近记录: |