5.2.7 因特网控制报文协议ICMP
我们知道因特网的技术核心是IP数据报,IP数据报的最大特点是无连接不可靠,但实际中因特网中也会存在通信线路或者是处理器的故障、路由器拥塞等等使得无法接收或者处理数据报,路由表也误导导致出现路由环路等原因都有可能使得数据报交付失败,因此因特网也需要差错检查与纠正的机制,虽然他不直接纠错,但是在互联网网络层有一个IP配套的协议或者称之为扩充的协议称之为ICMP,他提供了一种差错报告机制,用于路由器或者目的主机把发生的交付的问题,或者是路由的问题通告给发出IP数据报的源主机,此外ICMP还能提供给用户有实际价值的信息,这里我们就来深入学习一下ICMP的知识。
一、ICMP概念
-
ICMP(Internet Control Message Protocol)是因特网控制报文协议的简称,是TCP/IP协议族的子协议
-
ICMP用于在IP主机、路由器之间传递控制消息。这里的控制信息是指:网络通不通、主机是否可达,路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但他对于用户数据的传递却起着非常重要的作用。
-
ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。如图
ICMP报文是由ICMP的首部和数据两个部分组成,ICMP首部由固定的8字节,前4个字节是通用部分,后四个字节会随着报文类型的不同而有所差异,ICMP报文的传递需要IP的支持,也就是说每个ICMP报文不能够独立的去传输,而是要封装到IP数据报中,源IP地址为发送报告的机器的IP地址,目的IP地址为出现差错的数据报源站的IP地址。ICMP是IP协议必要的组成部分,因此我们不能将其当成高层的协议。它是在网络层的一个协议。所以ICMP在网络的传输过程中看起来就像一个普通的IP数据报一样。那么网络设备或者是主机如何识别网络中传输的就是ICMP报文呢?这里我们要回顾一下前面介绍的IP数据报首部中的一些知识。如图
我们知道在IP数据报首部中有一个协议字段,该字段就指明了数据报封装了哪个协议的协议数据单元,可以是ICMP,IGMP,当协议字段的值为1的时候就表示IP数据报中封装的是来自于ICMP协议的报文。
-
ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。
二、ICMP报文种类
-
ICMP报文分为两种大的类型即ICMP差错报告报文和ICMP讯问报文。
-
ICMPC差错报告报文是指当IP数据报出现差错的时候路由器或者主机就会发出此类报文,产生ICMP差错报告的同时会丢弃这个出现差错的IP数据报。ICMP差错报告报文只会向引起问题的IP数据报的源站报告差错,不负责纠正差错。纠正差错是留给高层进行操作的。
-
为什么ICMP报文仅仅是发给引起问题的数据报的源站呢?原因是IP数据报只含有源目的主机的IP地址,一般它并不包含所走路径的完整记录。而且他也实在无法确定究竟这条路上的哪个网络节点应该为网络问题来负责。所以ICMP报文仅仅发给引起问题的数据报的源站是最合理的选择。
-
报告差错的ICMP报文总是复制了产生问题IP数据报的首部和前8个字节也就是前64比特数据。这其中就包含了IP数据报的首部,端口号,TCP序列号等等信息以便让接收方能够更准确的去判断应该由哪个协议以及应用程序对已经发生的差错负责。
-
五种ICMP差错报告报文
-
终点不可达
终点不可达的差错报告报文有很多种情况,包括网络不可达、主机不可达、协议不可达等等,比如一个目的主机根本不存在,或者处于关机状态,当路由器收到了一份IP数据报,但是又不能转发的情况时,这个时候就会发送一份ICMP主机不可达的差错报告报文。一个数据报的目的主机的IP地址所指定的网络是不可达的,如到网络的距离是无穷的,此时路由器就会向该数据报的源主机发送一个网络不可达的差错报文。当目的主机收到一份UDP数据报而目的端口和它正在使用的进程不相符的时候UDP会返回一个ICMP的端口不可达的差错报告报文。
-
时间超过
也称为超时的差错报告报文,前面我们学习过IP数据报首部中有一个TTL即生存时间,现实中TTL起着一个跳数限制的作用,因为网络中的路由表难免偶尔出现差错的情况,为了避免数据报在因特网中无休止的兜圈子而无法到达目的主机,所以在产生IP数据报的时候给TTL赋一个初值,数据报每经过一台路由器的转发,路由器就会把TTL值减一,一旦TTL值减为零,路由器就不再转发该IP数据报,而是予以丢弃并且向源站发送一个ICMP的差错报告报文。
-
源站拟制
-
参数问题
-
路由重定向
-
-
ICMP询问报文
对于ICMP询问报文来说,它是用于给网络管理人员或者是应用程序对网络进行可达性分析,地址掩码设置,时钟同步等检测,从而对网络进行故障诊断和控制
-
四种ICMP询问报文
-
回送请求和回答报文
回送请求和回答报文主要用于测试目的主机的可达性,也可以计算发出请求到收到响应之间的时间差来估计源主机和目的主机之间的往返时延,此外通过适当的设置封装回送请求报文的数据报的TTL值还可以实现路由追踪。
-
时间戳请求和回答报文
-
掩码地址请求和回答报文
-
路由询问和通告报文
-
三、ICMP的应用
- ICMP协议可以实现网络可达性检查,网络延迟测量、网络路由追踪、网络安全排查等方面都有重要应用。
- 比如tracert(跟踪路由)这是一个非常实用的一个小程序,用于确定IP数据报访问目标所经过的路径,基于ICMP终点不可达和时间超过差错报告报文(超时报文)原理实现的。
- 比如ping(因特网包探索器)我们经常用来测试网络连通性的ping命令就是基于ICMP询问报文类型中的回送请求和回答报文实现的。