ICMP协议

一.ICMP协议的简介

IP协议是一种面向无连接的数据报协议,它是一种不可靠的协议,它不提供任何差错检验。因此网际报文控制协议(Internet Control Message Protocol)ICMP出现了,ICMP协议用于IP主机、路由器之间传递控制消息,这里的控制消息可以包括很多种:数据报错误信息、网络状况信息、主机状况信息等,虽然这些控制消息虽然并不传输用户数据,但对于用户数据报的有效递交起着重要作用,从TCP/IP的分层结构看ICMP属于网络层,它配合着IP数据报的提交,提高IP数据报递交的可靠性。ICMP是封装在IP数据报中进行发送的,从这点看来,ICMP协议又有点像一个传输层协议,其实不然,因为ICMP报文的目的不是目的主机上的某个应用程序,它不为应用程序提供传输服务,ICMP报文的目的是目的主机上的网络层处理软件。简单的来说,ICMP协议就像奔波于网络中的一名医生,它能及时检测并汇报网络中可能存在的问题,为解决网络错误或拥塞提供了最有效的手段

二.ICMP的报文封装


ICMP报文是使用IP数据报来封装和发送的,携带ICMP报文的IP数据报完全像其他类型数据的数据报那样在网络中被转发,没有额外的可靠性和优先级,由于IP数据报本身被放在底层物理数据帧中进行发送,因此,ICMP报文本身也可能丢失或者出现传输错误

三.ICMP报文类型


ICMP报文可以分为两大类:ICMP差错报告报文和ICMP查询报文。差错报告报文主要用来向IP数据报源主机返回一个差错报告信息,这个错误报告信息产生的原因是路由器或主机不能对当前数据报进行正常的处理,例如无法将数据报递交给有效的协议上层,数据报因为生存时间TTL为0而被删除等。查询报文用于一台主机向另一台主机查询特定的信息,通常查询报文都是成对出现的,即源主机发起一个查询报文,在目的主机收到该报文后,会按照查询报文约定的格式为源主机返回一个应答报文。注意,    ICMP差错报文并不能纠正差错,它只是简单地报告差错,差错报告报文总是被返回给数据报的原始发出者,因为数据报中关于路由的唯一可用信息就是源IP地址和目的IP地址,路由器在不能正常处理数据报时,会产生相应的差错报文并返回给数据报源端。差错的纠正需要留给高层协议,当源主机网络层收到差错报告报文后,或者直接根据报文做出相应的处理,或者向更高层的协议通知这个差错信息,由上层协议选择处理。查询报文能用于对某些网络问题的诊断,也可用于网络设备信息的交互,查询报文都是成对出现的

四.报文格式


8位的类型字段标识了该ICMP报文的具体类型,8位的代码字段进一步指出产生这种类型ICMP报文的原因,每种类型报文的产生的原因都可能有多个,就拿目的站不可达报文来说,产生的原因可能有主机不可达、协议不可达、端口不可达等;16位校验和字段包括整个ICMP报文,即包括ICMP首部和数据区域。首部中的剩余4个字节在每种类型的报文中有特殊的定义

1、差错报文

目的站不可达:当路由器不能给数据报找到合适的路由路径,或者主机不能将数据报递交给上层协议时,相应的IP数据报就会被丢弃,然后一个目的站不可达差错控制报文将会被返回给源主机。目的站不可达差错可以由很多因素引起,例如网络不可达、主机不可达、协议不可达、端口不可达等,可以在报文首部中的代码字段指出具体原因。在ICMP目的不可达报文的数据区域,装载了引起目的站不可达的IP数据报首部及数据报数据区的前8个字节,当源主机收到这样一份ICMP报文后,它能根据报文数据区中的数据判断是哪个数据报出现了问题。装载引起差错的数据报数据区的前8个字节是因为这8个字节恰好覆盖了TCP报文或UDP报文中的端口号字段,IP层能够根据这个端口号把ICMP报文传递给具体的上层协议进行处理。常用目的站不可达报文格式及代码字段常用取值如下:




