您的位置:首页 > 理论基础 > 计算机网络

《TCP/IP详解 卷一:协议》读书笔记--ICMP:Internet控制报文协议

2015-10-04 17:12 639 查看
6.1、引言



类型字段可以有15个不同的值,以描述特定类型的ICMP报文。

检验和字段覆盖整个ICMP报文,使用的算法与IP首部检验的算法相同。ICMP的检验和是必需的。

6.2、ICMP报文的类型

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

下面各种情况都不会导致产生ICMP差错报文:

1)ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)

2)目的地址是广播地址或多播地址的IP数据报

3)作为链路层广播的数据报

4)不是IP分片的第一片

5)源地址不是单个主机的数据报。就是说,源地址不能为0地址、环回地址、广播地址或多播地址。

这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。

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



ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。

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

6.4、ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间。

返回的建议值是自午夜开始计算的毫秒数,协调的统一时间。这种ICMP报文的好处是它提供了毫秒级的分辨率。



请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值。

6.5、ICMP端口不可达差错

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



ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。导致差错的数据报中的IP首部要被返回的原因是IP首部中包含了协议字段,使得ICMP可以知道如何解释后面的8个字节(本例中是UDP首部)。



我们注意到有16种不同类型的ICMP不可达报文,代码分别从0到15.

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

6.6、ICMP报文的4.4BSD处理



习题:

1、在6.2节的末尾,我们列出了5种不发送ICMP差错报文的特殊条件。如果这些条件不满足而我们又在局域网上向一个似乎不存在的端口号发送一份广播UDP数据报,这是会发生什么情况?

答:如果在局域网线上有一百个主机,每个都可能同一时刻发送一个ICMP端口不可达报文。很多报文的传输都可能发生冲突(如果使用的是以太网),这将导致1秒或2秒时间里网络不可用。

2、阅读RFC,注意生成一个ICMP端口不可达差错是否为“必须”,“应该”,或者“可能”。

答:“should”

3、阅读RFC,看看IP的服务类型字段是如何被ICMP设置的?

答:发送一个ICMP差错总是将TOS置为0。发送一个ICMP查询请求可以将TOS置为任何值,但是发送相应的应答必须将TOS置为相同的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息