TCP/IP协议:ICMP协议

367 阅读3分钟

ICMP协议

ICMP可认为是IP层的一部分,它由IP数据报传输。它传递差错报文以及其他需要注意的信息,ICMP报文通常被IP层或更高层协议(TCP或UDP)使用,一些ICMP报文会把差错报文返回给用户进程。 icmp_pack.png

  • 类型字段可以有15个不同的值,描述不同的ICMP报文;
  • 代码字段是特定类型报文进行进一步地分类;
  • 检验和字段覆盖整个ICMP报文,和IP首部检验和类似;

ICMP主要类型

ICMP地址掩码请求与应答

IMCP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。标识符和序列号由请求端任意指定,在响应时原样返回,这样就可以和请求端匹配。请求地址掩码类似于RARP请求,一般将请求报文发往广播地址,然后由局域网中的某一主机单播发给发送端主机,并填写上32位子网掩码。 icmp_macaddr.png

ICMP时间戳请求与应答

ICMP时间戳用于系统向另一系统查询当前的时间。发送端主机在ICMP数据报中填入起始时间戳,接收端主机在收到请求ICMP报文后填入接收时间戳,在发送响应给请求端时再填入传输时间戳,但一般后两个时间戳都是同一个值。在请求端收到响应数据报后就能计算出往返时间rtt,通过这个值校准出当前时间。

icmp_timesteamp.png

ICMP目的不可达

ICMP目的不可达报文用于告知发送端主机所发送的目的不可达。报文中必须包含产生该差错报文的IP数据报首部(包含选项)和IP数据报中除首部外的数据中前8个字节。由于IP数据报首部包含目的IP地址和对应的协议字段,这样就能正确解析首部后面的8个字节的内容,这样就能清楚地知道是哪个IP哪个端口什么协议导致的不可达异常。

icmp_unreachable.png

ping程序

ping是一个程序,用于测试另一台主机是否可达。该程序会发送一份ICMP回显请求报文到目的主机,并等待返回的ICMP回显应答。ping一般每隔一秒发送一次回显请求,不同的系统会有不同的表现,windows系统会发送四个回显请求,打印出四个请求对应的回显应答,而类Unix系统每隔一秒发送一次,只有用户手动ctrl+c断开才会停止。 icmp_echo.png

  • IP记录路由选项
ping -R xxxx

设置了该-R选项后,IP数据报头部RR选项字段会增加链路所经过的所有IP地址列表(包括来回),如果一个节点有两个IP地址,则取出口地址。而IP首部最大只能是60个字节,扣去基础首部20个字节,RR选项3个字节,就只剩下37个字节用于存放IP地址清单。

  • IP时间戳选项 IP时间戳选项和记录路由选项类似,IP数据报首部选项字段会增加链路所有经过每一个节点的时间戳,一版时间戳选项和记录路由选项是结合一起使用的,因此首部选项字段就会有一对一对的IP地址和对应的时间戳。