文章目录
- 6.1 引言
- 6.2 ICMP报文分组格式和类型
- 6.3 ICMP地址掩码请求与应答
- 6.4 ICMP时间戳请求与应答
- 6.5 ICMP端口不可达差错
- 6.6 ICMP的处理(4.4BSD系统下)
6.1 引言
第三章在IP选择路由时,如果一个报文最后限制转发次数用完后还传输不到目的地址,该报文就会被丢弃,并发送一个ICMP报文给源IP。
ICMP通常被认为是IP的一部分,用来传输差错报文和其他需要注意的信息。ICMP报文在IP数据报内部被传输
它通常被IP或者更高层协议(TCP和UDP)使用
6.2 ICMP报文分组格式和类型
所有报文前四个字节都是一样的,剩下字节各不相同。
- 类型字段:可以有15个不同的值即15中不同类型选项。
- 代码字段:某些ICMP还用代码字段进一步描述不同的条件。
- 检验和:检验和覆盖整个ICMP报文。检验和是必须的。
ICMP的类型由类型字段和代码字段共同决定。大类上分为查询报文和差错报文,因为差错报文要进行特殊处理,所以要对两者进行区分
注意在对一个ICMP差错报文进行响应时永远不会生成另一份差错报文(不然就会出错再出错无限循环)。
下面各种情况都不会产生ICMP差错报文。是为了防止ICMP差错报文对广播分组带来的广播风暴。
- ICMP差错报文(ICMP查询报文可能会)。
- 目的地址是广播地址或多播地址的IP数据报。
- 作为链路层广播的数据报。
- 不是IP分片的第一片。
- 源地址不是单个主机的数据报。
6.3 ICMP地址掩码请求与应答
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码(3.5节)。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用 RARP获取IP地址是类似的)。无盘系统获取子网掩码的另一个方法是BOOTP协议
ICMP地址掩码请求与应答报文分组格式如下:
ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。
6.4 ICMP时间戳请求与应答
ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC)(早期的参考手册认为UTC是格林尼治时间)。这种ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些 Unix系统提供的rdate命令)只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。
请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值(提供三个字段的原因是可以让发送方分别计算发送请求的时间和发送应答的时间)。
我们还能计算出往返时间(rtt),它的值是收到应答时的时间值减去发送请求时的时间值。difference的值是接收时间戳值减去发起时间戳值。这些值之间的关系如图6 - 7所示。
如果我们相信RTT的值,并且相信RTT的一半用于请求报文的传输,另一半用于应答报文的传输,那么为了使本机时钟与查询主机的时钟一致,本机时钟需要进行调整,调整值是difference减去RTT的一半。
其他获得时间的方式:
- 日期服务程序和时间服务程序。
- 网络时间协议(NTP)。广域网范围工作。
- 分布式时间服务(DTS)也提供计算机之间的时钟同步。广域网范围工作
- Unix的timed(8),用来同步局域网上的系统时钟。
6.5 ICMP端口不可达差错
是一种ICMP差错报文,即端口不可达报文,它是ICMP目的不可到达报文中的一种,以此来看一看ICMP差错报文中所附加的信息。
UDP的规则之一是,如果收到一份 UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。可以用 TFTP来强制生成一个端口不可达报文。
注意,ICMP报文是在主机之间交换的,而不用目的端口号,而每个20字节的UDP数据报则是从一个特定端口(2924)发送到另一个特定端口( 8888)。
我们可以看到每个返回的 ICMP端口不可达报文的完整长度。这里的长度为70字节
ICMP的一个规则是, ICMP差错报文(参见图 6 - 3的最后一列)必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该 IP首部后面的前 8个字节。在我们的例子中,跟在IP首部后面的前8个字节包含UDP的首部。
一个重要的事实是包含在 UDP首部中的内容是源端口号和目的端口号。就是由于目的端口号(8888)才导致产生了 ICMP端口不可达的差错报文。接收 ICMP的系统可以根据源端口号(2924)来把差错报文与某个特定的用户进程相关联(在本例中是 TFTP客户程序)。
导致差错的数据报中的 IP首部要被送回的原因是因为 IP首部中包含了协议字段,使得ICMP可以知道如何解释后面的 8个字节(在本例中是 UDP首部)。如果我们来查看 TCP首部,可以发现源端口和目的端口被包含在 TCP首部的前8个字节中。
6.6 ICMP的处理(4.4BSD系统下)
由于ICMP覆盖的范围很广,从致命差错到信息差错,因此即使在一个给定的系统实现中,对每个ICMP报文的处理都是不相同的。
如果最后一列标明是“内核”,那么ICMP就由内核来处理。如果最后一列指明是“用户进程”,那么报文就被传送到所有在内核中登记的用户进程,以读取收到的 ICMP报文。如果不存在任何这样的用户进程,那么报文就悄悄地被丢弃(这些用户进程还会收到所有其他类型的IC MP报文的拷贝,虽然它们应该由内核来处理,当然用户进程只有在内核处理以后才能收到这些报文)。有一些报文完全被忽略。最后,如果最后一列标明的是引号内的一串字符,那么它就是对应的 Unix差错。