面试官:说说为什么TCP首部没有长度字段?

435 阅读2分钟

1、TCP首部

在文章最前,不妨先回忆一下TCP报文的首部格式:

image.png

一切都是那么熟悉,再看一眼标题,咦?怎么没有报文长度字段?

2、寻找长度字段

在我们印象中,很多协议的首部都需要告知报文的长度(或数据字段长度),以使得接收端可以知道数据字段截至哪里,这在网络传输纷乱的比特流中是十分重要的。

那为什么TCP首部没有长度字段呢?

实际上,TCP并非没有长度字段,而是长度字段隐藏在了IP报中。

再看一眼加上了IP首部的TCP报文:

image.png

是不是有点感觉了?在IP数据报首部中,包含了IP数据报的总长度以及IP数据报自身的首部长度。

那么,我们可以得出

TCP载荷字段长度=TCP载荷字段长度=
IP数据报字段总长度IP数据报首部长度TCP报文首部长度(数据偏移)IP数据报字段总长度-IP数据报首部长度-TCP报文首部长度(数据偏移)

3、咦?那为什么UDP首部有长度字段

我们再回看一下UDP报文的首部格式:

image.png

按照先前的理论,UDP报文载荷字段可以这样算:

UDP载荷字段长度=UDP载荷字段长度=
IP数据报字段总长度IP数据报首部长度UDP报文首部长度(恒为8IP数据报字段总长度-IP数据报首部长度-UDP报文首部长度(恒为8)

而从Steven,W.R的<*TCP/IP Illustrated Volume 1 >*中,可以找到这段话:

image.png

这也证明了我们的猜想。

而事实上,在后来的部分协议中,也的确取消了UDP报文首部的长度字段,如 The Lightweight User Datagram Protocol (UDP-Lite)

在协议中,也明确地指出了UDP报文首部的长度字段可以通过我们上面举的公式计算:

无标题.png

在其报文首部中,将UDP报文首部的长度字段换为了参与计算校验和的字节数:

image.png

4、为什么TCP首部无长度字段 而 UDP报文首部有长度字段?

这个问题没有确切的答案,参考知乎上的回答:

image.png 如今的UDP协议是基于IP协议发展的,而当年可能并非如此,依赖的可能是别的不提供自身报文长度或首部长度的网络层协议,因此UDP报文首部需要有长度字段以供计算。

完结撒花~

参考:为什么UDP需要有长度字段,而TCP不需要长度字段呢?