Why does UDP have the field "UDP Length" twice in its packet? Isn't it redundant? If it is required for some kind of error checking, please provide an example.
3 回答
你的观察是正确的。长度字段是多余的,因为 IP 头和 UDP 头都有一个长度字段。我对这种冗余原因的唯一猜测是,它的发生是因为 UDP 是在某个时候设计的,当时还不清楚 IP 协议套件会是什么样子。
所有合法的 UDP 数据包都应该有一个长度字段,该字段与从 IP 标头中的长度字段得出的值完全匹配。如果你不这样做,你就无法确定接收者将如何处理数据包。
具有不一致长度字段的 UDP 数据包在 Internet 上随处可见。我猜他们正在探测缓冲区溢出,如果一个长度字段用于分配内存而另一个长度字段用于将数据复制到分配的缓冲区时,可能会发生这种情况。
在较新的 UDP Lite 协议中,长度字段已被重新利用。UDP Lite 标头中的长度字段并不表示数据包中有多少数据,而是表示校验和已覆盖了多少数据。UDP Lite 数据包中的数据长度总是根据 IP 标头中的长度字段计算得出。这是 UDP 和 UDP Lite 标头格式之间的唯一区别。
来自RFC 768:
长度是这个用户数据报的八位字节长度,包括这个头和数据。(这意味着长度的最小值是八。)
概念上以 UDP 报头为前缀的伪报头包含源地址、目的地址、协议和 UDP 长度。 此信息可防止错误路由的数据报。此校验和过程与 TCP 中使用的相同。
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+
真正的答案是这是一个“伪标头”——也就是说,它用于计算校验和,但并未实际发送。至少这是我从UDP/TCP 中使用的伪标头的意义是什么得出的结论
我不知道它在哪里出现了两次,udp 标头中只有一个“udp 长度”字段。