11-ICMP差错报告报文

  前面我们在介绍ICMP报文种类的时候说过,ICMP报文的种类分为两种:一种是差错报告报文,另一种是查询报告报文。分别介绍了这两种报文的常用的类型,在这一篇中将主要介绍差错报告报文中常用的类型。


1. 终点不可达

  当路由器发送的数据报不能发送到指定目的地时,或者说当路由器不能够给数据报找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后向发送数据报的源主机设备发回一个终点不可达数据报文。

  什么是终点不可达?

这里写图片描述
图1-终点不可达

  举个例子:主机A给主机B发送一个邮件,在网络中传输时中间可能要经过很多台路由器,主机A先把这个邮件发送给路由R1,路由R1收到这个邮件后,此时路由R1发生了故障,它不知道这封邮件下一步该发给哪个路由设备或者那台主机设备,也就是说这封邮件不能发送到目的地主机B,这时路由R1会把这个数据报丢弃并向主机A发回一个终点不可达的数据报文。

这里写图片描述
图2-终点不可达数据报文

   从图2可以看出,终点不可达的数据报文的类型标号为3,表示这是终点不可达错误类型,代码标号是0 - 15,表示引发终点不可达错误类型的具体错误原因有16种可能,其中标识符和序列号全都用0来填充。

需要注意的是:对于这些错误代码原因不需要去记,只需要知道就行了,到时候真的遇到这个错误了再来查资料即可。

终点不可达数据包:
这里写图片描述

注意上图红色框部分的数据报

Internet Control Message Protocol
    Type: 3 (Destination unreachable)  //Destination unreachable就是终点不可达
    Code: 3 (Port unreachable)       //代码号为3是Port unreachable,表示端口不可达
    Checksum: 0x6e2d [correct]
    [Checksum Status: Good]
    Unused: 00000000           //这一部分是由标识符和序列号组成的,一般出现终点不可达错误的情况下,都是用0来填充表示的。


2. 端口不可达

   当目标系统收到一个ip数据报的某个服务请求时,如果本地没有此服务,那么会向源头返回ICMP端口不可达信息。

   常见的端口不可达有,R1向R3发起一个ftp的传输请求,从R3传输一个文件到R1,由于R3设备没有开启ftp服务的69端口,因此R1在请求R3时会收到R3回复的一个ICMP端口不可达的差错报文。


3. 源点抑制

  由于ip协议是面向无连接的,没有流量控制机制,数据在传输过程中是非常容易造成拥塞的现象。

  而ICMP源点抑制报文就是给ip提供一种流量监控的机制,因为ICMP源点抑制机制并不能控制流量的大小,但是能根据流量的使用情况,给源主机提供一些建议。这个报文的作用就是通知数据报在拥塞时被丢弃了,另外还会警告源主机流量出现了拥塞的情况,然后源主机根据反馈的ICMP源点抑制报文信息作出处理,至于源主机怎么就不管它的事了。

  还是用举例子来说明:比如主机A给主机B传输一个视频数据,主机A这边传输的非常快,而主机B这边在接收的非常慢的话,这可能会导致数据在传输过程中都拥塞在某一台路由设备上,假设拥塞在路由设备A,如果主机B接收数据一直比较慢的话,路由设备A解决不了拥塞问题,会给源主机发送一个源点抑制报文反馈给源主机,目的是告诉源主机数据报造成拥塞了,再发送就会丢弃数据报了,另一个是警告源主机放慢发送数据的速度。

  另外需要注意的是如果路由设备A一直都是拥塞的话,就会一直给源主机发送ICMP源点抑制报文,直到路由设备A不再拥塞,也就不向源主机发送ICMP源点抑制报文,源主机A又会恢复原来的发送数据的速度。

这里写图片描述
图3-源点抑制报文

  源点抑制报文的类型值是4,代码标号为0,未使用的部分还是全部以0填充。


4. 超时

ICMP差错报告报文主要在以下几种情况中,会发送ICMP超时报文:
  1. 当路由器接收到的数据报的TTL生命周期字段值为0时,路由器会把该数据报丢弃掉,并向源主机发回一个ICMP超时报文。

  2. 另外,当目标主机在规定时间内没有收到所有的数据分片时,会把已经收到的所有数据分片丢弃,并向源主机发回一个ICMP超时报文。在超时报文中,代码0只能给路由器使用,表示生存周期字段值为0,代码1只能给目的主机使用,它表示在规定的时间内,目的主机没有收到所有的数据分片。

