ICMP-协议
ICMP 协议
本文为笔者学习以太网对网上资料
归纳整理所做的笔记
,文末均附有参考链接,如侵权,请联系删除。
ICMP 协议
概述
ICMP(Internet Control Message Protocol)Internet 控制报文协议。它是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP 使用 IP 的基本支持,就像它是一个更高级别的协议。但是,ICMP 实际上是 IP 的一个组成部分,必须由每个 IP 模块实现。
ICMP 协议是一种面向无连接的协议,用于传输出错报告控制信息,它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到 IP 数据无法访问目标、IP 路由器无法按当前的传输速率转发数据包等情况时,会自动发送 ICMP 消息。
ICMP 是 TCP/IP 模型中网络层的重要成员,与
IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成TCP/IP 模型中的网络层
。ping 和 tracert 是两个常用网络管理命令,
- ping 用来测试网络可达性,
- tracert 用来显示到达目的主机的路径。
ping 和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。
从技术角度来说,ICMP 就是一个
错误侦测与回报机制
,其目的就是让我们能够检测网路的连线状况,也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过 ICMP 向数据包的源端报告有关事件。
其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP 重定向),资料流量控制。ICMP 在沟通之中,主要是透过不同的类别(Type)与代码(Code)让机器来识别不同的连线状况。
ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。
数据包格式
以太网 ICMP 传输单包数据的格式如下图所示。从图中可以看出,以太网的数据包就是对各层协议的逐层封装来实现数据的传输。用户数据打包在 ICMP 协议中,ICMP 协议又是基于 IP 协议之上的,IP 协议又是走 MAC 层发送的,即从包含关系来说:MAC 帧中的数据段为 IP 数据报,IP 报文中的数据段为 ICMP报文,ICMP 报文中的数据段为用户希望传输的数据内容。
ICMP 报文包含在 IP 数据报中,属于 IP 的一个用户数据,IP 头部就在 ICMP 报文的前面,所以一个
ICMP报文包括 IP 头部、ICMP 头部和 ICMP 报文
,IP 头部的 Protocol 值为 1 就说明这是一个 ICMP 报文,如下图所示,ICMP 头部中的类型(Type)域用于说明 ICMP 报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种 ICMP 报文的类型,所有数据都在 ICMP 头部后面。
ICMP 数据格式如下图所示:
ICMP 首部共 8 个字节,同 IP 首部一样,也是一行以 32 位(4 个字节)为单位。
类型(type):占用了 8 bit 位,前面我们说,是 ICMP 报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。
常用类型有:
- 类型 0,代码 0:表示回显应答(ping 应答),
- 类型 8,代码 0:表示回显请求(ping 请求)。
- 类型 11,代码 0:超时;
- 类型 3,代码 0:网络不可达;
- 类型 3,代码 1:主机不可达;
- 类型 5,代码 0:重定向。
代码(code):占用了 8 bit 位,根据 ICMP 差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型为 11 且代码为 0,表示数据传输过程中超时了,超时的具体原因是 TTL 值为 0,数据报被丢弃。
校验和(checksum):占用了 16 bit 位,校验的方法同上述 IP 首部校验和的方法一致。数据发送到目的地后需要对 ICMP 数据报文做一个校验,用于检查数据报文是否有错误。与 IP 校验和一致,仅校验ICMP首部
标识符(Identifier):占用了 16 bit 位,对于每一个发送的数据报进行标识。
序列号(Sequence number):占用了 16 bit 位,对于发送的每一个数据报文进行编号,比如:发送的第一个数据报序列号为 1,第二个序列号为 2。
数据(Data):要发送的 ICMP 数据。
实例分析
ICMP 请求
以 ICMP 请求报文为例,我们来看一下 ICMP 请求报文的封装格式:
icmp 请求报文的封装格式
ping 命令抓的 ICMP 协议包,其中 request 是 ICMP 请求数据报,reply 是 ICMP 回答数据报,另外 request 和 reply 是一组 ICMP 请求回答数据报。
ICMP 请求回答数据报
ICMP 应答
我们再针对一组 ICMP 请求回答数据报分析两个 ICMP 数据报是否为一组。Type 的值为 8’h08 是请求类型报文如下左图所示,Type 的值为 8’h00 是应答类型报文如下右图所示,
序列号(Sequence number)一致是同一组 ICMP 请求回答数据报
。
下面我们来看一下,我们在用 ping 命令发送的 ping 包携带的是什么数据
Data 就是刚才 ping 命令所发送的 ICMP 数据报文里的数据部分,这些数据是 ping 命令发送的测试内容,左侧部分是以十六进制表示,右侧部分就是我们所发送的数据部分,这些数据长度正好是 32 字节,一个字母代表一个字节。
参考
- 正点原子 LWIP
- 野火 LWIP