Wireshark分析icmp协议常见范例
目录
1 概述: 1
2 Icmp的结构: 1
3 Icmp的类别 2
3.1 icmp差错报文 3
3.2 icmp查询报文 3
4 Ping命令分析 3
5 Ping的几种情况: 6
5.1 没有出局路由 6
5.2 超时 7
6 tracert命令 8
7 pathping命令 12
8 Udp端口没有打开时,发出icmp端口不可达消息 13
9 Icmp路由重定向仿真 15
10 Tcp协议端口没有打开时,不发icmp消息,直接回rst消息 18
概述:
Icmp协议是工作在ip层的点到点内部传输协议,它传递差错报文以及其他需要注意的信息。ICMP 报文通常被 IP 层或更高层协议(如UDP)使用。ICMP 报文是在 IP 数据包内部传输的。IP 协议是不可靠协议,不能保证 IP 数据报能够成功的到达目的主机,无法进行差错控制,而 ICMP 协议能够协助 IP 协议完成这些功能。
Icmp的结构:
在ip层之上,不含任何socket信息;
类型:一个 8 位类型字段,表示 ICMP 数据包类型;
代码:一个 8 位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为 0;
检验和:数据包中 ICMP 部分上的一个 16 位检验和;
数据:不同类型和代码数据不同。
20字节的ip层 | ||
8位类型 | 8位代码 | 16位校验和 |
不同类型和点码有不同的内容 |
以ping消息为例如下:
Ping消息data为一串源端发出数值串,对方响应要携带相同的数值串。
Icmp的类别
ICMP消息大体有两类:双向消息和单向消息。
双向消息,如常用的ping消息,用来测试网络的可达性。发起方是源设备,应答方是终端设备或者数据传输路径中的节点路由器。
单向消息一般为告警报错消息(type 3),或Redirect消息( type 5),由于单向的消息是通知源主机出错。发起方都是数据包经过节点路由器。
ICMP 报文大致可分为两类:差错报文、查询报文。主要消息类型如下表所示:
类型 | 内容 | 查询 | 差错 | 单向/双向 |
0 | 回送应答 | 是 | 双向 | |
3 | 目标不可达 | 是 | 单向 | |
4 | 源抑制 | 是 | 单向 | |
5 | 重定向 | 是 | 单向 | |
8 | 回送请求 | 是 | 双向 | |
9 | 路由器公告 | 是 | 双向 | |
10 | 路由器请求 | 是 | 双向 | |
11 | 超时 | 是 | 单向 | |
17 | 地址掩码请求 | 是 | 双向 | |
18 | 地址掩码应答 | 是 | 双向 |
差错报文是单向的,查询报文是双向的。
icmp差错报文
以下针对 ICMP 差错报文的类型进行分析:
- ICMP 目标不可达消息:IP 路由器无法将 IP 数据报发送给目的地址时,会给发送端主机返回一个目标不可达 ICMP 消息,并在这个消息中显示不可达的具体原因。
- 2、ICMP 重定向消息:如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个 ICMP 重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个 ICMP 重定向消息给发送端主机一个更合适的发送路由。
- 3、ICMP 超时消息:IP 数据包中有一个字段 TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减 1,直到减到 0 时该 IP 数据包被丢弃。此时,IP 路由器将发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。
- 4、源抑制消息:当 TCP/IP 主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个 ICMP 源抑制消息。
icmp查询报文
----ICMP 回送消息:用于进行通信的主机或路由之间,判断发送数据包是否成功到达对端的消息。可以向对端主机发送回送请求消息,也可以接收对端主机回来的回送应答消息。
----ICMP 地址掩码消息:主要用于主机或路由想要了解子网掩码的情况。可以向那些主机或路由器发送 ICMP 地址掩码请求消息,然后通过接收 ICMP 地址掩码应答消息获取子网掩码信息。
----ICMP 时间戳消息:可以向那些主机或路由器发送 ICMP 时间戳请求消息,然后通过接收 ICMP 时间戳应答消息获取时间信息。
Ping命令分析
Ping命令正常情况下是icmp协议下的双向查询消息,用来测试两点之间的通信是否正常?通常主叫发出一串测试包,并携带对应id和序号,被测试方返回对应这串测试包,并携带正确的id和序号。
注意这里wireshark里显示的BE和LE为两种数据存储的方式时的值。物理上对应一段数据。
Request消息如上图:
Reply消息如下:
同样下一个request消息id不变,序号递增
Ping的几种情况:
没有出局路由
如上图中没有对应的路由表项,没有出局可用电路时,显示传输失败。
超时
一般是ttl exceeded消息,经过网络节点收到ttl=1的包就会向源ip发出一个ttl exceeded消息。如果是内网ip,一般是路由环路问题。
下图:用192.168.205.201/24,网关192.168.205.1的ip去ping192.168.211.2
抓包后如下图:
Tracert的结果:
跟踪的结果三层交换机的对应vlan所属的端口down,导致直连路由消失,包在三层交换机192.168.212.2和路由器192.168.212.1间来回发送。直到路由器收到ttl=1的包。
tracert命令
tracert 先发送 TTL 为 1 的回应数据包,当数据包上的 TTL在路由器收到后TTL自动减1 ,一旦某个路由器将TTL减1后,等于了0,路由器应该将“ICMP Time Exceeded”的消息发回源计算机,源计算机就根据收到的信息判断达到的路由器和所用时间。下次再次发送数据包时,将TTL递增 1,继续上述测试,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL过期的数据包,这在 Tracert 实用程序中看不到,我们会显示请求超时的请求信息。
请求消息会发三次(使用相同的ttl值),若没有reply消息返回,就把ttl加1,继续发出。直到最后终端的响应为止。
过程如下:
发出ping包,mac地址为网关地址,目的ip为117.23.6.86,ttl为1.每个ttl值发3遍。
收到路由器的icmp单向消息,ttl超出消息。
pathping命令
和tracert类似,发出ping的request消息,但只发一次,收到ttl exceed消息后,ttl加1发出,当没有响应,没有收到ttl exceed时,停止发出ping的request消息,用此时最大的有效ttl值对几个记录的路由器ip进行测试。
Udp的端口不可达消息
Udp端口没有打开时,发出icmp端口不可达消息
测试环境:iad向pc进行sip用户注册,默认端口是5060。Iad的ip是18.250.153,
Pc的ip是18.250.0.145
Iad的配置界面:
过程为:
Pc上端口显示如下
udp端口没有打开,icmp层回端口不可达消息。
Icmp路由重定向仿真
ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据包向它的目的地转发。
发生ICMP重定向通常有两种情况:
1)当路由器从某个接口收到数据还需要从相同接口转发该数据时;
2)当路由器从某个接口到发往远程网络的数据时发现源ip地址与下一跳属于同一网段时。
A的mac地址44:37:e6:8c:94:27,B的mac地址44:37:e6:8e:cf:77
路由器的mac地址为70:ba:ef:e3:5e:12
B开始pingA后,流程如上图123,路由器给给1 发icmp路由重定向消息。抓包见下图:
过程分析:
B的路由表如下:
A的路由表:
BpingA时,首先查找B中的直连路由表项,A的地址和路由表中的255.255.255.224相与,得到192.168.206.145,这个在B的直连路由表中没有匹配的,所以走默认路由,送到网关ip192.168.206.1的mac地址上去。
网关查自己路由表,认为B应该直接发给A的,所以用redirect消息通知A
路由器查自己的路由表,是自己的直连路由,所以也转出包,A收到后,查询自己的路由表,符合自己的直连路由表项,所以回复reply消息。
Tcp协议端口没有打开时,不发icmp消息,直接回rst消息
如下图:pc18.250.0.145运行一个http服务器,另一终端18.250.0.31访问,syn握手后,发rst中断握手。
过滤项为ip.addr==18.250.0.31 || icmp消息,发现此时没有icmp消息发出
查看8080端口是否打开?