三、ICMP协议

一、ICMP(互联网控制消息协议)介绍

1.1 为什么有ICMP协议

因为IP协议本身是不可靠的,在传输过程中,经常会发生丢包等现象。丢包的路由器就会将丢包的原因通过ICMP发送给发送的原,告诉发送源网络出现了什么问题,为什么会被丢弃掉。也就是一种测试网络,反应网络中出现问题的一种协议。

1.2 ICMP的工作原理

    ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。

1.3 ICMP的基本信息

1. ICMP经常被认为是IP的附属协议。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或者更高层协议(TCP/UDP)使用。一些ICMP报文把差错报文返回给用户进程
2. ICMP报文是在IP数据吧内部被传输的。ICMP本身是网络层协议。但是,它的报文不是如设想的那样直接传送给数据链路层,实际上,ICMP报文首先封装成IP数据报,然后再传送给下一层
3. 在IP数据报中的协议字段值是1就表示其IP数据是ICMP报文

二、ICMP协议报文类型

2.1 ICMP的报文格式

1. 类型字段可以有 15 个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段来进一步描述不同的条件
2. 检验和字段覆盖整个ICMP报文,使用的算法和IP首部的校验和算法相同,ICMP的校验和是必须的。

2.2 ICMP报文的封装过程

 

 

当IP头部的协议类型是 1 的时候,代表后面的是ICMP协议。ICMP报文是紧跟着IP头部的,相当于IP协议的数据部分内容就是ICMP的报文。IP协议的结构可参考前面的IP协议的内容。

ICMP报文也分为ICMP头部和ICMP数据两部分。

2.3 ICMP 消息类型及子类型编码

 

 

类型(Type)代码(CODE)描述查询(Query)差错(Error)
0 0 Echo Reply——回显应答(Ping应答)  
3 0 Network Unreachable——网络不可达  
3 1 Host Unreachable——主机不可达  
3 2 Protocol Unreachable——协议不可达  
3 3 Port Unreachable——端口不可达  
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特  
3 5 Source routing failed——源站选路失败  
3 6 Destination network unknown——目的网络未知  
3 7 Destination host unknown——目的主机未知  
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用)  
3 9 Destination network administratively prohibited——目的网络被强制禁止  
3 10 Destination host administratively prohibited——目的主机被强制禁止  
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达  
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达  
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止  
3 14 Host precedence violation——主机越权  
3 15 Precedence cutoff in effect——优先中止生效  
4 0 Source quench——源端被关闭(基本流控制)  
5 0 Redirect for network——对网络重定向   √ 
5 1 Redirect for host——对主机重定向  
5 2 Redirect for TOS and network——对服务类型和网络重定向  
5 3 Redirect for TOS and host——对服务类型和主机重定向   √ 
8 0 Echo request——回显请求(Ping请求)  
9 0 Router advertisement——路由器通告  
10 0 Route solicitation——路由器请求  
11 0 TTL equals 0 during transit——传输期间生存时间为0  
11 1 TTL equals 0 during reassembly——在数据报组装期间生存时间为0  
12 0 IP header bad (catchall error)——坏的IP首部(包括各种差错)  
12 1 Required options missing——缺少必需的选项  
13 0 Timestamp request (obsolete)——时间戳请求(作废不用)  
14   Timestamp reply (obsolete)——时间戳应答(作废不用)  
15 0 Information request (obsolete)——信息请求(作废不用)  
16 0 Information reply (obsolete)——信息应答(作废不用)  
17 0 Address mask request——地址掩码请求  
18 0 Address mask reply——地址掩码应答  

 

1. 不同类型由报文中的类型字段和代码字段共同控制
2. 最后两列表明 ICMP 报文是一份查询报文还是差错报文
3. 当发送一份ICMP差错报文时,报文始终包含IP首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据版旱灾IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来

差错报告报文:ICMP总是把差错报文报告给原始的数据源
  类型3:终点不可达
  类型4:源点抑制
  类型11:超时
  类型12:参数问题
  类型5:改变路由(路由重定向)

查询报文
  类型8或0:回送请求或回答
  类型13或14:时间戳请求或回答
  类型17或18:地址码请求或回答
  类型10或9:路由器查询通告

三、ICMP的差错报文

3.1 不会产生差错报文的情形

1. ICMP差错报文(但是ICMP查询报文是可以产生ICMP差错报文的)
2. 目的地址是广播地址或者是多播地址的IP数据报
3. 作为网络接口层广播的数据报
4. 不是IP分片的第一片,因为只有第一片才会包含目的端口号
5. 源地址不是单个主机的数据报。也就是说,源地址不能为零地址、环回地址、广播地址、多播地址

以上规则是为了防止过去允许ICMP差错报文对广播分组相应带来广播风波

