1. Internet Control Message Protocol(Internet控制报文协议)概述
- IP 协议号「1」
- ICMP Header Message 为「8」字节
- TCP/IP 协议簇的核心协议之一,用于在 IP 网络设备之间发送控制报文,传递差错、控制、查询等信息
- ICMP Echo Request 和 ICMP Echo Reply 分别用来查询和响应信息,进行差错检测
- 如果当网络设备无法访问目标网络时,会自动发送 ICMP 目的不可达报文通知发送端设备
- 如果报文无法发送到目的地址或网关设备时没有足够的缓存来存储转发报文,则需要发送 ICMP 报文
2. 重定向
- 重定向用来解决次优路径问题。第一个数据包网关设备正常转发,但会向源地址发送一个 ICMP Redirect 告知源设备去往该目的网络交给某个 IP(去找哪台设备进行转发)
重定向的前提条件
Type:类型
- Code:消息代码
-
2)ICMP Echo Request/Reply Message
ICMP Echo Request/Reply Message 格式解析 Type:类型
- 0 = 回显应答报文
- 8 = 请求回显报文
- Code:代码(request 和 reply 固定为 0)
- Checksum:校验和
- Identifier:标识符
- Sequence Number:序列号。每发送一次就加 1
-
3)ICMP Redirect Message
ICMP Redirect Message 报文格式解析 Type:类型(redirect 固定为5)
- Code:代码
- 0 = redirect datagrams for the network(为网络重定向)
- 1 = redirect datagrams for the host(为主机重定向)
- 2 = redirect datagrams for the type of service and network(为服务类型和网络重定向)
- 3 = redirect datagrams for the type of service and host(为服务类型和主机重定向)
- Checksum:校验和
- Gateway Internet Address:原始数据包里的目的 IP 地址
- Internet Header + 64 bits of Original Data Datagram:IP头和原始数据包的前64比特数据(包含最初发送的 IP 头部信息和 ICMP request 报文)。该数据是主机用来匹配消息。对于更高层协议的用户端口号,原始数据包的前64比特的这些数据会被重组
4)消息和编码类型
| 类型Type | 代码Code | 描述 | | —- | —- | —- | | 0 | 0 | 回显应答( ping 应答) | | 3 | 0 | 网络不可达 | | 3 | 1 | 主机不可达 | | 3 | 2 | 协议不可达 | | 3 | 3 | 端口不可达 | | 3 | 4 | 需要进行分片但设置不分片比特 | | 3 | 5 | 源站选路失败 | | 3 | 6 | 目的网络不认识 | | 3 | 7 | 目的主机不认识 | | 3 | 8 | 源主机被隔离(作废不用) | | 3 | 9 | 目的网络被强制禁止 | | 3 | 10 | 目的主机被强制禁止 | | 3 | 11 | 由于 TOS ,网络不可达 | | 3 | 12 | 由于 TOS ,主机不可达 | | 3 | 13 | 由于过滤,通信被强制禁止 | | 3 | 14 | 主机越权 | | 3 | 15 | 优先权中止生效 | | 4 | 0 | 源端被关闭 | | 5 | 0 | 对网络重定向 | | 5 | 1 | 对主机重定向 | | 5 | 2 | 对服务类型和网络重定向 | | 5 | 3 | 对服务类型和主机重定向 | | 8 | 0 | 请求回显( ping 请求) | | 9 | 0 | 路由器通告 | | 10 | 0 | 路由器请求告 | | 11 | 0 | 传输期间生存时间为 0 | | 11 | 1 | 在数据报组装期间生存时间为 0 | | 12 | 0 | 坏的 IP 首部 | | 12 | 1 | 缺少必须的选项 | | 13 | 0 | 时间戳请求(作废不用) | | 14 | 0 | 时间戳应答(作废不用) | | 15 | 0 | 信息请求(作废不用) | | 16 | 0 | 信息应答(作废不用) | | 17 | 0 | 地址掩码请求 | | 18 | 0 | 地址掩码应答 |
4. 应用方式
1)Ping
-
2)路由跟踪
Tracert(Windows):采用 ICMP 协议,默认发 3 个报文;首次 TTL = 1,每经过一个设备逐步递增(+1),直到达到目标地址
- 发送 ICMP request 报文(Type 8;Code 0)
- 非最终目标响应 ICMP exceeded 报文(type 11;code 0,超时)
- 直到最终目标响应 replay 报文(type 0;code 0)
- Tracerouter(Linux):采用 UDP 协议;首次 TTL = 1,每经过一个设备逐步递增(+1),直到达到目标地址
- 发送 UDP 端口大于 33434 的报文
- 非最终目标响应 ICMP exceeded 报文(type 11;code 0,超时)
- 最终目标响应 ICMP replay 报文(type 3;code3,目标端口不可达)