首页/网络/抓包与流量分析速查/TCP 报文 DF 位与路径探测
TCP 流分析82 条

TCP 报文 DF 位与路径探测

IPv4 头上 DF=1 表示禁止分片:报文超过路径 MTU 时被丢弃并回 ICMP 需分片(类型3码4),发送方据此调整;DF 被中间设备忽略时形成黑洞。

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.9

DF 位相关现象

现象含义处理方向
大包丢弃且收到 ICMP 3/4PMTUD 工作正常发送方会自行缩包
大包丢弃但没有 ICMPICMP 被拦截放行必要的 ICMP 差错报文
所有包都能通过路径 MTU 足够或未置 DF无需处理
大包仍被分片转发设备忽略 DF 位行为不一致,建议修正策略
「出于安全考虑封禁所有 ICMP」是一条常见加固做法,代价是把路径 MTU 发现一起废掉。至少应放行 ICMP 类型 3 代码 4 这类必要的差错报文,否则「小包通、大包不通」会极难定位。
隧道、PPPoE、VPN 场景里封装开销会吃掉一部分 MTU,路径 MTU 比链路标称值更小,DF 位相关问题的出现概率明显更高,应优先在这些链路上排查。
现代 TCP 实现很少依赖 IP 层分片,多在大包上直接置 DF 位并依赖 PMTUD。因此 ICMP 策略是否合理,直接决定了大包能否顺畅传输。反过来,如果抓包里几乎看不到置了 DF 位的大包,多半说明该应用的数据块本身就不大。

易错点

  • "所有 ICMP 都不通"的排查经验会误伤 PMTUD 场景:至少要放行 3/4
  • PPP 与隧道环境 MTU 特殊,端到端抓包才能看清调整过程
  • 把 ICMP 3/4 当攻击流量在边界一律丢弃,会制造出难以定位的大包黑洞
  • 只在单侧抓包:ICMP 可能在中途就被拦掉,两端数据不一致会严重误导判断

数据来源与参考

  • RFC 1191(PMTUD)
  • RFC 792(ICMP 3/4)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