计算机网络拾遗:数据分片
今天在和一个学弟交流的时候,提到超长的UDP报文由谁来分片的问题。当时我认为过长的UDP报文最终会被以太网(链路层协议)分片,这是不对的。
现在考虑五层网络模型:物理层 / 数据链路层 / 网络层 / 传输层 / 应用层。
对于网络层,我们分别考虑应用最广的IPv4和IPv6协议。IPv4协议支持分片,首部DF=0的TCP报文段将可能被中间转发的计算机分片,如果他的下一条链路的MTU小于此报文段长度。
分片是因为链路层通常会要求帧长不能大于某个值。以太网协议没有规定分片,只是规定了以太网帧的最小长度和最大长度。
链路层帧最大有效载荷大小是MTU,以太网是1500 Byte,链路上的这个值需要由 Path MTU Discovery 技术探测到,IPv4支持转发时分片(如果DF=0),而IPv6彻底不允许分片,如果片大于MTU而又不分片的话,IPv4的计算机会返回ICMP消息 Fragmentation Needed,而IPv6的计算机会返回ICMP消息 Too Big。
IPv4协议规定链路层协议至少能处理长度为576 Byte的IPv4报文,IPv6要求是1280 Byte。协议还说明,如果链路层不能处理这么大的IP数据报,那么需要链路层自己实现对于网络层透明的分片-重组链路层协议。