2.6.2 典型的ICMP报文

测试目的站的可达性和状态

命令PING(Packet InterNet Groper)被用来测试目的站的可达性。它是通过ICMP的回送请求和回送应答报文来实现的。

原理:主机或路由器向指定目的站发送ICMP请求报文,接收回送请求的目的站形成一个回送应答,并返回给最初的发送者。回送请求包含一个可选数据区;应答包含了在请求中所发送数据的一份副本。这样,请求发送方就能据此判断目的站的可达性。

请求和应答成功说明了什么呢?

请求和应答成功的必要条件是:

源主机上的IP软件必须路由该数据报;

在源站和目的站之间的中间路由器必须正在运行,并对该数据报进行了正确的路由;

目的主机必须正在运行,并且ICMP和IP软件工作正常;

返回路径上的路由器正在运行,并且进行了正确的路由。

因此,请求和应答成功说明上述环节的设备和处理是正常的。

目的站不可达报告

当路由器无法转发或交付IP数据报时,向最初的源站发回一个目的站不可达报文,并在代码字段中说明不可达的原因。

拥塞和数据流控制

当路由器发生拥塞时,每丢弃一个数据报,就会向该数据报的源站发送一个源站抑制报文,以降低源站向目的站发送数据报的速率,以便缓解网络的拥塞情况。

改变路由请求

路由器一般会定期交换路由信息,以适应网络改变并保持它们的路由更新。而主机则从最少的路由信息开始,并从路由器那里获得新的路由信息。主机通常在配置中设定一个默认的路由器,当主机需要将数据报传输到其它网络时,将数据报发送给该路由器。当默认路由器发现该数据报需要经过同一网络上的其它路由器来路由更加合理,就会向主机发送一个重定向的ICMP报文,通知主机将发送到该网络的数据报交付给新的路由器,而不是默认路由器。于是,主机将记录该信息,并调整其路由。

检测循环或过长的路由

我们知道,在IP数据报的首部中有一个TTL字段,该字段每经过一个路由器,其计数值减1,当计数减至0时,路由器向数据报的源站发送一个ICMP超时报文。

另外,IP数据报如果发生了分片,那么在目的主机处需要对分片进行重组,即收集一个数据报的所有分片。当数据报的第一个分片到达目的主机时,目的主机启动一个定时器,如果该数据报的所有分片不能在定时器超时前到达,那么,就认为出现了差错。由目的主机向源主机发送一个分片重组超时的ICMP报文。

报告其它问题

当路由器或主机发现一个数据报的首部中某个字段内容不正确时,向源主机发送一个参数问题ICMP报文。该报文仅在问题严重到必须把数据报丢弃时才发送。在报文中有一个八位组的指针,指示存在参数问题的位置。

时钟同步和传输时间估计

该ICMP报文用于获得其他机器的时间。

请求主机向目的主机发送一个ICMP时间戳请求报文,要求它返回当日的当前时间值;目的主机返回一个时间戳应答报文。在报文中包含一个序列号,用于记录一对请求和应答。报文中包含3个时间戳信息:初始时间戳由初始发送的请求主机在传输该报文时填写,接收时间戳由目的主机在刚接收到时间戳请求报文时填写,传送时间戳在应答时间戳报文发送的瞬间填写。主机根据这三个时间戳字段来估计传输过程中的时延并同步它们的时钟。由于精确估计全程往返时延很困难,因此往往通过多次测量的平均值来求得全程往返时延。

获得子网掩码

当主机使用子网编址时,它们的IP地址中的主机号部分的某些比特用于标识物理网络。为了参与子网编址,主机必须知道32比特IP地址中的哪些比特对应于物理网络,哪些对应于主机标识符。这一信息通过子网掩码来表示。于是主机可以向路由器发出一个地址掩码请求报文,并接收一个地址掩码应答报文。发出请求的主机如果知道路由器的地址,可以直接把请求报文发送给该路由器。如果不知道路由器的地址,可以广播该报文。

路由器发现

当主机自举后,在向其它网络上的目的主机发送数据前,必须知道至少一个本地网络上的路由器地址。

ICMP提供了一种机制用于主机获得路由器的地址。路由器通过该机制定期向所连接网络的主机通报路由器的地址。如果主机和网络支持组播,路由器可以通过组播方式把通告报文发送到全系统,如果主机和网络不支持组播,则可以通过广播方式来发送通告报文。

通常,路由器通告的时间间隔为10分钟。

另外,路由器通告地址并不是主机获得路由器地址的唯一方式,主机还可以通过BOOTP和DHCP协议来查找路由器的地址。但是这两种方式获得的路由器信息来自于网络管理员手工的配置。如果路由器发生故障,或者变更地址信息,则不能及时通告主机改变这一信息。

路由器恳求

当主机自举时,如果要获得路由器定期通告的地址信息,往往需要等几分钟。这对主机而言是不可容忍的。路由器恳求报文的作用是让主机能够直接请求路由器及时发布地址通告。如果主机支持组播,可以通过全路由器组播地址(224.0.0.2)发送该报文;如果主机不支持组播,则可以通过广播方式发送该报文。