ICMP协议介绍

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP出现的原因

在IP通信中,经常有数据包到达不了对方的情况。原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了。或者,虽然到达了对方,但是由于搞错了端口号,服务器软件可能不能接受它。这时,在错误发生的现场,为了联络而飞过来的信鸽就是ICMP 报文。在IP 网络上,由于数据包被丢弃等原因,为了控制将必要的信息传递给发信方。ICMP 协议是为了辅助IP 协议,交换各种各样的控制信息而被制造出来的。

制定万维网规格的IETF 在1981 年将RFC7922作为ICMP 的基本规格整理出来了。那个RFC792 的开头部分里写着“ICMP 是IP 的不可缺少的部分,所有的IP 软件必须实现ICMP协议。也是,ICMP 是为了分担IP 一部分功能而被制定出来的。

https://z3.ax1x.com/2021/07/16/WQ9E5V.png

ICMP的用途

在RFC,将ICMP 大致分成两种功能:差错通知信息查询

https://z3.ax1x.com/2021/07/16/WQ9gxg.png

  1. 给送信者的错误通知:在IP 数据包被对方的计算机处理的过程中,发生了什么错误时被使用。不仅传送发生了错误这个事实,也传送错误原因等消息。
  2. 送信者的信息查询:在送信方的计算机向对方计算机询问信息时被使用。被询问内容的种类非常丰富,他们有目标IP 地址的机器是否存在这种基本确认,调查自己网络的子网掩码,取得对方机器的时间信息等。

ICMP报头格式

ICMP 的内容是放在IP 数据包的数据部分里来互相交流的。也就是,从ICMP的报文格式来说,ICMP 是IP 的上层协议。但是,正如RFC 所记载的,ICMP 是分担了IP 的一部分功能。所以,被认为是与IP 同层的协议。看一下RFC 规定的数据包格式和报文内容吧。

https://z3.ax1x.com/2021/07/16/WQPXU1.png
  1. 类型字段顾名思义是定义了ICMP报文的类型
  2. 代码字段表示的是发送这个ICMP报文的原因
  3. 校验和字段
  4. 首部的其余部分对于不同的ICMP是不同的
  5. 数据部分对于差错报告报文是用于找出引起差错的原始分组的信息, 对于查询报文是基于查询类型的额外的信息

可能的消息列表:

https://z3.ax1x.com/2021/07/16/WQP97n.png

常见的ICMP报文

  • 响应请求
    常用的ping操作中就包括响应请求(类型是8,代码是0)和应答(类型是8,代码是0)ICMP报文
  • 目标不可到达、源抑制和超时报文
    这三种报文格式一样
    1. 目标不可到达报文(类型值为3)在路由器或者主机不能传递数据时使用。
    2. 源抑制报文(类型字段值为,代码字段值为0)则充当一个控制流量的角色,通知主机减少数据报流量。由于ICMP没有回复传输的报文,所以只要停止该报文,主机就逐渐恢复传输速率。
    3. 超时报文(类型字段值为11)的代码域有两种取值:代码字段值为0表示传输超时,代码字段值为1表示重组分段超时。
  • 时间戳请求
    时间戳请求报文(类型值字段13)和时间戳应答报文(类型值字段14)用于测试两台主机之间数据报来回一次的传输时间。

Wireshark抓包分析

Wireshark抓包对ping报文的解码显示(BE与LE)

我们非常熟悉ping报文的封装结构,但是,在这个报文解码里,我们发现wireshark的解码多了几个参数:Identifier(BE)、Identifier(LE)、Sequence number(BE)、Sequence number(LE),如下图所示:

技术分享

       以前一直未注意wireshark是这样解码ping报文的,感觉非常奇怪,我们先来仔细的看一下wireshark对ping报文中这几个参数的解码情况:

技术分享

技术分享

技术分享

技术分享

         Wireshark解码显示,Identifier(BE)与Identifier(LE)都对应“hex 0200”,Sequence number(BE)与Sequence number(LE)都对应“hex 027b”,仔细看的话,我们能够发现BE值(0x0200)与LE值(0x0002)之间的差别就是顺序不一样。那到底BE、LE是指什么呢?搜遍百度无果,决定还是去wireshark官网看看,结果发现下面链接的内容:http://www.wireshark.org/lists/wireshark-bugs/200909/msg00439.html,其中有一段是这样描述的:

“After I discovered that the Windows ping sends ICMP echo request packets with the sequence number in little-endian byte order, but the Linux ping sends it in proper big-endian format, a discussion about it took place on the mailing list as to how to handle it (refer to  http://www.wireshark.org/lists/wireshark-dev/200909/msg00216.html).  However,to keep things simple and avoid adding any new ICMP preferences and/or trying to guess at the byte order, I thought why not just display the sequence number in both formats, so that‘s what this patch does.”

我来做个总结:wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windowsLElittle-endian byte orderLinuxBEbig-endian),为了体现wireshark的易用性,开发者将其分别显示出来。

Wireshark的牛B之处,由此细节可见一斑!

参考博文:

https://www.cnblogs.com/iiiiher/p/8513748.html

http://www.bubuko.com/infodetail-768087.html