国际控制报文协议-ICMP

为了提高IP数据报交付成功的机会,在网络层使用了国际控制报文协议(Internet Control Message Protocol, ICMP)来让主机或路由器报告差错和异常情况。
注:ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。

ICMP报文格式image.png
image.png

ICMP报文的种类
ICMP报文种类有两种:ICMP差错报告报文和ICMP询问报文。

ICMP差错报告报文(4种)
1、终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文;(无法交付)
2、时间超过:当路由器收到生存时间TTL=0数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文;(TTL=0)
3、参数问题:当路由器或目的主机收到的数据报的首部中的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。(首部字段有问题)
4、改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器。

不发送ICMP差错报文的情况
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
对具有多播地址的数据报都不发送 ICMP 差错报告报文。
对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。

ICMP 差错报告报文的数据字段的内容
image.png

ICMP询问报文
1、回送请求和回答报文:主机或路由器向特定目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。测试目的站是否可达以及了解其相关状态。
2、时间戳请求和回答报文:请某个主机或路由器回答当前的日期和时间。用来进行时钟同步和测量时间。

下面的几种 ICMP 报文不再使用:
信息请求与回答报文
掩码地址请求和回答报文
路由器询问和通告报文
源点抑制报文

ICMP的应用
ICMP的两个常见应用是分组网间探测PING(用来测试两台主机之间的连通性)和Traceroute(UNIX中的名字,在Windows中是tracert,可以用来跟踪分组经过的路由)。
其中PING使用了ICMP回送请求和回答报文,
Traceroute (Tracert) 使用了ICMP时间超过报文。
注意: PING工作在应用层,它直接使用网络层的ICMP,而未使用传输层的TCP或UDP。Traceroute/Tracert工作在网络层。

ping 命令原理

  1. ping程序是用来探测 **主机到主机之间是否可通信**,如果不能ping到某台主机,表明不能和这台主机建立连接。<br />** ** ping使用的是**ICMP协议**,**它发送icmp回送请求消息给目的主机**。**ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。**如果源主机在一定时间内收到应答,则认为主机可达。

ping.exe的原理
向指定的IP地址发送一定长度的数据包,按照约定,若指定IP地址存在的话,会返回同样大小的数据包,当然,若在特定时间内没有返回,就是“超时”,会被认为指定的IP地址不存在。
由于ping使用的是ICMP协议,有些防火墙软件会屏蔽ICMP协议,所以有时候ping的结果只能作为参考,ping不通并不一定说明对方IP不存在。

Ping工作过程:
假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一子网内,则当你在主机A上运行“ Ping 192.168.1.2”后,都发生了些什么呢?
1) 首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),
IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并根据ARP协议在一个映射表中查找出IP地址192.168.1.2所对应的物理地址一并交给数据链路层
后者构建一个数据帧目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
其中映射表由ARP实现,ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据链路层的MAC地址。
2) 主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。
接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。
即先由IP地址,在网络层传输,然后再根据mac地址由数据链路层传送到目的主机