当前位置: 首页 > article >正文

进一步认识ICMP协议

在日常工作中,我们经常需要判断网络是否连通,相信大家使用较多的命令就是 ping啦。ping命令是基于 ICMP 协议来实现的,那么什么是 ICMP 协议呢?ping命令又是如何基于 ICMP 实现的呢?

今天这篇文章,我们就来一起搞清楚其中的原理。下面首先我们先来了解一下ICMP 协议。

参考:深入理解ICMP协议 - 知乎 (zhihu.com)

简介

ICMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它是互联网协议族的核心协议之一。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。

为什么需要ICMP协议?

IP协议的缺点

1、IP协议没有差错报文或差错纠正机制

2、IP协议缺少一种为主机和管理查询的基址

所以ICMP协议就是为了补充IP协议的这两个缺点而设计的,配合IP协议使用

ICMP的报文格式

ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文,IP 数据包就是靠这个协议类型字段来区分不同的数据包的。如下图 WireShark 抓包所示:

在 IP 通信中如果某个包因为未知原因没有到达目的地址,那么这个具体的原因就是由 ICMP 负责告知。而 ICMP 协议的类型定义中就清楚的描述了各种报文的含义。

从 ICMP 的报文格式来说,ICMP 是 IP 的上层协议。但是 ICMP 是分担了 IP 的一部分功能。所以,他也被认为是与 IP 同层的协议。下面一起来看一下 ICMP 数据包格式和报文内容吧。具体参考下图:

可以看到,我们一层层剥开 ICMP 的外壳,查看其本质。方便我们更好的理解 ICMP 协议。

更多参考:ICMP协议以及报文讲解(ICMP查询报文、ICMP差错报文)_icmp报文-CSDN博客

通过Type和Code定义ICMP的报文类型

ICMP报文主要分为查询报文和差错报文两大类

查询报文:主要用于在主机和路由器之间传输控制信息,也用来探测网络连通性和路径等信息

差错报文:用于报告数据传输过程中的错误

ICMP回显请求/应答报文

作用

通过ping工具发送ICMP回显请求消息探测网络的连通性(对端回应ICMP回显应答请求)

报文格式

Type

8为请求

0为应答

Identifier

标识符,标识ICMP该回显应答对应的是哪个回显请求(通过该字段使得请求和应答一一对应)

BE和LE是通过不同的编码格式得到的值,解码后的信息都是一样的

可以理解为BE是针对于windows系统的编码格式,LE是针对于Linux系统的编码格式

Sequence Number

序列号,发送报文的序列号,每次发送序列号就+1

Data

可选,包含要发送的数据(回显应答通常返回与回显请求所收到的数据相同)

ICMP协议的应用--Ping命令

通过上面的叙述,我们初步了解了 ICMP 协议的内容,那么下面我们来看一下ICMP 的具体实现与应用吧,首先我们来了解查询报文的应用--ping,下面我们通过 ping 同一个子网的主机,来看一下整个过程是怎么样的。

那么比较完整的流程是:

1

向目的服务器发送回显请求

首先,向目的服务器上执行ping命令,主机会构建一个 ICMP 回显请求消息数据包(类型是8,代码是0),在这个回显请求数据包中,除了类型和代码字段,还被追加了标识符和序号字段。标识符和序号字段分别是 16 位的字段。ping 命令在发送回显请求数据包时,会将进程号填写在标识符里。对于序号,每送出一个数据包数值就增加1。而且,回显请求的选项数据部分用来装任意数据。这个任意数据用来调整 ping 的交互数据包的大小。如下图在 10.240.225.13上执行 ping www.baidu.com的命令:

通过 WireShark 抓包这个过程。

上图中我们可以看到 ICMP 的 Type(协议类型)是 8,Code(代码)是 0。

2

目的服务器发送回显应答

当192.168.1.10发送回显请求数据包后,192.168.1.1就会向发送方192.168.1.10发送回显应答(类型是0,代码是0),这个 ICMP 回显应答数据包在 IP 层来看,与被送来的回显请求数据包基本上一样。不同的只有源、目标 IP 地址字段被交换了,Type类型字段里填入了表示回显应答的0。通过 WireShark 抓包可以看出,如下图:

3

源服务器显示相关数据

如果源服务器可以接收到回显应答数据包,那我们就认为192.168.1.1是正常工作着的。进一步,记住发送回显请求数据包的时间,与接收到回显应答数据包的时间差,就能计算出数据包一去一回所需要的时间。这个时候ping命令就会将目的服务器的 IP 地址,数据大小,往返花费的时间打印到屏幕上。如下图:

注意, 此处 ping 的是域名,不是url,域名可以通过DNS解析成IP地址

小结

(1)ping命令会先发送一个 ICMP Echo Request给对端

(2)对端接收到之后, 会返回一个ICMP Echo Reply

(3)若没有返回,就是超时了,会认为指定的网络地址不存在。

补充

传统的的ICMP(Internet Control Message Protocol,网际控制消息协议)只支持IPv4

如果要支持IPv6,需要使用ICMPv6。

ICMPv6保留了ICMP的基本功能,但针对IPv6的特性进行了增强和改进。例如,ICMPv6不仅包含了差错报文和信息报文,还增加了一些新的功能,如邻居发现、地址解析、重复地址检测、路由发现、Path MTU发现以及重定向等。这些新功能使得ICMPv6在IPv6网络中能够更好地发挥作用,满足IPv6网络的需求。

总的来说,ICMP是一个灵活且可扩展的协议,它不仅支持IPv4,还通过ICMPv6的形式支持IPv6,为不同版本的IP网络提供了必要的控制和管理功能。


http://www.kler.cn/a/373876.html

相关文章:

  • 恋爱脑学Rust之闭包三Traits:Fn,FnOnce,FnMut
  • 无人机避障——2D栅格地图pgm格式文件路径规划代码详解
  • 开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码
  • CentOS8.5.2111(4.1)数据中心主DNS部署
  • 9种 Vuejs 常用事件修饰符与使用指南
  • Spring自动装配(特别版)
  • PAT甲级-1074 Reversing Linked List
  • H5中文可以换行,英文无法换行
  • [nssround#4 swpu]1zweb
  • 计算合约方法的签名
  • Terraform Provider 加速方案
  • Mybatis-17.动态SQL-foreach
  • 【Unity】游戏UI中添加粒子特效导致穿层问题的解决
  • Android:ViewPaper动态添加移除第一页
  • ssm017网上花店设计+vue(论文+源码)_kaic
  • Django - 验证码使用
  • Python基础学习(八)断点调试
  • HTML入门教程19:HTML ID
  • 软件项目管理要点
  • 深度学习:yolo的使用--图像处理
  • 任意文件下载
  • 后端Java学习:springboot之文件上传(阿里云OSS存储)
  • object_model_3d_to_xyz 自理解及操作
  • Java设计模式之代理模式(三)
  • nmcli命令网络配置详解
  • 手动写一个new