ICMP 报文类型详解
一、ICMP协议概述
ICMP(Internet Control Message Protocol)是TCP/IP协议族的核心协议之一,工作在网络层(OSI第3层),主要用于传递网络状态信息和错误报告。
关键结论:ICMP是IP协议的辅助协议,虽然独立于传输层协议(TCP/UDP),但ICMP报文是作为IP数据报的有效载荷进行传输的。
go专栏:https://duoke360.com/tutorial/path/golang
二、ICMP报文通用格式
所有ICMP报文共享相同的头部结构:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Rest of Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type(1字节):报文主类型Code(1字节):报文子类型Checksum(2字节):校验和Rest of Header(4字节):类型特定字段Data(可变长度):附加信息
三、主要ICMP报文类型详解
3.1 错误报告报文(Type 0-10)
3.1.1 目的不可达(Type=3)
当路由器或主机无法交付数据报时发送,包含6种常见子类型:
Code说明0网络不可达1主机不可达2协议不可达3端口不可达4需要分片但DF位已设置5源路由失败
典型场景:当发送UDP包到未监听端口时,会收到Type=3, Code=3的ICMP报文。
3.1.2 超时报文(Type=11)
包含两种子类型:
Code=0:TTL超时(路由器发现TTL=0时发送)Code=1:分片重组超时(主机在规定时间内未收到全部分片)
3.1.3 参数问题(Type=12)
当IP头部字段有问题时发送,Code=0表示具体错误位置指针。
3.2 查询报文(Type 8,0,13,14,17,18)
3.2.1 回显请求/应答(Type=8/0)
即ping命令使用的报文:
Type=8:请求(Echo Request)Type=0:应答(Echo Reply)
报文格式额外包含:
Identifier(2字节):进程IDSequence Number(2字节):序列号
3.2.2 时间戳请求/应答(Type=13/14)
用于时钟同步,包含三个时间戳字段:
原始时间戳(发送时间)接收时间戳传输时间戳
3.2.3 地址掩码请求/应答(Type=17/18)
用于获取子网掩码(现已被DHCP取代)
四、高级ICMP应用
4.1 路径MTU发现
通过Type=3, Code=4(需要分片)报文实现:
发送方设置DF位发送大包中间路由器返回ICMP错误发送方逐步减小MTU
4.2 Traceroute原理
利用TTL超时机制:
发送TTL=1的UDP包第一跳路由器返回Type=11, Code=0逐步增加TTL值获取路径
五、安全相关ICMP报文
5.1 重定向报文(Type=5)
路由器通知主机更优路由路径,包含4种子类型:
Code=0:网络重定向Code=1:主机重定向Code=2:TOS网络重定向Code=3:TOS主机重定向
安全警告:ICMP重定向可能被用于中间人攻击,现代系统通常忽略这类报文。
5.2 路由器通告/请求(Type=9/10)
用于无状态地址自动配置(SLAAC):
Type=9:路由器通告(包含前缀信息)Type=10:路由器请求
六、企业面试常见问题
ping不通的可能原因有哪些?
防火墙拦截ICMP中间设备丢弃报文目标主机禁用ICMP响应网络路由问题
traceroute如何同时使用UDP和ICMP?
原始实现使用UDP(Unix)Windows默认使用ICMP Echo请求两种方式都依赖TTL超时机制
为什么ICMP需要单独协议而不是使用TCP/UDP?
需要网络层级的错误报告TCP/UDP可能不可用(如端口不可达时)避免依赖高层协议实现
七、Wireshark抓包分析示例
Frame 1: 74 bytes on wire
Internet Protocol Version 4
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x4865 [correct]
Identifier: 0x0001
Sequence Number: 1
Data (56 bytes)
建议面试者实际使用Wireshark分析各类ICMP报文,理解字段含义。