您的位置:首页 > 其它

ICMP:internet控制报文协议

2013-05-24 20:27 567 查看

1.引言

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



I C M P报文的格式如图6 - 2所示。所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。



2.ICMP报文的类型

各种类型的I C M P报文如图6 - 3所示,不同类型由报文中的类型字段和代码字段来共同决定。图中的最后两列表明IC M P报文是一份查询报文还是一份差错报文。因为对I C M P差错报文有时需要作特殊处理,因此我们需要对它们进行区分。例如,在对I C M P差错报文进行响应时,永远不会生成另一份I C M P差错报文(如果没有这个限制规则,可能会遇到一个差错产生另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。
当发送一份I C M P差错报文时,报文始终包含I P的首部和产生I C M P差错报文的I P数据报的前8个字节。这样,接收I C M P差错报文的模块就会把它与某个特定的协议(根据I P数据报首部中的协议字段来判断)和用户进程(根据包含在I P数据报前8个字节中的T C P或U D P报文首部中的T C P或U D P端口号来判断)联系起来。





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

3.举例

3.1ICMP地址掩码请求与应答

IC M P地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的I C M P请求报文。I C M P地址掩码请求和应答报文的格式如图6 - 4所示。



I C M P报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。我们可以写一个简单的程序(取名为i c m p a d d r m a s k),它发送一份I C M P地址掩码请求报文,然后打印出所有的应答。
这里的目的地址140.252.13.63是子网的广播地址。
sun % icmpaddrmask 140.252.13.63
received mask = ffffffe0, from 140.252.13.  来自 本 机
received mask = ffffffe0, from 140.252.13.  来自 b s d i
received mask = ffff0000, from 140.252.13.  来自 s v r 4

3.2ICMP时间戳请求与应答

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



3.3ICMP端口不可达差错

UD P的规则之一是,如果收到一份UD P数据报而目的端口与某个正在使用的进程不相符,那么U D P返回一个I C M P不可达报文。
这里有一个例子
bsdi % tftp
tftp> connect svr4 8888        指定主机名和端口号
tftp> get temp.foo             试图得到一个文件
Transfer timed out.            大约25秒后
tftp> quit


c o n n e c t命令首先指定要连接的主机名及其端口号,接着用g e t命令来取文件。敲入g e t命令后,一份U D P数据报就发送到主机s v r 4上的8 8 8 8端口。t c p d u m p命令引起的报文交换结果如图6 - 8所示。



在U D P数据报送到s v r 4之前,要先发送一份A R P请求来确定它的硬件地址(第1行)。接着返回A R P应答(第2行),然后才发送U D P数据报(第3行)一个I C M P端口不可达差错是立刻返回的(第4行)。但是, T F T P客户程序看上去似乎忽略了这个I C M P报文,而在5秒钟之后又发送了另一份U D P数据报(第5行)。在客户程序放弃之前重发了三次。
注意,I C M P报文是在主机之间交换的,而不用目的端口号,而每个2 0字节的U D P数据报则是从一个特定端口( 2 9 2 4)发送到另一个特定端口( 8 8 8 8)。
跟在每个U D P后面的数字2 0指的是U D P数据报中的数据长度。在这个例子中, 2 0字节包括T F T P的2个字节的操作代码, 9个字节以空字符结束的文件名te m p . f o o,以及9个字节以空字符结束的字符串n e t a s c i i(这里涉及T F T P报文的详细格式)。



I C M P的一个规则是, I C M P差错报文必须包括生成该差错报文的数据报I P首部,还必须至少包括跟在该I P首部后面的前8个字节。为什么??
因为首先IP首部后面的前8个字节,包括了源端口号和目的端口号(无论是TCP还是UDP),接受ICMP报文的系统可以根据源端口号来与特定的进程相关联。导致差错的数据报中的IP首部要被送回的原因是因为IP首部中包含了协议字段,使得IC M P可以知道如何解释后面的8个字节。
IC M P不可达报文的一般格式如图6- 1 0所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: