ICMP 差错是什么
ICMP 差错报文是 IP 层的退信通知:路由器无法转发、或目的主机无法交付某个包时,会回一条 ICMP 给源地址说明失败原因。它不承载业务数据,只承载「为什么没送到」,所以是可达性问题的第一手证据。IPv4 差错类型主要有 3 目的不可达、5 重定向、11 超时、12 参数问题;IPv6 的同类信息走 icmpv6 字段,语义相近但类型号不同。差错报文固定内嵌「触发它的原始 IP 头加原始载荷前 8 字节」,Wireshark 会把内层包展开,据此可把差错精确关联到某条具体流。
基本信息
| 适用工具 | Wireshark 4.x 图形界面、tshark 命令行 |
|---|---|
| 过滤字段 | icmp.type / icmp.code,IPv6 用 icmpv6.* |
| 报文来源 | 中间路由器或目的主机,取决于失败原因 |
| 能力边界 | 只有抓包点位于差错报文经过的路径上才看得到 |
典型使用场景
- 路径逐跳结果异常:想确认每跳到底回了什么类型差错,读内嵌原始包即可对上
- UDP 服务排查:应用收不到请求而抓包出现 type 3 code 3,说明目的端口没有监听进程
- 大包不通小包正常:出现 type 3 code 4,是路径 MTU 发现黑洞的典型信号
- 连接立刻失败:区分回 RST 还是回 ICMP 不可达,前者多为服务或策略拒绝,后者是路由不可达
- 跨设备排障:中间设备回管理员禁止,说明是被 ACL 拦截而不是路由缺失
定位 ICMP 差错
定位 ICMP 差错
icmp.type == 3 # Destination Unreachable,目的不可达
icmp.type == 3 && icmp.code == 3 # Port Unreachable,UDP 端口无监听常见
icmp.type == 3 && icmp.code == 4 # Fragmentation Needed,PMTUD 黑洞信号
icmp.type == 3 && icmp.code == 13 # 被策略过滤,Communication Administratively Filtered
icmp.type == 11 # Time Exceeded,TTL 超时
tshark -r a.pcap -Y 'icmp.type==3' -T fields -e ip.src -e icmp.code # 命令行提取源与 codetype/code 速查
| type/code | 含义 | 处置方向 |
|---|---|---|
| 3/0、3/1 | 网络或主机不可达 | 查路由表、网关与链路状态 |
| 3/3 | 端口不可达 | 目标端口无服务,或 UDP 应用未启动 |
| 3/4 | 需要分片但 DF=1 | MTU 与路径发现问题,查隧道和中间设备 |
| 3/10、3/13 | 管理员禁止、被策略过滤 | 核对防火墙 ACL 与云安全组 |
| 11/0 | TTL 超时 | 环路,或路径探测的正常行为 |
| 5/0 | 重定向 | 同网段多网关,检查路由配置 |
很多设备对 ICMP 差错限速甚至直接丢弃,因此没抓到 ICMP 不代表没问题;此时改用两端对照抓包来判断丢包位置。
ICMP 差错的源地址往往是回信的那台设备而不是最终目标,内层原始包里的目标地址才是真正不可达的对象。