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

进一步认识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.mrgr.cn/news/61526.html

相关文章:

  • Linux电源管理——Suspend-to-Idle(s2idle) 流程
  • FFmpeg Muxer HLS
  • 【笔记整理】记录参加骁龙AIPC开发者技术沙龙的笔记
  • 【计算机操作系统:九、文件系统】
  • 算法初学者(图的存储)链式前向星
  • 代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
  • MySQL用户权限管理属于SQL语句中的DCL语句
  • 深入理解阻塞队列
  • 鸿蒙生态崛起:开发者的机遇与挑战
  • 数据结构————map,set详解
  • Rust实现Kafka - 前言
  • 18 Docker容器集群网络架构:一、etcd 概述
  • windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(一)
  • Ubuntu下搭建自己的Docker镜像仓库
  • svg + canvas + 烟花 + 0.0
  • 记录一次更新idea
  • 记录工作上一次计算的优化
  • 基于JSP的篮球系列网上商城系统【附源码】
  • 图的最短路径算法-迪杰斯特拉(Dijkstra)算法与弗洛伊德(Frolyd)算法(更新中)
  • Git提交代码完整流程
  • 基于SSM+小程序的购物管理系统1
  • Redis-README官方入门文档
  • 深度学习数学基础之链式法则
  • 基于spootboot学生选课系统设计与实现
  • C++17 折叠表达式
  • 【数据结构】排序代码分享