外观
载荷超标怎么办?IP 报文如何“切片过闸”并在终点完整还原?
在现实生活中,如果一辆载货卡车的高度超过了桥梁隧道的“限高杆”,就必须在入闸前把货物卸下来分装到几辆小型轻卡上通过。
在计算机网络中也有完全相同的机制:不同的物理链路技术(以太网、PPP、Wi-Fi 等)能够承载的最大单帧容量是有限的。如果网络层送来一个 4000 字节的 IP 报文,而以太网单帧最大载荷只有 1500 字节,网络设备该如何处理?这就是 最大传输单元(MTU) 与 IP 分片 必须解决的核心课题。
学完本课后,你将能够:
- 清晰区分 MTU(最大传输单元)与 MSS(最大段大小)的概念与默认边界。
- 掌握 IP 分片三大核心字段的计算法则:标识符(ID)、标志位(DF / MF)以及片偏移(Fragment Offset,必须以 8 字节为刻度单位)。
- 解释 为什么网络中间的路由器只负责切片、绝不负责在内存中重组。
- 剖析 路径 MTU 发现(PMTUD)的工作流程,以及为什么 IPv6 彻底废黜了路由器分片机制。
1. 什么是 MTU?为什么会有 MTU 限制?
最大传输单元(MTU)(Maximum Transmission Unit,最大传输单元),指的是数据链路层在一条物理信道上能够承载的数据载荷的最大字节数(即不包含以太网帧头 14 字节和 FCS 4 字节的纯载荷部分)。
- 标准以太网的 MTU 默认是 1500 字节。
- 这意味着:封装在标准以太网帧里面的 IP 报文(包含 IP 首部 + IP 载荷),其总长度绝对不能超过 1500 字节。
为什么不能把 MTU 设成无限大?
- 线路独占与延迟:如果允许单帧长达数兆字节,慢速链路就会被一个大报文长时间霸占,导致其他关键交互包(如语音通话、鼠标按键)发生严重排队抖动。
- 传输误码重传成本:在不可靠信道上,帧越长,碰上电磁干扰导致 CRC 校验失败的概率越高。如果帧很大,丢一个比特就要重传整整几兆数据,传输效率反而暴跌。
2. IP 分片的三大核心字段(回头看首部)
在第 16 课 · IPv4 报文格式中,我们学到 IPv4 首部第 4 到第 7 字节正是专门为分片设计的:
text
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification (标识符) |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+1. 标识符(Identification,16 bit)
- 发送端主机为每一个发送的原始 IP 数据报分配一个唯一的计数器 ID(例如
777)。 - 同一个原始报文切出来的所有分片,首部中的 ID 都完全相同! 接收端就是凭借相同的 ID 将属于同一批的散件分片归纳到一起。
2. 标志位(Flags,3 bit)
- 保留位:第一位必须为 0。
- DF(Don't Fragment,不分片位):
DF = 1:命令沿途路由器“禁止对此报文分片”。如果路由器发现出接口 MTU 小于该报文长度,因无法转发只能直接丢弃,并回送 ICMP 报错。DF = 0:允许路由器对报文进行切片。
- MF(More Fragments,更多分片位):
MF = 1:告诉接收端“这只是其中一片,后面还有后续分片”。MF = 0:告诉接收端“这是该原始大报文的最后一片”。
3. 片偏移(Fragment Offset,13 bit)
- 标识当前分片的数据载荷相对于原始未分片数据载荷起点的相对位置。
- 极高频考点:片偏移字段只有 13 位,无法直接表达 65535 字节的偏移量。因此协议规定:片偏移必须以 8 个字节(8-octet)为一个计数单位!
- 这意味着:除最后一片外,每一个分片的数据载荷长度必须是 8 的整数倍!
3. 实战算例:4000 字节大报文如何分片?
假设主机 A 产生了一个总长为 4000 字节的 IPv4 报文(20 字节固定首部 + 3980 字节数据载荷),发送到一个 MTU = 1500 字节的以太网链路中。
第一片:
- 出接口 MTU = 1500 字节。
- 扣除分片自带的 20 字节 IP 首部,最大可容纳数据:
字节(1480 是 8 的倍数: )。 - 数据范围:字节 0 ~ 1479(共 1480 字节)。
- 字段取值:
Total Length = 1500,MF = 1,Offset = 0 / 8 = 0。
第二片:
- 剩余载荷:
字节。 - 再切出最大容纳量 1480 字节载荷。
- 数据范围:字节 1480 ~ 2959(共 1480 字节)。
- 字段取值:
Total Length = 1500,MF = 1,Offset = 1480 / 8 = 185。
第三片(尾片):
- 剩余载荷:
字节。 - 1020 字节加上 20 字节 IP 首部等于 1040 字节,小于 1500 字节,无需再切。
- 数据范围:字节 2960 ~ 3979(共 1020 字节)。
- 字段取值:
Total Length = 1040,MF = 0(最后一片),Offset = 2960 / 8 = 370。
4. 关键认知:为什么中间路由器绝不负责重组?
很多初学者容易产生一个直觉误区:“既然路由器可以切分数据包,那下一跳如果有更大 MTU 的链路,路由器会不会在内存里把分片拼好再发?”
答案是:绝对不会!分片的重组只能由最终目的端主机完成!
原因有两个根本性瓶颈:
- 路由路径不对称性:IP 网络是动态无连接的。分片 1 可能走了路径 A,分片 2 可能走了路径 B,中间某台路由器根本不可能等到同一个报文的所有分片!
- 路由器性能崩塌:路由器是整个互联网的交通骨干,每秒要吞吐千万级别的数据包。如果在内存中开辟海量缓冲区等待分片拼图,只要一个分片延迟,路由器的内存就会被撑爆,极易被 DoS 拒绝服务攻击瘫痪。
分片的致命代价:木桶效应
只要 3 个分片中有任意 1 个分片在网络中遭遇丢包或 CRC 校验错,目的端就无法在超时时间内拼出完整的原始报文,导致所有已收到的分片全部作废丢弃!这会引发严重的网络性能恶化。
5. 路径 MTU 发现(PMTUD)与 IPv6 的革新
为了彻底摆脱分片带来的性能损耗与风险,现代网络协议栈引入了 路径 MTU 发现(Path MTU Discovery, PMTUD):
- 源主机发送数据包时,主动将 IP 首部中的
DF = 1(禁止分片)。 - 数据包在沿途遇到某条 MTU 较小的链路时,路由器无法分片,只能丢弃,并向源主机回送 ICMP Type 3, Code 4(需要分片但设置了 DF 标志),并在 ICMP 差错报文中附带本接口的 MTU 大小(Next-Hop MTU)。
- 源主机收到通知后,主动减小下一次发送数据报文的尺寸,直到数据包能够一路畅通无阻到达对端。
华为 ICT 大赛核心考点:IPv6 完全废黜路由器分片
在下一代互联网协议 IPv6 中,规范做出了一项极其重大的变革:中间路由器被彻底剥夺了分片的权力!
- 如果路由器收到的 IPv6 报文大于出接口 MTU,路由器直接丢弃并回送 ICMPv6 Packet Too Big 报文。
- 在 IPv6 中,分片只能由源端主机在发起前完成(通过在 IPv6 基本首部后附加专门的“分片扩展首部”)。
6. 课后核心测验
7. 下一步学习
理解了 IPv4 的 MTU、分片机制及其历史包袱之后,我们自然要走向下一代互联网的大门——IPv6。
IPv6 不仅将地址长度从 32 位扩充到了 128 位,还彻底用全新的**邻居发现协议(NDP)**取代了陈旧的 ARP 广播。
下一课,让我们正式进入:第 21 课 · IPv6 基础、无状态自动配置与 NDP 协议。