【网络篇】第十八篇——ping的工作原理

news2025/1/23 15:07:31

目录

IP协议助手——ICMP协议

查询报文类型

差错报文类型

网络不可达代码为0

主机不可达代码为1

协议不可达代码为2

端口不可达代码为3

需要进行分片但设置不分片位片码为4

ping——查询报文类型使用

traceroute


IP协议助手——ICMP协议

ping是基于ICMP协议工作的,所以要明白ping的工作原理,就要理解ICMP协议。

ICMP是什么?

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议

里面有个关键词 —— 控制 ,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死的不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面
ICMP 功能都有啥?
ICMP 主要的功能包括: 确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改 善网络设置等。
IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将 ICMP 负责
通知。

如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。

ICMP 的这种通知消息会使用 IP 进行发送 。
因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收
到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。
ICMP 包头格式

ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。

 ICMP 包头的类型字段,大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「 查询报文类型
  • 另一类是通知出错原因的错误消息,也就是「 差错报文类型

 

查询报文类型

回送消息 —— 类型 0 8

回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消

息, ping 命令就是利用这个消息实现的。
可以向对端主机发送 回送请求 的消息( ICMP Echo Request Message ,类型 8 ),也可以接收对端主机发回来的 回送应答 消息( ICMP Echo Reply Message ,类型 0 )。

相比原生的 ICMP,这里多了两个字段:

  •  标识符:用以区分是哪个应用程序发 ICMP 包,比如用进程 PID 作为标识符;
  • 序号 :序列号从 0 开始,每发送一次新的回送请求就会加 1 , 可以用来确认网络包是否有丢
    失。
选项数据 中, ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

差错报文类型

接下来,说明几个常用的 ICMP 差错报文的例子:
  • 目标不可达消息 —— 类型 为 3
  • 原点抑制消息 —— 类型 4
    重定向消息 —— 类型 5
    超时消息 —— 类型 11

 目标不可达消息(Destination Unreachable Message —— 类型为 3

IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个 目标不可达 ICMP 消息,并这个消息中显示不可达的具体原因,原因记录在 ICMP 包头的 代码 字段。

由此,根据 ICMP 不可达的具体消息,发送端主机也就可以了解此次发送不可达的具体原因

举例 6 种常见的目标不可达类型的 代码

 

 

网络不可达代码为0

例子:第一次送外卖时,小区里只有 A B 区两栋楼,但送餐地址写的是 C 区楼,小林表示头上很多问号,压根就没这个地方。
IP 地址是分为网络号和主机号的,所以当路由器中的路由器表匹配不到接收方 IP 的网络号,就通过 ICMP 协议以 网络不可达 Network Unreachable )的原因告知主机。自从不再有网络分类以后,网络不可达也渐渐不再使用了。

主机不可达代码为1

例子:第二次送外卖时,这次小区有 5 层楼高的 C 区楼了,找到地方了,但送餐地址写的是 C 区楼 601号房 ,说明找不到这个房间。

当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过 ICMP 协议以 主机不可达
Host Unreachable )的原因告知主机。

协议不可达代码为2

第三次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,但是一开门
人家是外国人说的是英语,我说的是中文!语言不通,外卖送达失败 ~
当主机使用 TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止 TCP 协 议访问,那么会通过 ICMP 协议以 协议不可达 的原因告知主机。

端口不可达代码为3

第四次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,房间里的人
也是说中文的人了,但是人家说他要的不是外卖,而是快递。。
当主机访问对端主机 8080 端口时,这次能找到对端主机了,防火墙也没有限制,可是发现对端主机没有进程监听 8080 端口,那么会通过 ICMP 协议以 端口不可达 的原因告知主机。

需要进行分片但设置不分片位片码为4

第五次送外卖时,这次是个吃播博主点了 100 份外卖,但是吃播博主要求一次性要把全部外卖送
达,小林的一台电动车装不下呀,这样就没办法送达了。
发送端主机发送 IP 数据报时,将 IP 首部的 分片禁止标志位 设置为 1 。根据这个标志位,途中的路由 器遇到超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃。
随后,通过一个 ICMP 的不可达消息类型, 代码为 4 的报文,告知发送端主机。
原点抑制消息(ICMP Source Quench Message) —— 类型 4

在使用低速广域线路的情况下,连接 WAN 的路由器可能会遇到网络拥堵的问题。

 ICMP 原点抑制消息的目的就是为了缓和这种拥堵情况

当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息
收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大 IP 包的传输间隔,减少网络拥堵的情况。
然而,由于这种 ICMP 可能会引起不公平的网络通信,一般不被使用。
重定向消息(ICMP Redirect Message) —— 类型 5

 如果路由器发现发送端主机使用了「不是最优」的路径发送数据,那么它会返回一个 ICMP 重定向消息给这个主机。

在这个消息中包含了 最合适的路由信息和源数据 。这主要发生在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外一个路由器。
超时消息(ICMP Time Exceeded Message) —— 类型 11
IP 包中有一个字段叫做 TTL Time To Live ,生存周期),它的 值随着每经过一次路由器就会减
1 ,直到减到 0 时该 IP 包会被丢弃。
此时,路由器将会发送一个 ICMP 超时消息 给发送端主机,并通知该包已被丢弃。
设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。

 此外,有时可以用 TTL 控制包的到达范围,例如设置一个较小的 TTL

