一、ICMP协议

ICMP(Internet Control Message Protocol)网际控制报文协议。它是TCP/IP协议簇的一个子协议,
ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告,用于在IP主机、路由器之间传递控制消息
。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用,
ICMP属于网络层协议。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。

 二、ICMP报文格式

ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。

ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文

所有的 ICMP 差错报告报文中的数据字段都具有同样的格式。把收到的需要进行差错报告的 IP 数据报的首部和数据字段的前 8 个字节提取出来,作为 ICMP
报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP),整个ICMP报文作为IP数据报的数据字段发送给源点。

三、ICMP报文类型

1、ICMP报文类型

2、几种常见的ICMP报文类型

ICMP标准在不断更新。已不再使用的ICMP报文有:“信息请求与回答报文”、“地址掩码请求与回答报文”、“路由器请求与通告报文”以及“源点抑制报文”[RFC
6633]。现在不再把这几种报文列入。

ICMP报文的代码字段是为了进一步区分某种类型中的几种不同情况
。检验和字段用来检验整个ICMP报文。由于IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。

1)、回显应答和请求

ICMP
回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。

Ping命令,使用的就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个 Type=8 的 ICMP
报文,如果途中没有异常,则目标返回 Type=0 的 ICMP 报文,说明这台主机存在

2)、目标不可达

当路由器或主机不能交付数据报时就向源点发送目标不可达报文。例如我们要连接对方一个不存在的系统端口时,将返回 Type=3,Code=3 的 ICMP
端口不可达报文。常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等

3)、时间超过

无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发 ICMP
超时报文的产生。超时报文(Type=11)的代码域有两种取值:传输超时(Code=0),表示重组分段超时(Code=1)

4)、时间戳

时间戳请求与回答可用于时钟同步和时间测量。时间戳请求报文(Type=13)和时间戳应答报文(Type=14)可以用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差

四、Wireshark抓取ICMP数据包 

1)、ICMP请求报文

报文字段说明:

* Type:报文类型
* Code:类型代码
* Checksum:检验和
* [Checksum Status]:校验和状态
* Identifier(BE):标识符大端
* Identifier(LE):标识符小端
* Sequence Number(BE):序列号大端
* Sequence Number(LE):序列号小端
* Data:数据字段
 2)、ICMP响应报文

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信