报文
是一种相对宽泛和通用的说法,基本上每一层都可以用。
比如,在应用层,你可以说“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。
最后,你可以再来看下这张层级和术语对应关系的示意图: