报文、帧、分组、段、数据包,这些术语是同一个东西吗?

报文

是一种相对宽泛和通用的说法,基本上每一层都可以用。

比如,在应用层,你可以说“HTTP报文”;  

在传输层,你可以说“TCP报文”;  

同样的,在网络层,当然就是“IP报文了”。  

事实上,网络层也是“报文”一词被使用最多的场景了。  

数据包也是类似的,可以在很多场景下通用。  

我们再稍微考究一下语法。packet这个词的后缀是et。

而在英文中,以et结尾的很多词 表示某一个小小的东西。

比如功能完备的一小段代码,叫 code snippet,一小段内嵌在html 中的java前端代码,叫applet。

自然的,packet就是一个小的pack(包裹)。

然而,另外几个术语在用的时候,就需要讲究一点了,因为它们并不是通用词,而是特定 层的专有词汇。

帧(frame)

是二层也就是数据链路层的概念,代表了二层报文,它包含帧头、载荷、帧尾。

注意,帧是有尾部的,而其他像 IP、TCP、HTTP 等层级的报文,都没有尾部。我们

不可以说“TCP 帧”或者“IP 帧”,虽然也许对方也明白你的意思,但我们都想做得专业一点,不是嘛。

这里还有个小知识点:HTTP/2 实现了多路复用,其中也有帧的概念,

不过那个帧,跟这里网络二层的帧,除了名称相同以外,就没有别的联系了。

分组是 IP 层报文,也就是狭义的 packet。

段特指 TCP segment,也就是 TCP 报文。

既然 segment 是“部分”的意思,那这个“整体”又是什么呢?它就是在应用层交付给传输层的消息(message)。

当 message被交付给传输层时,如果这个 message 的原始尺寸,

超出了传输层数据单元的限制(比如超出了 TCP 的 MSS),

它就会被划分为多个 segment。

这个过程就是分段(segmentation),也是 TCP 层的一个很重要的职责。

说到 segmentation,你可能也会想到 fragmentation(分片)。

这俩是同一个东西吗?

这方面的知识点也不少,我在这里就不具体展开了。不过别着急,我会在第 8 讲里,帮你

把这两个东西梳理清楚。

另外,这里还要提一下,Datagram 的中文叫“数据报”,但不是“数据包”。

读音类似,但意思并不完全相同。

前面说过,“数据包”是一个通用词,所以用“UDP 数据包”指代“UDP 数据报”并没有问题。

但反过来,非 UDP 协议的数据包,比如 TCP 段,

就不能叫“TCP 数据报”了,因为 TCP 不是 Datagram。

最后,你可以再来看下这张层级和术语对应关系的示意图:  


请使用浏览器的分享功能分享到微信等