ping——查询报文类型使用

接下来,我们重点来看 ping 发送和接收过程
同个子网下的主机 A 和 主机 B ,主机 A 执行 ping 主机 B 后,我们来看看其间发送了什么?

ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包。

ICMP 数据包内包含多个字段,最重要的是两个:
  • 第一个是 类型 ,对于回送请求消息而言该字段为 8
  • 另外一个是 序号 ,主要用于区分连续 ping 的时候发出的多个数据包。
每发出一个请求数据包,序号会自动加 1 。为了能够计算往返时间 RTT ,它会在报文的数据部分插入发送时间。

 然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址协议字段设置为 1 表示是 ICMP 协议,再加上一些其他控制信息,构建一个 IP 数据包。

接下来,需要加入 MAC 头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数 据链路层构建一个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;还要 附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

 

主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接 收,否则就丢弃。
接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样, IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 ICMP 回送响应消息 数据包,回送响应数据包的 类型 字段为 0 序号 为接收到的请求数据包中的序号,然后再发送出去给主机 A

 

 在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了ICMP 回送响应消息,则说明目标主机可达。

此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。
针对上面发送的事情,总结成了如下图:

 当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。

但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。
说了这么多,可以看出 ping 这个程序是 使用了 ICMP 里面的 ECHO REQUEST (类型为 8 ) 和
ECHO REPLY (类型为 0

traceroute——差错报文类型的使用

有一款充分利用 ICMP 差错报文类型 的应用叫做 traceroute (在 UNIX MacOS 中是这个命令,而在 Windows中对等的命令叫做 tracert )。
traceroute 的第一个作用就是 故意设置特殊的 TTL ,来追踪去往目的地时沿途经过的路由器。
traceroute 的参数指向某个 目的 IP 地址
这个作用是如何工作的呢?

它的原理就是利用 IP 包的生存期限 1 开始按照顺序递增的同时发送 UDP ,强制接收 ICMP 时消息的一种方法。

比如,将 TTL 设置 为 1 ,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是 时间超时
接下来将 TTL 设置为 2 ,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。
这样的过程, traceroute 就可以拿到了所有的路由器 IP
当然有的路由器根本就不会返回这个 ICMP ,所以对于有的公网地址,是看不到中间经过的路由的。
发送方如何知道发出的 UDP 包是否到达了目的主机呢?

 traceroute 在发送 UDP 包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000

)。当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型是「 端口 不可达 」。
所以, 当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。
traceroute 还有一个作用是 故意设置不分片,从而确定路径的 MTU
这么做是为了什么?

这样做的目的是为了路径MTU发现

因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500
节,但是非以外网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。

 它的工作原理如下:

首先在发送端主机发送 IP 数据报时,将 IP 包首部的 分片禁止标志位设置为 1 。根据这个标志位,
途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个 ICMP 的不可达消息将 数据链路上 MTU 的值 一起给发送主机,不可达消息的类型为 「 需要进行分片但设置了不分片位 」。
发送主机端每次收到 ICMP 差错报文时就 减少 包的大小,以此来定位一个合适的 MTU 值,以便到达目标主机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Redis Object Cache Pro插件无法使用高性能配置的解决方案

说明 辉哥演示站和本地使用的对象缓存都是redis,刚好手上有Redis Object Cache Pro插件,目前大多数用户都是用的是官方推荐的基础配置,并没有使用高性能配置(官方的说法是在毫秒内优化高流量站点),刚好辉哥…

java项目_第163期ssm药品电子商城系统_java毕业设计

java项目_第163期ssm药品电子商城系统_java毕业设计 今天分享的项目是《ssm药品电子商城系统》 该项目分为3个角色,管理员、用户、医生。 1、用户可以浏览前台,购买药品,并将药品加入到购物车; 用户还可以浏览医生信息,进行在线预…

《Java开发手册》三-代码风格

前言 这第三章主要是讲一些代码风格和规范,代码风格不影响程序运行,但对于团队的合作开发效率十分重要,相对前两章,这章内容较少 命名规约 命名符合本语言特性 每种语言都有自己的特殊风格,比如java不能以下划线&am…

Yarn模式部署Flink集群

一、环境准备 1、准备两台服务器server115 和server116安装好hadoop环境,其中server115配置hdfs的namenode,在server116上配置hdfs的SecondaryNameNode,server116配置yarn的 ResourceManager,启动hadoop集群 2、配置hadoop环境变…

Spring更简单的读取和存储对象

文章目录前言1、存储 Bean 对象1.1 前置工作1.2 添加注解存储 Bean 对象Controller(控制器存储)Service (服务存储)Repository(仓库存储)Configuration(配置存储)Component&#xff…

图书馆管理系统的设计与实现(论文+系统)_kaic

