为什么 UDP 在标头中有长度字段而 TCP 没有?
我猜测 TCP 中段的长度是从 IP 标头推断出来的,但是应该能够对 UDP 数据报做同样的事情
为什么 UDP 在标头中有长度字段而 TCP 没有?
我猜测 TCP 中段的长度是从 IP 标头推断出来的,但是应该能够对 UDP 数据报做同样的事情
根据TCP/IP Illustrated Volume 1,长度字段是多余的。这就是史蒂文斯在这件事上所说的一切。
我个人认为这是使 UDP 标头长度(以位为单位)可被 32 整除 :)
在概念上,有一个 96 位的伪标头作为 TCP 标头的前缀,该标头已经包含该信息。
此来源的校验和字段描述给出了答案:
校验和:16 位
校验和字段是标题和文本中所有 16 位字的反码和的 16 位反码。如果一个段包含奇数个要校验和的标题和文本八位字节,则最后一个八位字节在右侧用零填充以形成一个 16 位字用于校验和目的。pad 不作为段的一部分传输。在计算校验和时,校验和字段本身被零替换。
校验和还涵盖概念上以 TCP 标头为前缀的 96 位伪标头。此伪标头包含源地址、目标地址、协议和 TCP 长度。这为 TCP 提供了针对错误路由段的保护。此信息在 Internet 协议中承载,并通过 TCP/网络接口在 IP 上 TCP 调用的参数或结果中传输。
+--------+--------+--------+--------+ | Source Address | +--------+--------+--------+--------+ | Destination Address | +--------+--------+--------+--------+ | zero | PTCL | TCP Length | +--------+--------+--------+--------+
由于 TCP 是基于流的协议,因此 TCP 级别不需要该信息。
这只是最初指定 UDP 的方式。UDP 可以像 TCP 一样在没有长度字段的情况下工作。
TCP中每个段的长度是如何得到的?这实际上取决于具体的实现(OS)。TCP 的 RFC 只是声明:
任何较低级别的协议都必须提供源地址、目标地址和协议字段,以及确定“TCP 长度”的某种方式,[...]