目录
ICMP协议
ICMP报文格式
ICMP回显请求/应答报文
ICMP差错报文
ICMP 宿主机不可达差错报文
ICMP 重定向差错报文
ICMP TTL超时差错报文
ICMP协议
ICMP协议的作用
ICMP(Internet Control massage protocol)因特网控制协议,主要用来在网络设备间传递各种差错、控制和查询等消息(在收集网络信息、诊断、排查故障等方面具有重要的作用)
ICMP是网络层协议,协议号为1
为什么需要ICMP差错报文
IP协议的缺点
1、IP协议没有差错报文或差错纠正机制
2、IP协议缺少一种为主机和管理查询的基址
所以ICMP协议就是为了补充IP协议的这两个缺点而设计的,配合IP协议使用
ICMP报文格式
通过Type和Code定义ICMP的报文类型
ICMP报文主要分为查询报文和差错报文两大类
查询报文:主要用于在主机和路由器之间传输控制信息,也用来探测网络连通性和路径等信息
差错报文:用于报告数据传输过程中的错误
Type | Code | 描述 |
|
0 | 0 | 回显应答(ping应答) | 查询报文 |
8 | 请求回显(ping请求) | ||
9 | 路由器通告 | ||
10 | 路由器请求 | ||
13 | 时间戳请求(目前已不使用) | ||
14 | 时间戳应答(目前已不使用) | ||
15 | 信息请求(目前已不使用) | ||
16 | 信息应答(目前已不使用) | ||
17 | 地址掩码请求 | ||
18 | 地址掩码应答 | ||
3(目的不可达报文) | 0 | 网络不可达 | 差错报文 |
1 | 主机不可达 | ||
2 | 协议不可达 | ||
3 | 端口不可达 | ||
6 | 目的网络不认识 | ||
7 | 目的主机不认识 | ||
9 | 目的网络被强制禁止 | ||
10 | 目的主机被强制隔离 | ||
11 | 由于TOS,网络不可达 | ||
12 | 由于TOS,主机不可达 | ||
13 | 由于过滤,通信被强制禁止 | ||
4(源抑制报文) | 0 | 源端被关闭 | |
5(ICMP重定向报文) | 0 | 对网络重定向 | |
1 | 对主机重定向 | ||
2 | 对服务类型和网络重定向 | ||
3 | 对服务类型和主机重定向 | ||
11(TTL为0报文) | 0 | 传输期间生存时间为0 | |
1 | 在数据报组装期间生存时间为0 | ||
12(报文格式问题) | 0 | 坏的IP首部 | |
1 | 缺少必须的选项 |
ICMP回显请求/应答报文
作用
通过ping工具发送ICMP回显请求消息探测网络的连通性(对端回应ICMP回显应答请求)
通过tracert工具发送ICMP回显请求来探测去往某目的网路的路径信息(修改ICMP回显请请求的TTL的值,通过对端回应的Type为11的ICMP差错报文来得到路径信息)
报文格式
Type
8为请求
0为应答
Identifier
标识符,标识ICMP该回显应答对应的是哪个回显请求(通过该字段使得请求和应答一一对应)
BE和LE是通过不同的编码格式得到的值,解码后的信息都是一样的
可以理解为BE是针对于windows系统的编码格式,LE是针对于Linux系统的编码格式
Sequence Number
序列号,发送报文的序列号,每次发送序列号就+1
Data
可选,包含要发送的数据(回显应答通常返回与回显请求所收到的数据相同)
ICMP差错报文
ICMP差错报文都有一个的字段(IP头部+原始数据包的前64 bits)
该字段的内容包含出错数据包的IP头部以及出错数据包的前64位数据(端口号、序列号、其它协议报文头部等)
该字段的作用就是将产生该错误的报文附带在差错报文中,当管理员看到差错报文时知道是什么原因产生的错误,有利于排查错误
以下情况不会产生ICMP差错报文
1、对于携带ICMP差错报文的数据包,不会在产生ICMP差错报文
2、对于分片的数据包,如果不是第一个分片,则不会产生ICMP差错报文
3、对于具有组播地址的数据报文,不会产生ICMP差错报文
4、对于具有特殊地址的数据报文(如127.0.0.0和0.0.0.0),不会产生ICMP差错报文
ICMP 宿主机不可达差错报文
一般是本地没有去往报文目的IP地址的路由,就会向报文的源IP地址回应ICMP差错报文(宿主机不可达)
网络不可达差错报文(当路由器上没有去往目的网段的路由时就会发送网络不可达差错报文)
从数据包中可以看出来
- 当ICMP Echo Request报文到达192.168.10.254这台设备时
- 这台设备(10.254)发现自己没有去往该报文目的地址100.0.0.1的路由
- 此时这台设备(10.254)就发送ICMP差错报文-网络不可达消息给ICMP Echo Request报文的源IP地址(10.129)
端口不可达IP报文(一般在tracert跟踪路由场景下会出现此差错报文)
Tracert主要是用来跟踪路径,在跟踪路径的过程中如果某个路由器或目标主机上的应用程序没有在相应的端口上监听,此时收到ICMP回显请求时会回应端口不可达的ICMP差错报文、或者当网络管理员阻止了ICMP回显请求时也会发送端口不可达的ICMP差错报文(端口不可达信息不止因为Tracert产生,还会因为其它操作产生,只是Tracert是比较常见的)
从数据包中可以看出来
- 当172.22.105.211访问172.22.105.254的137端口时
- 这台设备(105.254)发现自己并没有开启该端口的监听(或者拒绝接收ICMP回显请求)
- 此时这台设备(105.254)就发送ICMP差错报文-端口不可达消息给172.22.105.211
ICMP 重定向差错报文
产生重定向报文的场景
1、从一个接口接收到的报文再从同一个接口发出去,一般就会产生ICMP重定向(不一定是环路)
2、当设备从某个接口收到发往远程网络的数据时,发现源IP地址与下一跳属于同一网段时也会产生ICMP重定向
ICMP重定向报文的作用
当主机收到ICMP重定向差错报文后,会将自己去往目的IP地址(该目的IP地址为ICMP差错报文中携带的IP头部的目的IP地址)的网关设置为该地址
即ICMP重定向报文会通知该主机修改自身的路由表(将去往目的IP地址的下一跳修改为ICMP重定向报文携带的最佳下一跳的IP地址)
报文格式
从数据包中可以看出来
- 当192.168.10.129这台设备去访问192.168.10.1时,将此数据包发给了192.168.10.254
- 此时192.168.10.254发现自身去往192.168.10.1的下一跳接口为自己接收此报文的入接口,并且也发现源IP10.129与目的IP10.1为同一网段
- 此时10.254这台设备就认为10.129可以直接去往10.1
- 于是10.254就向10.129发送ICMP重定向报文(Gateway字段设置为10.1),让10.129访问10.1可以直接将报文交给10.1,不需要再交给自己
ICMP TTL超时差错报文
当IP数据包在传输过程,在还没有到达目的IP地址的时候IP层的TTL变为0(路由器收到时为1的报文就会认为TTL超时),此时该路由器就会发送ICMP差错超时报文(Tracert就是通过差错报文来跟踪路径的)
报文格式
从数据包中可以看出来
- 当172.22.105.211这台设备去访问1.1.1.1,封装数据包
- 当172.22.105.254收到该数据包是发现该报文的TTL为1,但是本设备又不是报文的目的地址
- 于是105.254就向105.211发送ICMP TTL超时报文,让其增加TTL值