ICMP介绍

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

ICMP消息通常由网络设备(如路由器或主机)生成,并通过IP数据报进行传输。它们被用于诊断网络问题、测试网络可达性以及提供网络管理功能。

ICMP消息可以分为以下几种类型:

  1. Echo Request/Echo Reply消息:也称为ping消息,用于测试网络设备的可达性。发送端发送一个Echo Request消息,接收端收到后会回复一个Echo Reply消息。

  2. Destination Unreachable消息:用于通知发送端某个目的主机或网络不可达。例如,当一个数据包无法路由到目标地址时,网络设备会发送一个Destination Unreachable消息给发送端。

  3. Time Exceeded消息:用于通知发送端某个数据包的生存时间已经超过了规定的时间。例如,当一个数据包在路由器之间进行转发时,如果它在某个路由器上停留的时间超过了规定的时间,该路由器会发送一个Time Exceeded消息给发送端。

  4. Redirect消息:用于通知发送端更有效的路径来达到目标地址。当一个路由器发现一个数据包正在经过一个不必要的中间路由时,它可以发送一个Redirect消息给发送端,告诉它使用一个更短的路径。

  5. Parameter Problem消息:用于通知发送端某个IP数据报的头部格式有错误。当一个网络设备接收到一个IP数据报,发现它的头部格式不正确时,它会发送一个Parameter Problem消息给发送端。

ICMP是一个重要的协议,它在网络中起着诊断和管理功能的作用。它可以帮助网络管理员快速发现和解决网络问题,并提高网络的可靠性和性能。

ICMP报文格式

ICMP所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。ICMP报文的格式如下:

常见的ping应用程序就是发送的ICMP回显请求和回显应答报文

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Echo or Echo Reply Message

    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             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-
  • Type:ICMP的消息类型,常见的有回显request、reply报文,以及差错控制报文

  • Code:对应消息类型的编码,比如差错类型报文,主机不可达1,网络不可达0

  • CheckSum:校验和

  • Identifier:用来匹配request与reply报文,如下抓到的请求与回应的报文的Identifier是相同的

  • Sequence Number:与Identifier作用类似,为什么用这两个字段匹配请求与回应报文。例如:Identifier用来表示UDP或TCP回话中的端口,Sequence用来标识这个回话中的请求和回应报文

更多ICMP协议定义参见RFC 792,我们经常排查网络故障的ping命令就是发送的ICMP Request和Reply的报文。

ICMP请求报文报文格式

ICMP请求报文格式

ICMP回应报文格式

ICMP回应报文格式