网络层(四):Internet控制报文协议

1、Internet控制报文协议的作用与特点

  IP协议提供的是尽力而为的服务。IP协议的优点是简洁,但缺少差错控制和查询机制。IP分组一旦发送出去,是否到达目的主机,以及在传输过程出现哪些错误,源主机是不知道。在这种情况下,若出现一些问题,如路由器找不到目的网络,分组生存时间超过必会被丢弃,以及目的主机在规定的时间内不能接收属于同一个分组的所有分片该怎么办。

  针对这些问题设计一种差错报告与查询、控制机制来了解信息,来决定如何处理。

  Internet控制报文协议(ICMP)就是为解决以上问题而设计的,ICMP协议的差错与查询、控制功能对于保证TCP/IP协议的可靠运行至关重要。

1.1、ICMP协议的特点

  1、ICMMP协议本身是网络层的一个协议,但是它的报文不是直接传送给数据链路层,而是要封装成IP分组,然后在传送给数据链路层。

  2、从协议体系上看,ICMP协议只是要解决IP协议可能出现的不可靠问题,不能独立于IP协议而单独存在,它是IP协议的一个组成部分。

  3、ICMP协议设计的初衷是用于IP协议在执行过程中的出错报告,严格的说是由路由器来向源主机报告传输出错的原因。差错处理需要有高层协议完成。

1.2、ICMP报文结构

ICMP报文结构如下:

  0

  1、在IP分组头中,协议字段值为1 表示IP分组的数据部分是ICMP报文;

  2、ICMP报文的前4B的格式是统一的,第一个字段(1B)是类型,第二个字段(1B)是代码,第三个字段(2B)是校验和,第四个字段(4B)的内容与类型相关。在这4个字段之后是数据字段。

  3、ICMP报文分为两类:差错报文与询问报文,不同的差错报文对应不同的类型值,例如主机不可到达的类型值为3。询问报文应该是一方请求,另一方应答,因此类型值应该是两个。例如回送请求报文类型值为8,回送应答报文的类型值为0。

  4、IP分组只对分组头进行校验,而不包括分组数据,而ICMP报文是封装在IP数据字段中。为保证ICMP报文传输的正确性,在ICMP中有2B的检验字段。

  5、有三种情况不产生差错报告报文:

    ·对于分片的分组,如果第一个分片出错,则不产生ICMP差错报文;

    ·多播分组出错,不产生ICMP差错报文;

    ·具有特殊地址(127.0.0.0 或 0.0.0.0)的分组出错,不产生ICMP差错报文。

2、ICMP报文类型

路由或主机根据IP报头协议字段的值为1,来判断该IP分组数据字段封装的是ICMP报文。ICMP报文类型可以分为两类:差错报告报文和查询报文。

2.1、ICMP差错报告报文

  ICMP差错报错报文主要有5类:目的主机不可达、源主机抑制、超时、参数问题和重定向。

2.1.1、目的主机不可达(destination unreachable)

  当路由器找不到路由器或不能够向目的主机交付分组时丢弃该分组,路由器或主机向源主机发出ICMP目的主机不可达报文。不同的代码表示不同的报文类型。目的不可达报文主要有以下7种类型:

1.1、网络不可达(net unreachable)

  代码0 表示网络不可达。网络不可达报文是指:路由器寻址出错,下一跳路由器可能存在故障。

  网络不可达只能由路由器产生。

1.2、主机不可达(host unreachable)

  代码1 表示主机不可达。主机不可达是指:网络寻址不存在问题,可能是目的主机不工作或不存在。

  这种类型的报文只能由路由器产生。

1.3、协议不可达(protocol unreachable)

  代码2 表示协议不可达。IP分组携带的数据属于高层协议,如UDP、TCP和OSPF等。

  若目的主机收到一个分组的数据字段是TCP包,但目的主机的TCP并未运行,这时目的主机不能够处理IP分组传输的TCP数据,主机将产生一个"协议不可达"报文,通知源主机此次传输失败。

1.4、端口不可达(port unreachable)

  代码3 表示端口不可达。端口不可达是指:分组要交付的应用进程没有运行。

1.5、源路由选择不能完成(source route failed)

  代码5 表示源路由选择不能完成。源路由选择不能完成是指:由源主机路由选择选项中规定的一个或多个路由器无法通过。

1.6、目的网络不可知(unknown destination network)

  代码6 表示网络不可知。目的网络不可知是指:路由器根本不知道关于目的网络的信息。

  目的网络不可知与网络不可达的区别:网络不可到达是指直到目的网络存在,而无法将分组送达。

1.7、目的主机不可知(unknow destination Host)

  代码7 表示目的主机不可知。目的主机不可知是指:路由器根本不知道关于目的主机的信息。

2.1.2、源主机抑制(source quench)

  由于IP提供的是无连接的分组传输服务,IP中没有流量控制机制。在源主机、路由器与目的主机之间并没有通信协调机制。在分组发送之前,并不需要在路由器或主机中为分组预留缓冲区,若有大量分组同时涌向某个路由器或主机,会造成拥塞(congestion)。

  同时,路由器或主机缓冲区中的队列长度有限。若路由器的分组接收速率比转发速率快,那么缓冲区队列将会溢出。在这种情况下,路由器或主机只能将某些分组丢弃。

