4.8 网际控制报文协议ICMP
# 4.8 网际控制报文协议ICMP
本节课我们介绍网际控制报文协议ICMP (Internet Control Message Protocol)
- 为了更有效的转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP。
- 主机或路由器使用ICMP协议来发送差错报告报文和询问报文。
- ICMP报文被封装在IP数据报中发送。
ICMP差错报告报文共有以下5种,它们分别是终点不可达,源点抑制,时间超过,参数问题,改变路由(重定向)。
我们首先来看终点不可达,当路由器或主机不能交付数据报时,就像源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达,目的主机不可达,目的协议不可达,目的端口不可达,目的网络未知,目的主机未知等13种错误。我们来举例说明,假设主机H1给H2发送IP数据报,H1会将IP数据报发送给路由器R1,由R1帮其转发,若R1的路由表中没有网络N3的路由记录,默认路由,以及主机H2的特定主机路由,则R1旧不知道如何转发该数据报,只能将其丢弃,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为终点不可达。
来看源点抑制,当路由器或主机由于拥塞而丢弃数据报时,就像源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
例如H1给H2发送IP数据报,当该数据报传输到路由器R2时,由于R2拥塞也就是R2比较繁忙,R2根据自己的丢包策略,丢弃了该数据报,并向发送该数据报的源主机H1发送 ICMP差错报告报文,其类型为源点抑制,
又例如H1给H2发送IP数据报,当该数据报传输到H2时,由于H2拥塞就丢弃了该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为源点抑制
来看时间超过。当路由器收到一个目的IP地址不是自己的IP数据报时,会将其生存时间TTL字段的值减一,若结果不为0,则将数据报转发出去;若结果为0,除丢弃该数据报外,还要向源点发送时间超过报文。例如某个生存时间等于2的IP数据报传输到了路由器R1,R1将其生存时间减一后,结果是一,这表明该数据报的生存时间还没有结束,R1将其转发出去,当该数据报传输到路由器R2后,R2将其生存时间减一号结果是0,这表明该数据报的生存时间结束了,R2丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过
另外当终点在预先规定的时间内,不能收到一个数据报的全部数据报片时,就把已收到的数据包片都丢弃,也会向源点发送时间超过报文
来看参数问题。当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段,发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。例如这是H1发送给H2的IP数据报,假设该数据报在传输过程中受到了干扰,其首部出现了误码,当该数据报传输到路由器R1后,R1检测出该数据报的首部出错,于是丢弃该数据报,并向发送该数据报的源主机H1发送 IC MP差错报告报文,其类型为参数问题。
再来看改变路由,路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器,这样可以通过更好的路由。我们来举例说明。假设我们给主机H1指定的默认网关是路由器R1,则H1要发往网络N2的IP数据报,都会传输给R1,由其帮忙转发,当R1发现H1发往N2的数据报的最佳路由,不应当经过R1,而是应当经过R4时,就用改变路由报文,把这个情况告诉主机,于是H1就在自己的路由表中添加一个项目,到达N2应经过路由器R4,而不是默认网关R1。之后H1要发往N2的IP数据报,都会传输给R4由其帮忙转发。
需要注意的是以下情况不应发送ICMP差错报告报文,
对ICMP差错报告报文,不再发送ICMP差错报告报文。
对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文,
对具有多播地址的数据报,都不发送ICMP差错报告报文,对具有特殊地址,例如127.0.0.0或0.0.0.0的数据报,不发送ICMP差错报告报文。
练习:这是计算机专业考研全国统考,计算机网络部分2010年的题36,答案是选项C
接下来我们介绍常见的两种ICMP询问报文,
- 一种是回送请求报文及其回答报文,ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文,这种询问报文用来测试目的站是否可达,以及了解其有关状态。
- 另一种是时间戳请求报文及其回答报文。ICMP时间戳请求报文,是请求某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒,这种询问报文用来进行时钟同步和测量时间
接下来我们介绍利用ICMP协议的两个典型应用,一个是分组网间探测PING(Packet Internet Groper),另一个是跟踪路由。
首先来看分组网间探测,该应用用来测试主机或路由器之间的连通性,其应用层直接使用网际层的ICMP协议,而不通过运输层的TCP或UDP协议。所使用的ICMP报文类行为回送请求和回答,如下所示。这是在我的主机的WINDOWS命令行中使用拼命令来测试该主机与我校官方网站服务器的连通性。
再来看跟踪路由,该应用用来测试IP数据报,从源主机到达目的主机要经过哪些路由器,在该应用的WINDOWS版本中,具体命令为tracert。其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。在该应用的UNIX版本中,具体命令为traceroute、其在运输层使用UDP协议,在网际层使用的ICMP报文类型,只有差错报告报文如下所示,这是在我的主机的WINDOWS命令行中是用tracert命令来测试该主机与我校官方网站服务器之间要经过哪些路由器。
请大家思考一下 tracert命令的实现源理是什么?我们来举例说明,假设主机H1想知道到达主机H2要经过哪些路由器,H1就给H2发送ICMP回送请求报文,该报文被封装在IP数据报中,IP数据报首部中生存时间字段TTL的值被设置为一,该IP数据报到达R1后,其生存时间减1,结果为0。R1丢弃该数据报,并向发送该数据报的源主机H1,发送ICMP差错报告报文,其类型为时间超过,这样 H1就知道了到达H2的路径中的第一个路由器,
H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中生存时间字段TTL的值被设置为二,经过R1的转发后,该数据包的生存时间减少为一,该IP数据报到达R2后,其生存时间减1,结果为0,R2丢弃该数据报,并向发送该数据报的源主机H1,发送ICMP差错报告报文,其类型为时间超过这样 H1就知道了到达H2的路径中的第二个路由器,
H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中生存时间字段TTL的值被设置为三,经过R1和R2的转发后,该数据报到达主机H2,其生存时间减少为一,H2解析该数据报,发现其内部封装的是ICMP回送请求报文,于是就给H1发送封装有ICMP回送请求回答报文的IP数据报,这样 H1就知道已经跟踪到路径中的最后一站,也就是目的主机H2
本节课的内容小结如下