网络协议分析-ICMP

本文最后更新于:几秒前

ICMP:

ICMP 网际控制报文协议,通过ICMP可以定位故障发生位置和原因。

由于IP不是为可靠传输服务设计的,所以ICMP的目的主要是用于在TCP/IP网络中发送出错和控制消息。

ICMP是由IP承载的。

ICMP报文类型:

差错报告报文

控制报文

请求/应答报文

ICMP不同报文有不同的结构。但都包含8bit的类型字段,8bit 代码字段,和16bit校验和部分。

具体的type与code组合见RFC6918

差错报告类报文:

在发送差错报告类报文时,必须遵守以下规则:

i. ICMP差错报告类报文数据区内要包括发生差错的IP数据报首部,以及数据区的至少前64bit(包含了上层协议的首部)这段信息包含了出错数据包的关键信息,这些信息能够为源端采取差错处理措施提供依据。

ii. ICMP差错报告只能向源端报告差错,不能向中间路由器报告差错。

iii. 携带ICMP差错报文的数据包出现差错时,不会再生成ICMP报文。

iv. 对于分片的IP数据报,ICMP差错报告仅对第一个分片应用。

差错报告类报文包括以下四种:

§ 目的地址不可达报文

§ 超时报文

§ 参数错误报文

§ Photuris(主要在安全应用上)

目的地址不可达报文:

当路由器无法转发或交付数据报时,可使用ICMP目的地址不可达报文通知数据报源端。

其代码字段取值与意义如下:

20430499-edd159fa740467e3

超时报文:

超时报文用于两种情况,一种是TTL值为0,另一种是分片重组时超时。

代码 含义
0 TTL超时
1 分片重组超时

参数错误报文:

只有问题严重到需要把数据包丢弃时,才会发送此报文。

报文格式较之前新加指针字段,指针字段用于指示发生错误的第一个字节在数据包首部的位置。

代码 含义
0 表示具体的错误由指针表示
1 参数缺少
2 数据报长度错误

Photuris报文:

此报文主要用于IPsec。

IPsec 提供数据机密性,完整性保护,并且能够实现对端认证,数据压缩等一系列功能。其中安全保护需要依托一系列参数。保护不同的数据可能需要不同的安全参数,所以当存在多组安全参数时,需要对每个组进行标识,这就是SPI。

Photuris代码字段取值与这些功能密切相关。

代码 含义
0 SPI错误
1 认证失败
2 解压缩失败
3 解密失败
4 需要认证
5 需要授权

请求应答类报文:

回送请求/回送应答报文:

这两种报文主要用于测试网络的连通性,当主机向目的站发送ICMP回送请求时,收到该报文的目的站必须回应一个回送应答报文作回应。

数据报在之前共有的部分上新加了8bit的标识,8bit的序号,以及一个可选数据区。

当目标主机收到一个包含可选数据区的请求报文时,应当将数据区数据拷贝到应答报文中。

标识和序号用于匹配请求和应答,成对的请求和应答报文使用相同的标识和序号字段。

类型 含义
0 回送应答
8 回送请求

代码固定位0

路由器恳求与通告报文:

为了解决网络中存在多个与Internet相连的路由器,而主机通过静态配置只配置了一个默认路由器,当默认路由出现问题,网络中还有其他路由器无法连接网络的问题,路由器会定时向网络中发送路由器通告,告诉各主机目前可用的路由器。

报文格式:

20430499-109590fa1f11ee88

路由器地址以及优先级:指出目前可用的路由器以及其优先级,他们总是成对出现。

地址数:指明了可用路由器的数量

地址项长度:指明了地址的大小,以4字节为单位,对于IPV4地址,该字段为1

生存时间:指明了路由信息保持有效的时间,以秒为单位。

路由器发送通告报文的最长间隔是10分钟,这意味着最坏的情况下主机要等10分钟才能得到一条路由信息。为了避免主机的等待时间过长,ICMP规定,主机启动时以组播或有限广播的形式发送路由器恳求报文。

路由器恳求报文:

报文格式:

20430499-b7feaf8d570e45d4

类型设置为10,代码字段设置为0,。路由器收到恳求报文后,立即发送一个路由器通告报文作为响应。

在RFC3344中新加了两个代码类型:

代码 含义
0 表示移动代理作为一个普通路由器使用,正常处理普通数据报
16 表示移动代理充当代理角色,要处理移动节点的数据

时间戳请求应答报文:

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)(早期的参考手册认为UTC是格林尼治时间)。这种ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些Unix系统提供的rdate命令)只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。

报文结构:

20430499-d8def0c3d3b24e0c

发起时间戳:用于记录发送者生成时戳请求报文的时间。

接收时间戳:用于记录接收者受到请求的时间。

传送时间戳:用于记录接收者生成应答报文的时间。

ICMP应用:

  Ping 程序 
  
  racertroute程序

欢迎指出文中错误,谢谢


网络协议分析-ICMP
https://blog.icansudo.top/2020/04/22/网络协议分析-ICMP/
作者
odin
发布于
2020年4月22日
许可协议