Appearance
题目
若路由器向 MTU = 800 B 的链路转发一个总长度为 1580 B 的 IP 数据报(首部长度为 20 B)时,进行了分片,且每个分片尽可能大,则第 2 个分片的总长度字段和 MF 标志位的值分别是( )。
错因
A
总长度 796 算对了,但 MF=0 错——MF=0 意味着"最后一片",但本题是第 2 片,后面还有第 3 片(数据 1560 B 切成 776+776+8 = 三片),所以 MF 应是 1。错的根源:错以为只切两片。
C
把分片大小当成 MTU 本身(800),忘了总长度字段是分片整体长度(含 IP 首部)——分片不能超过 MTU 800,所以 80 - 20 = 776 是数据载荷部分,加上首部 20 = 796 才是总长度。直接填 800 等于忽略了"首部 20"这条约束,会让分片实际长度超 MTU。
D
同时犯了 C 和 A 的错——总长度 800 错(正确 796)、MF=1 对(这一项是对的,但与错的总长度组合到一起还是错答案)。
总解析
第一步:分析数据报与分片大小
| 量 | 值 |
|---|---|
| 原 IP 数据报总长度 | 1580 B |
| IP 首部长度 | 20 B |
| 原数据载荷长度 | 1580 − 20 = 1560 B |
| 链路 MTU | 800 B |
| 每片最大总长度 | 800 B(受 MTU 限制) |
| 每片最大数据载荷 | 800 − 20 = 780 B |
第二步:考虑分片对齐约束
IP 分片有一条硬约束:除最后一片外,每片的数据载荷必须是 8 字节的整数倍("片偏移字段"以 8 字节为单位计数)。
每片数据载荷 ≤ 780 B,向下取 8 的倍数 = 776 B(780 − 4 = 776,因为 780 / 8 = 97.5,向下取整 97 × 8 = 776)。
每片总长度 = 776 + 20 = 796 B。
第三步:算分片数量
| 分片 | 数据载荷字节范围(基于原 1560 B 数据) | 数据长度 | 总长度 | MF |
|---|---|---|---|---|
| 第 1 片 | [0, 775] | 776 B | 796 B | 1 |
| 第 2 片 | [776, 1551] | 776 B | 796 B | 1 |
| 第 3 片 | [1552, 1559] | 8 B | 8 + 20 = 28 B | 0 |
总数据 = 776 + 776 + 8 = 1560 ✓
第四步:核对题面"第 2 个分片"
第 2 片:
- 总长度 = 796 B(数据 776 + 首部 20)
- MF = 1(后面还有第 3 片,不是最后一片)
最终答案是 B(796, 1)。
编者注(生僻术语):IP 分片的"片偏移字段"以 8 字节为基本单位计数(占 13 比特,最大可表示 B 偏移,恰好覆盖 IP 最大长度 65535 B)。所以除最后一片外,每片数据载荷必须是 8 的倍数——这是 IP 协议的硬约束,不是工程偏好。本题 780 B 不是 8 的倍数,往下取整到 776 B = 8 × 97。这道题的核心陷阱就在"780 vs 776"这 4 字节差。