📄 一句话概括
两条链路 MTU 不同时,路由器把装不下的大包按出口 MTU 拆成分片,收方再重组——任一片丢失整包作废。
📝 本节和前面几节的关系
3.3.6 讲寿命;本篇讲包太大时的处理。
一、分片发生点
TCP 层按 MSS 切(2.3.2)是发送端的事; 分片是路径中路由器被迫做的事——出口 MTU 更小就拆。
二、代价
收方要重组(靠 IP 头的标识/偏移/标志位); 丢任一片 → 整包作废 → 只能靠 TCP 整块重传——代价高。 ⭐ 2026 现状:路径 MTU 发现(PMTUD)尽量避免分片。
三、动手 Demo:分片为什么存在
一次被迫分片:
for s in ['输入端 MTU=1500 -> 一个 1500 字节的大包',
出口端 MTU=576 -> 装不下!',
路由器:拆成 576 的若干片(分片)']:
print(s)
实跑输出:
--------------------------------------------------------------------
分片为什么存在
--------------------------------------------------------------------
两条链路 MTU 不同时:
输入端 MTU=1500 -> 一个 1500 字节的大包
出口端 MTU=576 -> 装不下!
路由器:拆成 576 的若干片(分片)
分片在【转发路径上被迫发生】,代价是:
收方要重组、任一片丢了整包作废(靠 TCP 整块重传)。
⭐ 2026 现状:路径 MTU 发现(PMTUD)尽量避免分片。
分片的字段全在 IP 头里:标识、标志、片偏移—— IP 头因此比 TCP 头复杂得多。
30 秒实验
- 查查 IPv6 为什么取消了中间路由器分片。
- 搜索 PMTUD 黑洞问题(ICMP 被挡导致大包不通)。
- 算算 1500 字节的包在 MTU 576 链路上要拆几片。
常见误区
- 以为分片与 TCP 切块是一回事——层级与责任方都不同。
- 以为分片无损——丢一片代价是整包重传。
自测三问(点开对答案)
1. 分片是谁做的? —— 路径中的路由器(出口 MTU 小)。 2. 丢一片的后果? —— 整个原始包作废。 3. 为什么现代要避免分片? —— 代价高,PMTUD 可预防。- ☐ 下一节(3.3.8 路由器的发送操作和计算机相同)
相关笔记
- 包收发操作概览 — 本机发包工单
- 路由器的发送操作和计算机相同 — 转发的出口侧
- 🔌 网络是怎样连接的 · 索引