这里写图片描述
图4-超时报文

  ICMP超时报文的类型值是11,code的值有可能是0或者是1,其中标识符和序列号全部填充为0。

什么时候会发送ICMP超时报文呢?还是来举个栗子说明一下吧, 比如:当路由器R4收到数据报文TTL减1后值为0的话,那么路由器R4会丢弃该数据报文,然后向主机A发送一个ICMP超时报文。如图所示:
这里写图片描述

   当主机A给主机B发送一个数据报文时,该数据报文在网络中会有一个TTL生存时间字段,就是数据报文每经过一台路由器,TTL字段值就会减1,当路由器收到数据报文后TTL字段值减1后为0的话,那么该路由器就会把数据报丢弃并向主机A发回一个ICMP超时报文,这种机制有效的防止了路由环路,也就是解决了数据报在路由器之间一直转圈的问题。



以下就是通过wireshark抓包工具抓到ICMP超时报文:

这里写图片描述

Internet Control Message Protocol
    Type: 11 (Time-to-live exceeded)          //ICMP超时报文的type值就是11Time-to-live exceeded就是生存时间超时的意思
    Code: 0 (Time to live exceeded in transit)   //code的值有可能是1有可能是0Time to live exceeded in transit就是表示路由器收到的ICMP数据报文的TTL值为0
    Checksum: 0xf4ff [correct]               //表示校验和是正确的
    [Checksum Status: Good]                //校验和状态是好的


5. 参数问题

  当数据报在因特网上传送时,在其首部中出现的任何二义性或者首部字段值被修改都可能会产生非常严重的问题。如果路上器或目的主机发现了这种二义性,或在数据报的某个字段中缺少某个值,就丢弃这个数据报,并回送参数问题报文。

这里写图片描述
图5-参数问题

这里,ICMP参数问题差错报文的字段进行解释:

类型值为12

代码值为0或1
如果代码值为0表示数据报文的首部的字段值被修改
如果代码值为1表示该数据报文在网络中传输要求加上可选字段,实际上没有加上可选字段。

指针:表示指针会指向出错的部分,比如:某个字段值是错误的或者有问题,指针就会指向该字段。

其中标识符和序列号全部填充为0。

什么情况下,会出现参数问题报文呢?
这里写图片描述

  假设主机A给主机B发送一个数据报文,该数据报文在网络传输过程中必须要封装成IP数据报文形式传输,其中就包括了IP首部部分,当这个IP数据报文在传输到R1路由器时IP首部的字段值正好被 修改了(code值为0),因为前面我们说过数据报文在网络传输过程中是不允许被修改的,如果被修改或者发生错误的话,这都是很严重的问题,如果路由器R1检测到这个IP数据报文的IP首部被修改的话,R1路由器会将该数据报文丢弃并向主机A发送一个ICMP参数问题报文。如果在传输过程中该数据报文要求加上可选字段,也就是code值要求为1,但是R1路由器检测到该数据报文的code值不是1没有加可选字段,同样会发送一个ICMP参数问题报告报文。


6. 改变路由

这里写图片描述

  还是拿主机A给主机B发送数据的例子来说,假如主机A给主机B发送数据,数据报文在网络传输过程中走的路线:主机A - > R1 -> R2 -> R3 -> R4 -> 主机B,当R3在接收到这个数据报时,R3会查看自己的路由表发现数据走R3并不是最优的路线,应该直接走R4才是最优的路线,所以这时候R3并不会把数据报丢弃,而是把已经发过来的数据报通过这条路径发送给R4,R4再发给主机B。同时R3还会发送一个ICMP改变路由的报文给发送数据的主机A,告诉主机A最优路线是直接发送给R4,而不是发送给R3,也就是说,下次主机A发送数据的路线是这样的:主机A - > R1 -> R2 -> R4 -> 主机B。

ICMP改变路由报文如图所示:

这里写图片描述
图6-改变路由报文

ICMP改变路由报文字段值说明:

类型位5,表示是一个ICMP改变路由的报文

代码:0123
0代表对某一个特定网络路由进行改变
1代表对特定某一主机进行改变
2代表对于指定的服务类型和网络路由进行改变
3代表对于指定的服务类型和主机路由进行改变

目的路由器的IP地址:最优路线的路由器IP地址
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页