DF 位与路径探测
IPv4 头里的 DF 位表示禁止分片。报文超过路径 MTU 时,路由器会丢弃它并回一条 ICMP 需分片消息,发送方据此把报文缩小,这就是路径 MTU 发现机制。如果 ICMP 在中途被拦截,发送方不知道要缩包,只能持续重传同样大的报文,于是形成黑洞。
基本信息
| 适用平台 | IP 层行为,主机与网络设备共同参与 |
|---|---|
| Wireshark 字段 | ip.flags.df == 1 |
| 相关 ICMP | 类型 3 代码 4(需要分片但 DF 已置位) |
| 标准依据 | RFC 1191(PMTUD)与 RFC 792(ICMP) |
典型使用场景
- 理解大包为何被丢:先确认发送方是否置了 DF 位
- 排查 PMTUD 黑洞:检查 ICMP 需分片消息是否被拦截
- 验证中间设备行为:看是否存在无视 DF 位仍做分片的设备
- 隧道与 VPN 排障:封装后 MTU 变小,DF 位的影响更明显
- 串起证据链:把 TCP 大包重传与 ICMP 差错报文连起来看
过滤与验证
过滤与验证
# Wireshark 过滤
ip.flags.df == 1 && tcp # 置了 DF 位的 TCP 报文
icmp.type == 3 && icmp.code == 4 # 需要分片但被丢弃的回执
# Linux 上验证路径 MTU
ping -M do -s 1472 10.0.0.9DF 位相关现象
| 现象 | 含义 | 处理方向 |
|---|---|---|
| 大包丢弃且收到 ICMP 3/4 | PMTUD 工作正常 | 发送方会自行缩包 |
| 大包丢弃但没有 ICMP | ICMP 被拦截 | 放行必要的 ICMP 差错报文 |
| 所有包都能通过 | 路径 MTU 足够或未置 DF | 无需处理 |
| 大包仍被分片转发 | 设备忽略 DF 位 | 行为不一致,建议修正策略 |
「出于安全考虑封禁所有 ICMP」是一条常见加固做法,代价是把路径 MTU 发现一起废掉。至少应放行 ICMP 类型 3 代码 4 这类必要的差错报文,否则「小包通、大包不通」会极难定位。
隧道、PPPoE、VPN 场景里封装开销会吃掉一部分 MTU,路径 MTU 比链路标称值更小,DF 位相关问题的出现概率明显更高,应优先在这些链路上排查。
现代 TCP 实现很少依赖 IP 层分片,多在大包上直接置 DF 位并依赖 PMTUD。因此 ICMP 策略是否合理,直接决定了大包能否顺畅传输。反过来,如果抓包里几乎看不到置了 DF 位的大包,多半说明该应用的数据块本身就不大。