0%

ICMP协议简要整理记录

互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)是互联网协议族的核心协议之一,是一种网络层协议。ICMP的主要功能是确认IP包是否成功送达目的地址,通知发送过程中IP包被丢弃的原因,可用于检查网络是否正常、网络配置是否正确、设备是否异常等信息,方便进行网络问题诊断。

ICMP消息通过IP进行传输,但并不是让IP成为一种可靠的协议,而是对传输中发生的问题进行反馈。ICMP消息的传输同样得不到可靠性保证,也有可能在传输过程中丢失。

ICMP消息封装

ICMP报文结构

报头

ICMP报头从IP报头的第160位开始(IP首部20字节)(除非使用了IP报头的可选部分)。

  • Type:ICMP的类型,标识生成的错误报文;
  • Code:进一步划分ICMP的类型,该字段用来查找产生错误的原因;
  • Checksum:Internet校验和,用于进行错误检查;
  • Rest of Header:报头的其余部分,四字节字段,内容根据TypeCode而有所不同。

填充数据

填充的数据紧接在ICMP报头的后面(以8位为一组):

  • Linux的ping工具填充的ICMP除了8个8位组的报头以外,默认情况下还另外填充数据使得总大小为64字节;
  • Windows的ping.exe填充的ICMP除了8个8位组的报头以外,默认情况下还另外填充数据使得总大小为40字节。

报文类型

常见的ICMP消息类型

  • 回送请求信息(Echo Request):由源设备(主机或路由器等)向一个指定的目的设备发出的请求,用于测试目的设备是否可达。

  • 回送响应信息(Echo Reply):对Echo Request的响应;目的设备发送Echo Reply来响应收到的Echo Requestping命令就是使用Echo RequestEcho Reply来实现的。

  • 目的不可达(Destination Unreachable):路由器无法将IP包发送给目的地址时,会给源设备返回一个Destination Unreachable消息,该消息包含不可达的具体原因。

  • 参数问题(Parameter Problem):路由器发现IP包头出现错误或非法值后,向源设备发送一个Parameter Problem消息,该信息包含有问题的IP头、或错误字段的提示信息。

  • 重定向(Redirect):若路由器发现一条更优的路径发送数据,就会返回一个Redirect消息给主机,该消息包含最合适的路由信息和源数据。

  • 超时(Time Exceeded):IP包中有一个字段是TTL(生存周期),它的值每经过一次路由器就减1,直到减到0时,IP包会被丢弃。此时,路由器会发送一个Time Exceeded消息给源设备,并通知IP包已被丢弃。可以通过设置一个较小的TTL值来控制IP包的可达范围。

  • 时间戳请求/时间戳响应(Timestamp Request / Timestamp Reply):时间戳可以记录ICMP消息一次往返所需的时间。源设备发送一个带有发送时间的Timestamp Request消息,目的设备收到后,发送一个带有源设备发送时间、目的设备接收时间以及目的设备发送时间的Timestamp Reply消息。源设备收到Timestamp Reply时,记录到达时间。这些时间戳可以估计网络上的传输时间。

ICMP的应用

ICMP被广泛应用于网络测试,例如网络测试工具pingtracert

ping

通过ping可以测试网络的可达性。使用ping命令时,源设备向目的设备发送Echo request消息,目的设备收到Echo request消息后,向源设备回应一个Echo reply消息,可知目的设备是可达的。

若中间某个路由器没有到达目的网络的路由,就会向源设备回应一个Destination Unreachable消息,告知目的设备不可达。

若源主机在一定时间内无法收到回应报文,就认为目的设备不可达,并显示超时。

tracert

工具tracert可以查看数据包的整条传输路径,包括途中经过的中间设备。

使用tracert命令时,源设备的tracert逐跳发送数据包,并等待每一个响应报文。发送第一个数据包时,TTL值设为1,第一个路由器收到数据包后,TTL值减1,随即丢弃数据包,并返回一个Time Exceeded消息。源设备的tracert收到响应报文后,即可获得该响应报文的源IP地址(路径上的第一个路由器地址)。然后,tracert发送一个TTL值为2的数据包,第一个路由器将TTL值减1,并转发数据包。第二个路由器再将TTL值减1,丢弃数据包并返回一个Time Exceeded消息。tracert收到响应报文后,即可获得该响应报文的源IP地址(路径上的第二个路由器地址)。以此类推,tracert逐跳获得每一个路由器的地址,并探测到目的设备的可达性。


参考资料

互联网控制消息协议- 维基百科,自由的百科全书

24 张图搞定 ICMP :最常用的网络命令 ping 和 tracert

完全理解icmp协议

ICMP协议

ICMP协议详解