MTU 与分片
复习
- 路由表与最长前缀匹配:多条匹配时选更具体的一条
- IPv4 数据包:首部含长度与 TTL 等字段
- 子网与 CIDR:网络用前缀划分范围
TL;DR
- 每条链路能承载的帧有大小上限,这个上限叫 MTU
- 数据包比 MTU 大时,需要拆成若干分片
- 分片会增加开销,而且丢一片就要重传整包
- 更理想的做法是探测路径 MTU,尽量避免分片
正文
数据包要坐“帧”这趟车穿过各条链路。可不同的链路,能装下的帧大小并不一样。如果包太大,塞不进这一跳的帧,怎么办?
每条路都有个“限高”
每条链路能承载的最大数据量,叫作 MTU(最大传输单元,Maximum Transmission Unit)。
这就像过隧道前的限高牌:车太高,就过不去。不同链路(以太网、无线、各种广域网)限高各不相同,一个包在网络里传,可能要经过限高更低的某一段。
拆开来过
包比 MTU 大时,解决办法是分片(fragmentation):把原始数据拆成几块,每块加上自己的首部,分别装进独立的帧发出去。到了目的地,再由接收方把这些分片重组成原来的包。
注意,重组通常只在最终目的地进行,中途的路由器不会去拼装——这样每台路由器都能轻装上阵。
但分片是有代价的:
- 每个分片都要额外带一份首部,开销变大
- 只要任何一个分片丢失,整个包都无法重组,必须全部重传
所以分片不是免费的午餐,它是“过大不得不拆”时的补救。
能不分,就不分
既然分片这么麻烦,现代网络更倾向于避免分片。
一种办法是路径 MTU 发现:发送方先试探这条路上最小的 MTU 是多少,然后主动把包限制在这个大小以内,从源头上就不需要拆。
这背后的思路很值得记住:与其让问题在半路临时爆发,不如提前摸清限制、主动适应。 这也是很多协议设计的共同智慧。
当然,包在路上还可能遇到别的麻烦:到不了、绕太久。网络用什么方式把这些情况告诉发送方?下一章揭晓。
思考题 1
为什么分片之后,只要丢失一个分片,整个包都要重传?
思考题 2
为什么更希望“避免分片”,而不是“经常分片”?
小结
知识点
- MTU 是一条链路能承载的最大传输单元
- 包过大时分片,在目的地重组
- 分片增加开销,且丢一片就要重传整包
- 路径 MTU 发现可避免分片
参考资料
- Wikipedia(zh):最大传输单元:链路可承载的最大数据量
- Wikipedia(zh):IP分片:把过大的数据包拆成若干片段
思考题答案(仅供参考)
思考题 1
因为接收方只有收齐全部分片,才能拼回原来的完整数据包。少了任何一片,拼装就无法完成,只能等待重传。所以一个分片丢失,代价等同于整包丢失。
思考题 2
因为分片会带来额外首部开销,并显著放大丢包的代价(丢一片等于丢整包)。避免分片能让每个包以合适的大小上路,减少开销与重传风险,整体效率更高。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图

设计师 | 南国微雪