为什么 UDP 在其数据包中有两次“UDP 长度”字段?

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 标头格式之间的唯一区别。


Flo*_*ris 0

来自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 中使用的伪标头的意义是什么中得出的结论