ICMP


作用:ICMP协议主要用来检测网络通信故障和实现链路追踪

IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。ICMP不是高层协议,而是IP层的协议。

为了更有效的转发IP数据报和提高交付成功的机会,在网络层使用了网络控制报文协议ICMP(Internet Control Message Protocol)

主机或路由器使用ICMP来发送差错报文和询问报文

ICMP报文被封装在IP数据报中发送

ICMP差错报告报文:

  1. 终点不可达
    1. 网络不可达
    2. 目的主机不可达
    3. 目的协议不可达
    4. 目的端口不可达
    5. 目的网络未知
    6. 目的主机未知
    7. 等等十三种
  2. 源点抑制:当路由器或主机由于拥塞而丢弃数据时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
  3. (生存)时间超过:
    1. 当路由器收到一个一个目的地址不是自己的IP数据报,会将生存时间TTL字段的值减1
      1. 若结果不为0,则将该数据报转发出去
      2. 若结果为0,除丢弃该IP数据报外,还要向源点发送时间超过报文
    2. 当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超出报文
  4. 参数问题
    1. 当路由器或目的主机收到IP数据报后,根据首部中的检验字段和发现首部在传输过程中出现误码,就丢弃该数据报,并向源点发送参数问题报文
  5. 改变路由(重定向)
    1. 路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器

以下情况不应发送差错报告报文

  1. 对ICMP差错报告报文不再发送ICMP差错报告报文
  2. 对第一个分片的数据报片的所有后续数据报片都不发生ICMP差错报告报文
  3. 对具有多播地址的数据报都不发送ICMP差错报告报文
  4. 对具有特殊地址的数据报不发送ICMP差错报告报文

ICMP询问报文

回送请求和问答

ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问

收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文

这种询问报文用来测试目的站是否可达及了解其有关状态

时间戳请求和问答

ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间

在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时间一共有多少秒

这种询问报文用来进行时钟同步和测量时间

ICMP应用举例

分组网间探测PING(Packet InterNet Groper)

  1. 用来测试主机或路由器间的连通性
  2. 应用层直接使用网络层的ICMP(没有通过TCP或UDP)
  3. 使用ICMP回送请求和回答报文

跟踪路由traceroute

  1. 用来测试IP数据报从源主机到达目的主机主要经过哪些路由器
  2. Windows版本
    1. tracert命令
    2. 应用层直接使用网络层ICMP
    3. 使用ICMP回送请求和回答报文以及差错报告报文
  3. Unix版本
    1. traceroute命令
    2. 在运输层使用UDP协议
    3. 仅使用ICMP差错报告报文