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

5
为什么UDP数据包中有两个“UDP长度”字段?这是否多余?如果需要某种错误检查,请提供示例。

有趣的相关问题 https://dev59.com/oHRC5IYBdhLWcg3wROpQ - Floris
2个回答

6
你的观察是正确的。长度字段是多余的,因为IP头和UDP头都有一个长度字段。我唯一猜测这种冗余存在的原因是,UDP是在一个还不清楚IP协议套件会是什么样子的时候设计的。
所有合法的UDP数据包应该有一个与IP头中的长度字段完全匹配的长度字段。如果你不这样做,你就无法确定接收者将对数据包做什么。
在互联网上看到了长度字段不一致的UDP数据包。我猜它们正在探测缓冲区溢出,如果一个长度字段用于分配内存,而另一个长度字段在将数据复制到已分配的缓冲区时使用,那么可能会发生这种情况。
在较新的UDP Lite协议中,长度字段已被重新用途。UDP Lite头中的长度字段并不表示数据包中有多少数据,而是表示校验和覆盖了其中多少数据。UDP Lite数据包中的数据长度总是从IP头中的长度字段计算得出。这是UDP和UDP Lite头格式之间唯一的区别。

这不是原问题所关注的。它询问用于校验和计算的IP伪头,与IP长度无关。 - Shachar Shemesh

0

来自RFC 768

长度是用户数据报的八位字节长度,包括此头和数据。(这意味着长度的最小值为八。)

伪头概念上放在UDP头之前,包含源地址、目标地址、协议和UDP长度。这些信息提供了对错误路由数据报的保护。此校验过程与TCP中所用相同。

              0      7 8     15 16    23 24    31
             +--------+--------+--------+--------+
             |          source address           |
             +--------+--------+--------+--------+
             |        destination address        |
             +--------+--------+--------+--------+
             |  zero  |protocol|   UDP length    |
             +--------+--------+--------+--------+

真正的答案是这是一个“伪头” - 也就是说,它用于计算校验和,但实际上并没有发送。至少这是我从UDP/TCP中使用伪头的意义是什么中得出的结论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接