计算机网络-4-5-网际控制报文协议ICMP

ICMP(网际控制报文协议)

为了更加有效地转发IP数据报和提高交付的机会,在网络层使用网际控制报文协议ICMP(Internet Control Message Protocol)[RFC792],ICMP允许主机或者路由器报告差错情况和提供有关异常情况的报告。ICMP是互联网的协议标准。但ICMP**并不是高层协议。因为ICMP报文是封装在IP数据报中,ICMP报文作为IP数据报的数据部分。加上IP数据报的首部,组成了IP数据报。ICMP报文格式如图4-27所示:

image

ICMP报文的种类

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

ICMP报文的前4个字节是统一的,共有三个字段:

  • 类型:不同类型的值代表着不同的ICMP报文的类型。
  • 代码:代码字段是为了进一步区分某种类型中的几种不同情况。
  • 检验和:用来检验整个整个ICMP报文。

接着的4个字节决定ICMP类型,最后是数据字段,其长度取决于ICMP的类型。图4-8给出了几种常见的ICMP报文类型:

image
  • ICMP差错报告报文有四种

    1. (类型:3)终点不可达:当路由器或者主机不能交付数据报时就向源点发送终点不可达报文。
    2. (类型:11)时间超时:当路由器收到TTL=0的数据报时,除了丢弃这个数据报,还要向源地点发送时间超时报文。
    3. (类型:12)参数问题:当路由器或者目的主机接收到的数据报的首部有的字段不正确时候,就丢弃这个报文,并向源地点发送参数问题报文。
    4. (类型:5)改变路由(重定向):路由器把改变路由报文发送给主机,让主机下一应该将数据报发送给另外的路由器(可能是有更好的路由)。

下面对改变路由报文进行简单的解释:我们知道,在互联网上的主机也有有一个路由表。当主机要发送数据报的时候,首先是查找自己的路由表,看应该从哪一个接口把数据报发送出去。在互联网上主机的数量远远大于路由器的数量,出于效率的考虑,这些主机不和连接在网络上的路由器定期交换路由信息。在主机刚开始工作的时候一般都在路由表中设置一个默认路由的IP地址,不管数据报要发送到哪一个目的地址,都一律先把数据报发送给路由器,而这个默认路由器知道每一个目的网络的最佳路由(通过和其它路由器交换路由信息)。如果默认路由发现主机发往某个目的主机的数据报的最佳路由应当经过网络上的另一个路由器R的时候,就用改变路由报文把这种情况告诉主机,于是,该主机就在其路由表中增加一个项目:到某某目的地址应当经过路由器R(而不是默认路由器)。

所有的ICMP差错报文中的数据字段都具有同样的格式(图4-28),把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报文的前8个字节,就构成了ICMP差错报文。

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

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

ICMP询问报文有两种

  1. (8/0)回送请求和回答:ICMP回送请求报文是路由器或者主机向一个特定的目标主机发送的询问。收到报文的主机必须向源主机或者路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达等相关信息。
  2. (13/14)时间戳的请求与回答:ICMP时间戳请求报文是请某台主机或者路由器回答当前的日期和时间,在ICMP时间戳回答报文里一共有32个位的字段,其中写入的整数代表从1900年1月1日到当前时刻一共有多少秒,时间戳请求与回答可用于时钟同步和时间测量

ICMP应用举例

ICMP一个重要作用就是ping(packet Internet Groper)用来测试两台主机的连通性。ping使用了ICMP回送请求与回送回答报文。ping 是应用层直接使用网络层ICMP的一个例子,它没有经过运输层的TCP或者UDP。

另一个命令是tracert命令,它用来跟踪一个分组从源点到终点的路径,tracert从源主机向目的主机发送一连串的IP数据报,数据包中封装的是无法交付的UDP用户数据报。

你可能感兴趣的:(计算机网络-4-5-网际控制报文协议ICMP)