"源抑制"是当路由器或主机因拥塞而丢弃一个分组时,就像源主机发送源抑制报文。源抑制可分为以下三个阶段:

  第1阶段:路由器或目的主机发现拥塞,发出源抑制报文。

  第2阶段:源主机收到源抑制报文之后,按一定速率降低发往目的主机的分组传输率。

  第3阶段:拥塞解除后,源主机要恢复分组传输速率。

2.1.3、超时

  分组的寻址是由路由器根据路由表来决定,若路由表出现问题,则整个网络的寻址就会出现错误。极端的情况是造成分组在某些路由器之间无休止的传输。为防止出现此种情况,IP采取两点措施:一是在分组的报头中设置生存时间TTL字段;二是对分片采用定时技术。

  1、路由器在转发分组时,若生存时间TTL字段值减1为0时,就丢弃这个分组,路由器向源主机发送超时报告报文;

  2、当一个分组的所有分片在某一限定时间内没有完全到达目的主机时,目的主机就不能将接收的分片重新组装成分组,而一个分组的分片将长时间占用主机的缓冲区,甚至出现"死锁"现象。因此,当某个分组的第一个分片到达时,目的主机就启动计数器。计时器的时间到,而目的主机没有接收到一个分组的所有分片,它将丢弃已经接收到的分片,并向源主机发送超时报告报文。

2.1.4、重定向报文

  路由器的路由表是不断的动态更新,而主机通常使用静态路由表。当主机开始联网工作时,主机的路由表中表项数目很少,一般只需要直到默认路由器的IP地址。若默认路由器的地址是错误的,那么就有可能出现下图的情况:

  0

  主机A打算向主机B发送分组,路由器2显示是最有效的路由选择,但是主机A没有选择路由器2,而是将分组发送给路由器1。

  路由器1在查找路由表后发现分组应当发送到路由器2。name它就将该分组发送到路由器2,同时向主机A发送改变路由的ICMP重定向报文。

  重定向报文可以实现主机路由表的更新。

2.1.5、参数问题报文

  若出现分组传输过程中除目的主机不可达、源主机抑制、超时与改变路路由报文4中情况之外的错误,如IP分组头中任何一个字段的参数丢失或出错,路由器或目的主机在丢弃该分组之后,向源主机发送"参数问题报文"。

  "参数问题报文"指出被丢弃的分组头有错误,并在参数字段中包含一个指针,指向出错字节的位置。

2.2、ICMP查询报文

  ICMP查询报文是为网络故障诊断的目的而设计的,ICMP差错报告报文是单向的,而ICMP查询报文是双向的、成对出现的。

2.2.1、回应请求和应答

  回应请求和回送应答报文可由主机使用,以检查另一个主机是否可达。

  在TCP/IP应用中,用户调用Ping命令便是通过回应请求(代码为 8)和应答报文(代码为 0),检查和测试目的主机或路由器是否能够到达。

2.2.2、时间戳请求和应答

  ICMP时间戳请求(代码为 13)和应答报文(代码为 14)提供一个基本和简单的时钟同步协议。

  时间戳请求和时间戳应答报文确定IP分组在两个机器之间往返所需时间。

  初始时间戳是源主机发出请求的时间,接收时间戳是目的主机收到请求的时间,发送时间戳是目的主机发送应答的时间。

2.2.3、地址掩码请求和应答报文

  主机可能用ICMP地址掩码请求和应答报文来查找与它所连接网络的子网掩码。主机在网络上广播请求(代码为 17),等待路由器返回带有子网掩码的应答报文(代码 18)。

2.2.4、路由器询问和通告

  主机可以使用路由器询问报文(代码为 15)查找它所连接的本地路由器地址。收到询问报文的一个或几个路由器使用路由路由器通告报文(代码为 16)广播路由信息。路由信息包括一个或多个路由器地址及对应的地址参数选择。

  若地址参数选择为0x80000000,则对应的是默认路由器的地址。

  在没有主机询问时,路由器可以周期性的发送路由器通告报文。路由器发送通告报文时,不仅通告自己的存在,而且通告它所知道的这个网络中所有路由器地址。

2.3、Ping与Traceroute命令

2.3.1、Ping命令的应用

Ping过程的是示意图:

  0

  Ping是测试目的主机是否能够到达的一种通用方法。在TCP/IP应用中,用户调用Ping命令便是通过回应请求(ICMP echo request)和应答报文(ICMP echo reply),检查和测试目的主机或路由器是否能够到达。

  报文中包含三个参数:报文长度(bytes)、主机响应时间(time)与生存时间(TTL)。

2.3.2、Traceroute命令的应用

  Tracert是网络中重要的诊断工具之一,可以获得从测试命令发出的源主机达到主机完整的路径,因此它也称为"路由跟踪"命令。

Tracert工作原理如下:

  0

  1、源主机A先给目的主机发送一个跳步数限制值为1的echo request ICMP报文。第1个接收到的路由器将跳步数限制值1减1为0的分组丢弃,并向源主机发送一个ICMP超时(time exceeded)报文。源主机就得到了第1个路由器的地址。

  2、Tracert发送一个跳步数限制值为2的ICMP echo request报文。第2个接收到的路由器会因为跳步数限制的原因,丢弃分组,并向源主机发送一个ICMP超时报文。则,源主机就得到了第2个路由器的地址。

  3、继续执行以上过程,直至ICMP echo request报文达到目的主机,目的主机发送回一个ICMP echo reply应答报文,如此源主机就可以获得一个完整的从源主机到达目的主机的路径列表。

 

posted @   无虑的小猪  阅读(288)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示

目录在这里