3.2 终点不可达(Type:3)(以主机不可达为例 Type:3, Code:1)

当路由器不能够给数据报找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后这个路由器或主机就向发出这个数据报的源主机发回终点不可达报文。

3.2.1 主机不可达报文格式

在某种场景下,当通信板刚上电的时候,尚未运行到主周期时候,此时通信板的IP是尚未创建的。此时主机想要和通信板进行连接,但通信板上的IP尚未触发,路由就会给主机返回一个主机不可达的ICMP包。
如上图所示: IP首部的协议类型为1就是ICMP协议,ICMP的类型和代码是3和1,代表是主机不可达。

 

 

3.2.2 主机不可达抓包简单分析

从下面三幅图的抓包来看,前面的 (第一幅图),后面的20个字节是IP首部(第二幅图),再后面就是ICMP首部。

3.2.2.1 以太网首部

以太网首部 14 个字节, 前面 6 个字节是源MAC地址,后面6个事目的MAC地址,然后是帧类型(协议类型), 协议类型是 0800,代表后面是IP数据报,这是我们前面所说的ICMP是IP的一个附属协议证明。

3.2.2.2 IP首部

IP首部共占用20个字节,其中协议类型是 1,代表后面的数据部分是ICMP报文

3.2.2.3 ICMP终点不可达报文

 

 

 

 

根据ICMP主机不可达报文的格式分析如下:
ICMP首部:
  类型(1 byte): 03
  代码(1 byte): 01
  校验和(2 byte): 18 34 ---- 校验成功

  未使用(4 byte): 00 00 00 00
  IP首部(20 byte): 从IP首部的20个字节来看,ICMP返回数据的时候也会协议发送端的IP首部的相关信息,如从抓包看: source就是我们查找搜索的源IP 10.5.3.11
  IP数据报数据(8 byte): 返回的数据中除了包含IP首部,也会包含数据报数据的前面8个字节
ICMP数据:
  ICMP数据(8 byte): 最后面的8个字节是ICMP的数据内容,前面的字节都是ICMP的首部

3.3 源点抑制(Type:4)

P协议是无连接协议,没有流量控制机制,容易产生:拥塞
ICMP源点抑制报文就是给IP增加一种流量控制而设计的,这个报文有两个目的
  1. 它通知源点,数据报因拥塞已经被丢弃
  2. 它警告源点,在路径中的某处出现了拥塞,因而源点必须放慢(抑制)发送过程。

 

 

 

3.4 超时(Type:11)

超时报文在以下两种情况下产生:
  1. 当路由器收到生存时间字段值为零的数据报时,就丢弃这个数据报,并向源点发送超时报文
  2. 当最后的终点在规定的时间内没有收到所有的分片时,它就丢弃已收到的分片,并向源点发送超时报文

在超时报文中,代码0只给路由器使用,表示生存时间字段值为0.代码1只由目的主机使用,它表示在规定的时限内,不是所有的分片都到达了

3.5 参数问题(Type:12)

当数据报在因特网上传送时,在其首部中出现的任何二义性都可能会产生严重的问题。

如果路上器或目的主机发现了这种二义性,或在数据报的某个字段中缺少某个值,就丢弃这个数据报,并发送参数问题报文

3.6 改变路由(Type:5)

 

 

 

四、ICMP的查询报文

4.1 回送请求和回送应答(Type:8/0)

请求:request
应答:reply

 

 

 

 

4.2 时间戳请求和回答(Type:13/14)

发送时间=接收时间戳的值-原始时间戳的值
接收时间=分组返回的时间-发送时间戳的值
往返时间=发送时间+接收时间

4.3 地址掩码请求和回答(Type:17/18)

单播
广播

4.4 路由器询问和通告(Type:9)

广播
多播

 

三、排错工具

3.1 ping

 ping 操作可以发出 ICMP 的查询报文

 

3.1.1 ping 程序

 

1. 一般情况下,我们称发送回显请求的ping程序为客户,称返回ping的主机称为服务器。大多数的TCP/IP实现都在内核中直接支持ping服务器,这种服务器不是一个用户进程。
2. 对于其他类型的ICMP查询报文,服务器必须相应标识符和序列号字段。另外,客户发送选项数据必须回显。
3. UNIX系统在实现ping程序时是把ICMP报文中的标识符和字段置为发送进程的ID号,这样即使在同一台主机上同时运行了多个ping程序,ping程序也可以识别出返回的信息
4. 在windows下,不管开了多少个窗口的ping的identifier都是相同的,而且每增加一个出去的包序列号增加256。

3.1.2 ping的请求包

 

3.1.3 ping的响应包

 

3.2 Traceroute(windows用tracert)

 

 

posted on 2022-12-29 13:22  软饭攻城狮  阅读(561)  评论(0编辑  收藏  举报

导航