(十一)网络层ICMP

ICMP

这篇文章我们一起来学习下网际控制报文协议ICMP。

为了更有效的转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告,它是互联网的标准协议。ICMP报文作为IP数据报的数据部分,加上IP首部,共同组成IP数据报发送出去,报文格式如下图所示:

ICMP报文的种类

ICMP报文的种类有2种,即ICMP差错报告报文和ICMP询问报文。ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码、检验和。接着的4个字节的内容与ICMP的类型有关,最后面是数据字段,其长度取决于ICMP的类型,下表给出了几种常用的ICMP报文类型:

ICMP报文的代码字段是为了进一步区分某种类型中的几种不同情况,检验和字段用来检验整个ICMP报文。因为IP数据报首部的检验和并不检验IP数据报的数据部分,因此不能保证经过传输的ICMP报文不产生差错。如上表所述,ICMP差错报告报文共有4种:

  • 终点不可达
    当路由器或主机不能交付数据报时,就向源点发送终点不可达报文
  • 时间超过
    当路由器收到生存时间为0的数据报时,除了丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文
  • 参数问题
    当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文
  • 改变路由(重定向)
    路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(有更好的路由)。互联网的主机也要有一个路由表,当主机要发送数据时,首先是查找自己的路由表,看应当从哪一个接口把数据报发送出去。因为互联网中主机的数量远大于路由器的数量,所以出于效率的考虑,这些主机不和连接在网络上的路由器定期交换路由信息。在主机刚开始工作时,,一般都在路由表中设置一个默认路由器的IP地址,不管数据报要发送到哪个目的地址,都一律先把数据报传送给这个默认路由器,而这个默认路由器知道到每一个目的网络的最佳路由。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应当经过网络上的另一个路由器R时,就用改变路由报文把这一情况告诉主机。于是,该主机就在其路由表中增加一个项目:到某某目的地址应经过路由器R(而不是默认路由器)。

所有的ICMP差错报告报文中的数据字段都具有同样的格式,如下图所示:

把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段,再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(TCP、UDP)以及运输层报文的发送序号(TCP)。

下面是不应发送ICMP差错报告报文的几种情况:

  • 对ICMP差错报告报文,不再发送ICMP差错报告报文
  • 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
  • 对具有多播地址的数据报,都不发送ICMP差错报告报文
  • 对具有特殊地址(127.0.0.1 | 0.0.0.0)的数据报,不发送ICMP差错报告报文

常见的ICMP询问报文有两种:
(1)回送请求和回答
ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
(2)时间戳请求和回答
ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量。

原文地址:https://www.cnblogs.com/cone/p/14916802.html