数据报超时:数据报超时可以用来防止数据报在网络中被循环的路由,在IP首部中都有一个生存时间(TTL)字段,数据报每被转发一次,TTL的值便会减1,当TTL的值被减为0时,数据报会被网络丢弃,同时一个ICMP数据报超时报文会被返回给源主机。此外在分片重装时,也用到了ICMP超时报文,若某个数据报在重装过程中其重装时间超时,而数据分片还没有全部到达,此时与该数据报所有相关的分片将被删除,同时,一个ICMP超时报文将被返回给源主机。常用数据报超时报文格式及代码字段常用取值如下:



源站抑制:ICMP源站抑制报文就是为了给IP协议增加一种流量控制而设计的,当路由器或主机因拥塞而丢弃数据报时,它可以向源站发送ICMP源站抑制报文,这个报文将告诉源站两个信息:第一,你的数据报发得太快,我已经丢弃了;第二,路径中出现了拥塞,请放慢你的数据报发送频率

重定向(路由):当路由器要将数据报转发到另一个网络时,它必须知道下一个路由器的IP地址,源主机也是这样,当一台主机刚开始运行时,它会将所有数据报发送给网络中的一个默认路由器,因为它只知道默认路由器这一个IP地址。在这样的情况下,主机始终把所有数据报都发送到默认路由器,这样的处理也意味着所有数据报的目的地址都在默认路由器所处的网络内,但实际上,有些数据报可能是要发送到其他网络上的,若默认路由器接收到这样的数据报,它就可以发送一个ICMP重定向报文告诉源主机改变它的路由表:你可以直接将那些数据报发送给另外一个路由器,这样我就不用再帮你转发了,你的数据报递交效率也提高了

数据报参数错误:数据报在网络中传输时,其首部中出现的任何二义性都可能会产生严重的问题,如果路由器或主机发现了这种二义性,或者数据报中的某个字段丢失,路由器会直接丢弃数据报,并向源主机返回一个数据报参数错误报文

2、查询报文

常见的ICMP查询报文有以下几种:回送请求或回答、时间戳请求或回答、路由器询问和通告、信息请求或回答、地址掩码请求或回答。其中用得较多的是回送请求或回答、时间戳请求或回答,其他的三种查询报文目前几乎很少被用到,以前它们主要在主机启动时使用,通过使用这三种查询报文,主机能确定自身在网络环境中IP地址、地址掩码、路由器状况等信息,现在,DHCP协议已经能够完全实现这些功能。此外,在互联网中的两台主机能够使用时间戳请求或回答报文来确定数据报在彼此之间往返所需要的时间。

回送请求或回答:回送请求和回送回答报文是为诊断网络而设计的,我们使用这对报文来发现网络的问题,回送请求和回送回答报文组合起来就可以确定两个网络设备之间彼此是否能够通信。回收请求和回送回答报文可以直接确定两台主机的IP协议是否能够正常通信,这是因为ICMP报文是被封装在IP数据报中发送的,发送请求的主机能收到回答报文,证明两台主机之间能够使用IP协议进行通信,同时也能证明源主机与目的主机之间的所有路由器的接收、处理、转发功能正常。回送请求或回答报文格式如下:

类型字段指出了是请求报文(8)还是回答报文(0);代码段无特殊取值,始终为0;首部中的标识符和序号两个字段在ICMP协议中没有定义其取值规范,因此发送方可以自由使用这两个字段,例如可以用序号来记录源主机发送出去的回送请求报文编号。可选数据区域表示回送请求报文中可包含的数据,其长度是可选的,发送方应该选择合适的长度并填充相应的数据。在接收方,它将根据这个回送请求产生一个回送回答,回送回答中的数据与回送请求中的数据应该完全相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值