目 录 摘 要 第一章 绪论 1.1本课题研究背景与意义 1.2本课题国内外研究现状 第二章 开发技术介绍 2.1JDK的安装与配置 2.2HTML技术 2.3MySQL数据库管理系统 2.4JDBC的使用 第三章 系统分析 3.1系统的设计要求 3.2系统的设计原则 3.3系统的可行性分析 3.3.1技术可行性 3.3.2经济…

消息队列的概念和原理

消息队列一、使用消息队列的场景1.1、消息队列的异步处理1.2、消息队列的流量控制(削峰)1.3、消息队列的服务解耦1.4、消息队列的发布订阅1.5、消息队列的高并发缓冲二、消息队列的基本概念和原理2.1、消息的生产者和消费者2.2、Broker2.3、点对点消息队…

【Linux修炼】9.环境变量

每一个不曾起舞的日子,都是对生命的辜负。 环境变量本节目标1. 环境变量1.1 环境变量的概念1.2 环境变量PATH1.3 其他常见环境变量2. 和环境变量相关的命令2.1 env 命令2.2 export命令2.3 set命令2.4 unset命令3. 环境变量的意义4. 命令行参数4.1 什么是命令行参数&…

Array reduce() 如何计算元素内数值总合,计算总合

Array reduce() 如何计算元素内数值总合,计算总合 一、需求 有时候我们需要计算一个数组中所有元素的总合,这个数组可能是组 Number 类型,也可能是 Object 类型,像这样: const tempArray [2,3,4,6,456,89,24] // 或…

1.1MQ的基本概念,优劣势介绍及 RabbitMQ简介

1.MQ的基本概念 1.1 MQ概述 M Q 全称 Message Queue 消息队列,是在消息的传输过程中保存消息的容器。多用于分布式系统之间的通信。 1.2 MQ 的优势 1.2.1应用解耦 当订单系统强依赖库存系统,支付系统,物流系统等,若其中一个系…

Lambda求和函数在excel上的应用

目录 一、Lambda函数 二、Lambda求和函数 三 、实际表格运用 四、计算结果 一、Lambda函数 Lambda函数是使用lambda运算符创建的,其语法如下: 语法: lambda 参数:表达式 Python lambda函数可以包含任意多的参数,但…

Js逆向教程-16极验滑块 找到w加密位置

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 Js逆向教程-16极验滑块 找到w加密位置 一、如何下第一个断点 https://www.geetest.com/demo/slide-float.html 接口有多个w参数&…

springboot+vue 任课教师考评评价系统 Java 前后端分离

随着我国教育改革的发展,各大高校的大学生数量也在不断的增加,相对应如何去评价教学的质量问题也是很多高校一直以来所关注的内容。只有有了一个好的教学评价制度才能够让各大高校的教学质量稳步提升,本系统就是这样一个根据各项指标对教学质…

day77:注解、自定义注解、元注解

一、注解 1.什么是注解 注解是对程序进行标注和解释 2.常用注解 Override 描述子类重写父类的方法Deprecated 描述此方法已过时SuppressWarnings 压制警告 3.图解 4.注解与注释的区别 注解:给编译器看的,让虚拟机知道程序的特殊功能注…

【吴恩达机器学习笔记】

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为学习吴恩达机器学习视频的同学提供的随堂笔记。 📚专栏简介:在这个专栏,我将整理吴恩达机器学习视频的所有内容的笔记&…

PostgreSQL 同步复制原理解析

背景 Postgresql 在主备架构的场景下,支持同步流复制功能。本文将以一主一备架构为例,介绍同步流复制(同步备机)的工作方式以及内核代码的相关原理。 配置同步备机 工欲善其事,必先利其器。我们现简单的配置一个同步…

微信小程序图书管理系统

目 录 摘 要 I Abstract II 目 录 V 1 绪论 1 1.1研究背景 1 1.2研究课题和意义 2 1.3研究内容和论文结构 3 2 移动网络环境下图书管理系统的现状分析 4 2.1移动网络环境下图书管理系统的特点 4 2.2当前国内外移动网络环境下图书管理系统的现状 7 2.3微信给移动网络环境下图书管…

遥感技术及高分遥感影像在地震中的应用及高分二号获取

长期以来,地震预报监测、灾害调查、灾情信息获取主要依靠实地勘测手段,其获取的数据精度和置信度虽然较高,但存在工作量大、效率低、费用高和信息不直观等缺点。遥感技术手段可在一定程度上克服传统实地勘测手段的缺点,并具有其他…

我参加第七届NVIDIA Sky Hackathon——训练ASR模型

如何从0开始训练自己的ASR模型 第一步 获取NGC密钥 第二步 配置Ubuntu22.04的运行环境 第三步 开始训练ASR模型 文章目录如何从0开始训练自己的ASR模型前言一、获取NGC密钥二、配置Ubuntu22.04的运行环境1.安装 NVIDIA 驱动 460 以上版本2.安装 docker 与 nvidia-docker23.安装…

iClient for Leaflet实现动态绘圆的几何查询

作者:ls 【目录】 背景前期准备呈现效果实现过程完整代码 【背景】 几何查询是WebGIS项目中一项比较常用的功能,SuperMap iClient 产品支持的几何对象类型众多,能够满足用户的许多需求。 近期遇到许多小伙伴反应,绘制圆形进行…