全文概要
我们在学习TCP/IP协议时都知道,TCP报文段如果很长的话,会在发送时发生分段(Segmentation),在接收时进行重组,同样IP数据报在长度超过一定值时也会发生分片(Fragmentation),在接收端再将分片重组。如果之前你和曾经的我一样,经常混淆这两个概念,甚至一度以为两者表示的是同一个协议栈机制,那么本文就将通过详细介绍分段与分片的区别与联系,力图让你对此有一个更为完整、严谨的理解。
背景
首先需要强调的一点是,不管你之前从什么渠道获取了关于分段/分片方面的知识,甚至会觉得两者只是叫法不同但实际意思相同,但在本文中,
分段特指发生在使用TCP协议的传输层中的数据切分行为 分片特指发生在使用IPv4协议的网络IP层中的数据切分行为
这一点在文章标题中已经表达得十分明显。
正如上文所述,分段与分片发生在协议栈的不同层次,但目的都一样:
都是为了能够传输上层交付的、数据量超过本层传输能力上限的数据, 不得已才做的数据切分。
注意到这里我用了修饰词,“不得已” — 也就是说在正常情况尽量避免做数据切分,能不分就不分,而只有在特殊场景下才不得不这么做。
这么形容显然是有原因的,最起码有以下两点解释:
- 数据切分对于协议栈而言,显然使处理逻辑变得更加复杂了,在发送端需要做切分,甚至在路径中的转发设备中也需要切分(后文会介绍这种情况),在接收端又要做重组,处理开销明显增大,对设备的处理能力提出更高的要求;
- 在切分过程过不可避免的要为每个数据分片增加必要的协议首部以完成网络传输,在首部中还需要携带必要的顺序、偏移、是否属于同一块大数据等元信息来帮助组装。
上述额外的空间开销在没有分片的情况下,显然是不需要的,发一块收一块即可,为了传输该数据包仅为其添加协议栈各层首部各一份,更无须设置用于组装的各种元数据,不论是发送还是接收的处理逻辑都更加简单。所以,能不切分就不切分,毫无疑问是正确的。
到此为止,关于数据切分技术出现的背景,包括其必要性和弊端都应该算是比较清晰了。
回到文章主题,前文有提到分段和分片工作在不同协议层,这其实很容易会造成一些疑惑,这些疑惑也一度伴随着我,