目录
1 ICMP的作用与特点
1.1 ICMP的主要特点
1.2 ICMP报文结构
2 ICMP 报文类型
2. ICMP差错报告报文
2.1.1 目的不可达报文
2.1.2 源抑制报文
2.1.3 超时报文
2.1.4 参数问题报文
2.1.5 重定向报文
2.2 ICMP查询报文
2.2.1 回送请求和应答报文
2.2.2 时间戳请求和应答报文
2.2.3 路由器询问和通告
2.2.4 地址掩码请求和应答报文
ICMP协议主要用来检测网络通信故障和实现链路追踪,最典型的应用就是PING和tracerooute。
1.1 ICMP的主要特点
- ICMP本身是网络层的一个协议,但其报文不是直接交给数据链路层,而是封装成IP分组后再传送给数据链路层。
- 从协议体系上看,ICMP要解决IP可能出现的不可靠问题,它不能独立于IP而单独粗壮乃。属于IP的组成部分之一。
- ICMP的设计初衷是发送IP执行过程中的错误报告,主要是路由器向源主机报告传输出错的原因。差错处理需要由高层协议来完成。
- 在IP分组头中,协议字段值为1,表示IP分组的数据部分是ICMP报文。
- ICMP报文前4B的格式统一:第一个字段(1B)是类型值,第二个字段(1B)是代码,第三个字段(2B)是校验和。第四个字段(4B)的内容与类型值相关。在这4个字段之后是ICMP的数据部分。
- ICMP报文分为:差错报告报文与询问报文。 不同的差错报告报文对应不同的类型值,例:目的不可达的类型值为3.询问报文一方的请求报文和另一方的应答报文,这类报文的类型值是两个,例:回送请求报文的类型值为8,回送应答报文的类型值为。
- IP分组仅对分组头进行校验,而不包括分组的数据部分,而ICMP报文正是封装在IP分组的数据部分中的。为保证ICMP报文传输的正确性,在ICMP报头中设置了校验和字段。
以下3种情况不产生ICMP差错报告报文:
- 对于分片的的分组,如果不是第一个出错,则不产生ICMP差错报文。
- 多播分组出错,不产生ICMP差错报文。
- 具有特殊地址(127.0.0.0或0.0.0.0)的分组出错,不产生ICMP差错报文。
2 ICMP 报文类型
路由器或主机根据IP分组头的协议字度值为1来判断该分组的数据部分封装的是ICMP报文。
2. ICMP差错报告报文
ICMP差错报告报文主要有5类:目的不可达、源抑制、超时、参数问题与重定向。
2.1.1 目的不可达报文
当路由器找不到下一跳路由器或无法向目的主机交付分组时,它将会丢弃该分组,并的源主机发出目的不可达报文。不同的代码表示不同的报文类型。目的不可达报文主要有下7种类型:
- 网络不可达(network unreachable):表示路由器寻址出错,下一跳路由器可能存在故障。网络不可达报文只能由路由器产生。代码0表示网络不可达。
- 主机不可达(host unreachable):表示网络寻址不存在问题,可能是目的主机不工作或不存在。主机不可达报文只能由路由器产生。代码1表示主机不可达。
- 协议不可达(protocol unreachable):IP分组携带的数据来自高层协议,例如UDP、TCP、OSPF等。如果目的主机接收分组的数据字段来自TCP,但是目的主机的TCP未运行,这时目的主机不能处理IP分组携带的TCP数据,则主机将产生一个协议不可达报文,通知源主机此次传输失败。代码2表示协议不可达。
- 端口不可达(port unreachable):表示分组要交付的应用进程没有运行。代码3表示端口不可达。 系路由失败(source route failed),表示由源主机路由选项中规定的一个或多个路由 章器无法通过。代码5表示源路由失败。
- 目的网络不可知(unknown destination network):表示路由器根本不知道关于目的 203网络的信息。代码6表示目的网络不可知。目的网络不可知与网络不可达不同,网络不可达是知道目的网络存在,但是无法将分组送达目的网络.
- 目的主机不可知(unknown destination host):表示路由器根本不知道关于目的主机的信息。代码7表示目的主机不可知。
2.1.2 源抑制报文
- IP协议提供无连接的分组传输服务没有提供任何流量控制机制 在源主机、路由器与目的主机之间不进行通信协调。在分组发送之前,路由器或主机无须为分组预留缓迪区,如梁大量分组同时涌向某个路由器或主机,则会造成拥塞(congestion),另外,路由器或主机缓冲区队列长度有限。如果路由器的分组接收速率比转发速率快,则缓冲区队列将溢出。在这种情况下,路由器或主机只能丢弃某些分组。路由器或主机因拥塞而丢弃分组时,向源主机发送源抑制报文。源抑制可分为3个阶段:
- 第1阶段,路由器或目的主机发现拥塞,发出源抑制报文。
- 第2阶段,源主机收到源抑制报文之后,降低向目的主机的分组发送速率。
- 第3阶段,拥塞解除之后,源主机恢复分组发送速率。
2.1.3 超时报文
- 分组寻址是由路由器根据路由表来决定的,如果路由表出现问题,则整个网络的寻址就会出现错误,极端情况下会造成分组在某些路由器之间循环传输。为了防止出理这种情况.IP协议采用两点措施:一是分组头中设置TTL字段,二是对分片采用定时器技术。针对这两种情况,ICMP设计了超时报文,超时报文在以下种情况下产生:
- 路由器在转发一个分组时,如果TTL值(减1)为0,则丢弃该分组,并向源主机发送超时报告报文。
- 一个分组的分片没有全部按时到达,目的主机不能将接收的分片重组成分组,而这些分片将长期占用主机缓冲区,甚至出现死锁现象。因此,当某个分组的第一个分片到达时,目的主机就启动一个计时器。如果目的主机在计时器时间内没有接收到所有分片,它将丢弃已经接收的分片,并向源主机发送超时报文。
2.1.4 参数问题报文
- 在IP分组的传输过程中,出现除目的不可达、源抑制、超时与改变路由之外的错误,例如分组头中的任何一个字段出错,路由器或目的主机将丢弃该分组,并向源主机发送参数问题报文。例如,IP分组头的前4位是版本字段,字段值为4时表示IPv4分组头。如果版本字段值为5,路由器将无法处理,只能丢弃该分组。参数问题报文指出被丢弃的分组头有错误,并在参数字段中包含一个指针,指向出错字节的起始位置。
2.1.5 重定向报文
- 路由器的路由表在不断地动态更新,而主机通常使用静态路由表。当主机开始联网工作时,主机的路由表中表项数目很少,一般仅知道默认路由器的IP地址。如果默认路由器的地址有错误,则可能出现问题。以图4-36为例,主机A要向主机B发送分组,路由器2是最有效的路由选择,但是主机A没有选择路由器2,而是将分组发送给路由器1。路由器1发现分组应发送给路由器2,则将该分组发送给路由器2,并向主机A发送改变路由的ICMP重定向报文。重定向报文可以实现主机的路由表更新。
2.2 ICMP查询报文
ICMP查询报文是为网络故障诊断而设计的,ICMP差错报告报文是单个出理的,ICMP查询报文是双向、成对出现的。
2.2.1 回送请求和应答报文
- 回送请求报文(类型值为8)和回送应答报文(类型值为0)用于检在目的节点是否可达.在一些网络应用中,用户调用Ping命令,通过回送请求与应答报文测试目的主机或路由富是否可达。
2.2.2 时间戳请求和应答报文
- 时间戳请求报文(类型值为13)和时间戳应答报文(类型值为14)提供一个基本和简单的时钟同步协议。时间戳请求和应答报文确定IP分组在两个主机之间往返所需的时间。其中,初始时间戳是源主机发出请求的时间,接收时间戳是目的主机收到请求的时间,发选时间戳是目的主机发送应答的时间。
2.2.3 路由器询问和通告
- 路由器询问报文(类型值为15)和路由器通告报文(类型值为16)用于主机查询连接的默认路由器地址。主机在其所在网络上广播路由器询问报文,收到路由器询问报文的所有路由器使用路由器通告报文广播路由信息。路由信息包括一个或多个路由器地址及对应的地址参数。如果地址参数为0x80000000,则对应的是默认路由器地址。当没有主机询问时,路由器周期性发送路由器通告报文。路由器在发送通告报文时,不仅通告自己的存在,而且通告它所知道的这个网络中的所有路由器地址。
2.2.4 地址掩码请求和应答报文
- 地址掩码请求报文(类型值为17)和地址掩码应答报文(类型值18)用于主机查询其所在网络的子网掩码。主机在其所在网络上广播地址掩码请求报文,等待路由器返回带有子网掩码的地址掩码应答报文。