🔌 第三章 从网线到网络设备
📄 一句话概括

两条链路 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 秒实验

  1. 查查 IPv6 为什么取消了中间路由器分片。
  2. 搜索 PMTUD 黑洞问题(ICMP 被挡导致大包不通)。
  3. 算算 1500 字节的包在 MTU 576 链路上要拆几片。

常见误区

  1. 以为分片与 TCP 切块是一回事——层级与责任方都不同。
  2. 以为分片无损——丢一片代价是整包重传。
自测三问(点开对答案) 1. 分片是谁做的? —— 路径中的路由器(出口 MTU 小)。 2. 丢一片的后果? —— 整个原始包作废。 3. 为什么现代要避免分片? —— 代价高,PMTUD 可预防。

相关笔记