1、TCP首部
在文章最前,不妨先回忆一下TCP报文的首部格式:
一切都是那么熟悉,再看一眼标题,咦?怎么没有报文长度字段?
2、寻找长度字段
在我们印象中,很多协议的首部都需要告知报文的长度(或数据字段长度),以使得接收端可以知道数据字段截至哪里,这在网络传输纷乱的比特流中是十分重要的。
那为什么TCP首部没有长度字段呢?
实际上,TCP并非没有长度字段,而是长度字段隐藏在了IP报中。
再看一眼加上了IP首部的TCP报文:
是不是有点感觉了?在IP数据报首部中,包含了IP数据报的总长度以及IP数据报自身的首部长度。
那么,我们可以得出
3、咦?那为什么UDP首部有长度字段
我们再回看一下UDP报文的首部格式:
按照先前的理论,UDP报文载荷字段可以这样算:
而从Steven,W.R的<*TCP/IP Illustrated Volume 1 >*中,可以找到这段话:
这也证明了我们的猜想。
而事实上,在后来的部分协议中,也的确取消了UDP报文首部的长度字段,如 The Lightweight User Datagram Protocol (UDP-Lite)
在协议中,也明确地指出了UDP报文首部的长度字段可以通过我们上面举的公式计算:
在其报文首部中,将UDP报文首部的长度字段换为了参与计算校验和的字节数:
4、为什么TCP首部无长度字段 而 UDP报文首部有长度字段?
这个问题没有确切的答案,参考知乎上的回答:
如今的UDP协议是基于IP协议发展的,而当年可能并非如此,依赖的可能是别的不提供自身报文长度或首部长度的网络层协议,因此UDP报文首部需要有长度字段以供计算。
完结撒花~