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 字节,一个字母代表一个字节。

参考

  • https://blog.csdn.net/yindq1220/article/details/139023896
  • 正点原子 LWIP
  • 野火 LWIP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tyustli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值