TCP/IP-02-ICMP

来源:互联网 发布:荷塘月色淘宝论坛首页 编辑:程序博客网 时间:2024/05/01 07:35

 第6章ICMP:Internet控制报文协议
6.1 引言
ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。
ICMP报文通常被IP层或更高层协议( TCP或UPD)使用。
一些ICMP报文把差错报文返回给用户进程。
ICMP报文是在IP数据报内部被传输的,如
图6 - 1所示。
ICMP 的正式规范参见RFC 792 [Posterl1 9 8 1 b ]。
ICMP报文的格式如图6 - 2所示。
|----------IP数据报---------------|
|IP header| ICMP 报文             |
| 20 byte |                       |
|---------------------------------|
|---ICMP封闭在IP数据内部----------|

所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。
下面我们将逐个介绍各种报文格式。类型字段可以有1 5个不同的值,以描述特定类型的ICMP报文。
某些ICMP报文还使用代码字段的值来进一步描述不同的条件。
检验和字段覆盖整个ICMP报文。
使用的算法与我们在3 . 2节中介绍的IP首部检验和算法相同。ICMP的检验和是必需的。
|----------ICMP报文---------------|
|0--------7 8-------15 16-------31|
|8位类型   |8位代码    |16位检验和|
|---------------32 位-------------|
|                                 |
/            数据内容             /
|---------------------------------|
在本章中,我们将一般地讨论ICMP报文,并对其中一部分作详细介绍:
地址掩码请求和应答、时间戳请求和应答以及不可达端口。

6.2 ICMP报文的类型
各种类型的ICMP报文如图ICMP报文所示,不同类型由报文中的类型字段和代码字段来共同决定。
图中的最后两列表明ICMP报文是一份查询报文还是一份差错报文。
因为对ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。
例如,在对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文。
当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。
这样,接收ICMP差错报文的模块就会把它与某个特定的协议和用户进程联系起来。

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

6.3 ICMP地址掩码请求与应答
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码( 3 . 5节)。
系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取IP地址是类似的)。
无盘系统获取子网掩码的另一个方法是B O O T P协议,我们将在第1 6章中介绍。
ICMP地址掩码请求和应答报文的格式如图所示。

 ----ICMP地址掩码请求和应答报文---  --
|0-----7 8-----15 16------------31| |
|8位类型 8位代码 |  16位检验和    | |
|---------------32 位-------------|12字节
|   标识符       | 序列号         | |
|---------------------------------| |
|            32位子网掩码         | |
|---------------------------------| --
ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。
这样,发送端就可以把应答与请求进行匹配。
我们可以写一个简单的程序(取名为ICMP a d d r m a s k),
它发送一份ICMP地址掩码请求报文,然后打印出所有的应答。
由于一般是把请求报文发往广播地址,因此这里我们也这样做。
目的地址( 1 4 0 . 2 5 2 . 1 3 . 6 3)是子网1 4 0 . 2 5 2 . 1 3 . 3 2的广播地址。
sun % icmpaddrmask 140.252.13.63
received mask = ffffffe0, from 140.252.13.来3自3 本 机
received mask = ffffffe0, from 140.252.13.来3自5 b s d i
received mask = ffff0000, from 140.252.13.来3自4 s v r 4
在输出中我们首先注意到的是,从s v r 4返回的子网掩码是错的。
显然,尽管s v r 4接口已经设置了正确的子网掩码,
但是S V R 4还是返回了一个普通的B类地址掩码,就好像子网并不存在一样。
svr4 % ifconfig emd0
emd0: flags=23<UP,BROADCAST,NOTRAILERS>
inet 140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63
S V R 4处理ICMP地址掩码请求过程存在差错。
我们用TCP d u m p命令来查看主机b s d i上的情况。
我们用- e选项来查看硬件地址。

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

6.4.1 举例
我们可以写一个简单程序(取名为ICMP t i m e),打印出返回的应答。
它在我们的小互联网上运行结果如程序打印出ICMP报文中的三个时间戳:
发起时间戳及发送时间戳( x m i t)。
正如我们在这个例子以及下面把接收时间戳和发送时间戳都设成相同的值。
我们还能计算出往返时间(r t t),它的值是收到应答d i f f e r e n c e的值是接收时间戳值减去发起时间戳值。
6.4.2 另一种方法
还可以用另一种方法来获得时间和日期。
1) 在1 . 1 2节中描述了日期服务程序和时间服务程序。
前者是以人们可读的格式返回当前的时间和日期,是一行A S C I I字符。
可以用telnet命令来验证这个服务:
另一方面,时间服务程序返回的是一个3 2 b i t的二制进数值,表示自U T C,1 9 0 0年1月1日午夜起算的秒数。
这个程序是以秒为单位提供的日期和时间(前面我们提过的rdate命令使用的是TCP时间服务程序)。
2) 严格的计时器使用网络时间协议( N T P),
该协议在RFC 1305 中给出了描述[ M i l l s1 9 9 2 ]。
这个协议采用先进的技术来保证L A N或WA N上的一组系统的时钟误差在毫秒级以内。
对计算机精确时间感兴趣的读者应该阅读这份R F C文档。
3) 开放软件基金会( O S F)的分布式计算环境( D C E)定义了分布式时间服务( D T S),
它也提供计算机之间的时钟同步。
4) 伯克利大学的U n i x系统提供守护程序t i m e d( 8 ),来同步局域网上的系统时钟。
不像N T P和D T S,t i m e d不在广域网范围内工作。
6.5 ICMP端口不可达差错
最后两小节我们来讨论ICMP查询报文—地址掩码和时间戳查询及应答。
现在来分析一种ICMP差错报文,即端口不可达报文,它是ICMP目的不可到达报文中的一种,
以此来看一看ICMP差错报文中所附加的信息。

6.6 ICMP报文的4.4BSD处理
由于ICMP覆盖的范围很广,从致命差错到信息差错,
因此即使在一个给定的系统实现中,对每个ICMP报文的处理都是不相同的。

6.7 小结
本章对每个系统都必须包括的Internet控制报文协议进行了讨论。
我们详细讨论了ICMP地址掩码请求和应答以及时间戳请求和应答。
这些是典型的请求—应答报文。二者在ICMP报文中都有标识符和序列号。
发送端应用程序在标识字段内存入一个唯一的数值,以区别于其他进程的应答。
序列号字段使得客户程序可以在应答和请求之间进行匹配。
我们还讨论了ICMP端口不可达差错,一种常见的ICMP差错。
对返回的ICMP差错信息进行了分析:导致差错的IP数据报的首部及后续8个字节。
这个信息对于ICMP差错的接收方来说是必要的,可以更多地了解导致差错的原因。
这是因为TCP和UPD都在它们的首部前8个字节中存入源端口号和目的端口号。

习题
6.1 在6 . 2节的末尾,我们列出了5种不发送ICMP差错报文的特殊条件。
如果这些条件不满足而我们又在局域网上向一个似乎不存在的端口号发送一份广播UPD数据报,
这时会发生什么样的情况?
6.2 阅读RFC [Braden 1989a],注意生成一个ICMP端口不可达差错是否为“必须”,
“应该”或者“可能”。这些信息所在的页码和章节是多少?
6.3 阅读RFC 1349 [Almquist 1992],看看IP的服务类型字段是如何被ICMP设置的?
6.4 如果你的系统提供n e t s t a t命令,请用它来查看接收和发送的ICMP报文类型。

原创粉丝点击