TCP/IP详解(六)ICMP:Internet控制报文协议

       I C M P经常被认为是 I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。I C M P报文通常被 I P层或更高层协议( T C P或U D P)使用。一些 I C M P报文把差错报文返回给用户进程。


一、ICMP报文格式


类型:所有报文的前4个字节都是一样的,类型字段可以有 1 5个不同的值,以描述特定类型的 I C M P报文。某些 I C M P报文还使用代码字段的值来进一步描述不同的条件。

检验和字段覆盖整个 ICMP报文。使用的算法与我们在 3.2节中介绍的IP首部检验和算法相同。


二、ICMP报文类型


      不同类型由报文中的类型字段和代码字段来共同决定。

      当发送一份 ICMP差错报文时,报文始终包含 IP的首部产生ICMP差错报文的 IP数据报的前8个字节。这样,接收 I C M P差错报文的模块就会把它与某个特定的协议(根据 I P数据报首部中的协议字段来判断)和用户进程(根据包含在 I P数据报前 8个字节中的 T C P或U D P报文首部中的TCP或UDP端口号来判断)联系起来。

      下面各种情况都不会导致产生 ICMP差错报文:
      1) ICMP差错报文(但是, ICMP查询报文可能会产生 ICMP差错报文)。
      2) 目的地址是广播地址(见图 3-9)或多播地址( D类地址,见图1-5)的IP数据报。
      3) 作为链路层广播的数据报。
      4) 不是IP分片的第一片(将在 11.5节介绍分片)。
      5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
      这些规则是为了防止过去允许 ICMP差错报文对广播分组响应所带来的广播风暴。


下面介绍几种ICMP类型:

三、ICMP地址掩码请求与应答

      I C M P地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码( 3 . 5节)。系统广播它的ICMP请求报文。无盘系统获取子网掩码的另一个方法是 B O O T P协议。 I C M P地址掩码请求和应答报文的格式如图 6-4所示。


        I C M P报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。

       RFC规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答。但是,大多数主机在收到请求时都发送一个应答,甚至有一些主机还发送差错的应答。


四、ICMP时间戳请求与应答

       I C M P时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC )(早期的参考手册认为U T C是格林尼治时间)。这种 I C M P报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些 U n i x系统提供的 r d a t e命令)只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。ICMP时间戳请求和应答报文格式如图 6-6所示。


例子:

      A向B发送时间请求,图中数值为自午夜开始计算的毫秒数


  A的时间应设为 T(A) = 83573338 + (83573340 - 83573336) - (83573338 - 83573336) / 2


五、ICMP端口不可达差错

      U D P的规则之一是,如果收到一份 U D P数据报而目的端口与某个正在使用的进程不相符,那么U D P返回一个 I C M P不可达报文。

      ICMP端口不可达差错报文一般格式


        ICMP端口不可达差错代码是3。另外,尽管图6-10指出了在ICMP报文中的第二个32 bit字必须为0,但是当代码为4时(“需要分片但设置了不分片比特”),路径MTU发现机制(2.9节)却允许路由器把外出接口的MTU填在这个32 bit字的低16 bit中。

     例子:A从2924端口向B的8888端口请求文件temp.foo,而8888端口没有提供服务


       注意,I C M P报文是在主机之间交换的,而不用目的端口号,而每个 2 0字节的U D P数据报

       I C M P的一个规则是, I C M P差错报文(参见图 6 - 3的最后一列)必须包括生成该差错报文的数据报 I P首部(包含任何选项),还必须至少包括跟在该 I P首部后面的前 8个字节。在我们的例子中,跟在 IP首部后面的前8个字节包含 UDP的首部。一个重要的事实是包含在 U D P首部中的内容是源端口号和目的端口号。

你可能感兴趣的:(网络)