长度标头是否用于指示段的结束?

网络工程 UDP
2022-02-26 23:41:07

我正在阅读一本教科书,上面写着 UDP 需要长度标头: 在此处输入图像描述

长度字段指定 UDP 段中的字节数(标头加数据)。需要一个明确的长度值,因为数据字段的大小可能从一个 UDP 段到下一个段不同。

所以我的问题是:

长度标头是否用于指示段的结束?

如果答案是肯定的,那么为什么我们不能使用特殊的位模式来指示段的结束呢?

3个回答

长度标头是否用于指示段的结束?

“段”是 UDP 的错误术语,因为它表明它是最终重新组装的更大事物的一部分。UDP 具有数据报或消息的概念,应将此类数据报视为单独的实体。这意味着它们可能会丢失、重复或重新排序,并且 UDP 没有定义在这种情况下会发生什么。处理这个取决于应用程序。

...那为什么我们不能使用特殊的位模式来指示段的结束呢?

与仅在数据前面加上其长度相比,这将更加复杂和耗时。这意味着需要引入一种机制来转义意外匹配位模式的数据,或者将所有数据编码为 base64 之类的东西(与纯二进制相比,这是一种空间浪费)。这也意味着主动扫描整个有效负载的位模式并重写所有被转义的内容或(在 base64 的情况下)再次解码数据。

这只是最初指定 UDP 的方式。

只要低层协议可以确定数据包的长度,它就可以在标头中没有长度字段的情况下工作。这就是 TCP 能够在没有内置长度字段的情况下工作的原因。UDP 本来可以这样设计的;事实并非如此。

另一个没有提到的方面是数据字段的 32 位对齐:与其他三个 16 位标头字段相比,UDP 标头不会是 IETF 旨在加快处理速度的 32 位字的倍数在 32 位系统上。(实际上是冗余的)长度字段可能被插入以用有用的东西填充原本保留的 16 位。

请注意与没有长度标头字段的 TCP 的区别,可能出于完全相同的原因。(对于 TCP,段长度来自 IP 标头长度字段,UDP 也可以使用它。)