24 张图搞定 ICMP :最常用的网络命令 ping 和 tracert

news2025/1/17 14:06:38

ICMP

IP 是尽力传输的网络协议,提供的数据传输服务是不可靠的、无连接的,不能保证数据包能成功到达目的地。那么问题来了:如何确定数据包成功到达目的地?

这需要一个网络层协议,提供错误检测功能和报告机制功能,于是出现了 ICMP(互联网控制消息协议)。ICMP 的主要功能是,确认 IP 包是否成功送达目的地址通知发送过程中 IP 包被丢弃的原因。有了这些功能,就可以检查网络是否正常、网络配置是否正确、设备是否异常等信息,方便进行网络问题诊断

举个栗子:如果在传输过程中,发生了某个错误,设备便会向源设备返回一条 ICMP 消息,告诉它发生的错误类型。

ICMP 消息是通过 IP 进行传输,但它的目的并不是让 IP 成为一种可靠的协议,而是对传输中发生的问题进行反馈。ICMP 消息的传输同样得不到可靠性保证,也有可能在传输过程中丢失。因此 ICMP 不是传输层的补充,应该把它当做网络层协议

ICMP 消息封装

ICMP 消息使用 IP 来封装,封装格式如下图。

其中 type(类型)字段表示 ICMP 消息的类型,code(代码)字段表示 ICMP 消息的具体含义。例如:type 值为 3 表示目的不可达消息( Destination Unreachable Message ),若 code 值为 0 表示目的网络不可达( Network Unreachable )。常见的 ICMP 消息类型如下图。

从功能上,ICMP 的消息可分为两类:一类是通知出错原因的错误消息,另一类是用于诊断的查询消息

常见的 ICMP 消息类型

  • 回送请求消息( Echo Request ):是由源设备(主机或路由器等)向一个指定的目的设备发出的请求。这种消息用来测试目的地是否可达。
  • 回送响应消息( Echo Reply ):对 Echo Request 的响应。目的设备发送 Echo Reply 来响应收到的 Echo Request 。最常用的 ping 命令就是使用 Echo Request 和 Echo Reply 来实现的。

  • 目的不可达( Destination Unreachable ):路由器无法将 IP 包发送给目的地址时,会给源设备返回一个 Destination Unreachable 消息,并在消息中显示不可达的具体原因。

实际情况下,经常会遇到的错误代码是 1 ,表示主机不可达,它是指路由表中没有目的设备的信息,或目的设备没有连接到网络。

  • 参数问题( Parameter Problem ):路由器发现 IP 包头出现错误或非法值后,向源设备发送一个 Parameter Problem 消息。这个消息包含有问题的 IP 头,或错误字段的提示信息。

  • 重定向( Redirect ):如果路由器发现一条更优的路径发送数据,那么它就会返回一个 Redirect 消息给主机。这个消息包含了最合适的路由信息和源数据。

实际情况下,这种 Redirect 消息会引发路由问题,所以不进行这种设置。比如:路由器的路由表不准确时,ICMP 有可能就无法正常工作。

  • 超时( Time Exceeded ):IP 包中有一个字段是 TTL(生存周期),它的值每经过一次路由器就减 1 ,直到减到 0 时 IP 包会被丢弃。这时,路由器会发送一个 Time Exceeded 消息给源设备,并通知 IP 包已被丢弃。

设置 TTL 的主要目的,是当路由发生环路时,避免 IP 包无休止的在网络上转发。还可以用 TTL 控制 IP 包的可达范围,比如设置一个较小的 TTL 值。

  • 时间戳请求/时间戳响应( Timestamp Request / Timestamp Reply ):时间戳可以记录 ICMP 消息一次往返所需的时间。源设备发送一个带有发送时间的 Timestamp Request 消息,目的设备收到后,发送一个带有原设备发送时间、目的设备接收时间以及目的设备发送时间的 Timestamp Reply 消息。源设备收到 Timestamp Reply 时,并同时记录到达时间。这些时间戳可以估计网络上的传输时间。

ICMP 的应用

ICMP 被广泛应用于网络测试,最常用的 ping tracert 网络测试工具,都是使用 ICMP 协议实现的。

ping

ping ICMP 最著名的一个应用,通过 ping 可以测试网络的可达性,即网络上的报文能否成功到达目的地。使用 ping 命令时,源设备向目的设备发送 Echo request 消息,目的地址是目的设备的 IP 地址。目的设备收到 Echo request 消息后,向源设备回应一个 Echo reply 消息,可知目的设备是可达的。也可以通过 ping 命令来判断目标主机是否启用。

如果中间某个路由器没有到达目的网络的路由,便会向源设备回应一个 Destination Unreachable 消息,告知目的设备不可达。

如果源主机在一定时间内无法收到回应报文,就认为目的设备不可达,并显示超时。

需要注意的是 ping 过程是双向的消息通信,只有双向都成功传输时,才能说明通信是正常的。另外主机也可能因为防火墙拦截,导致 ping 不通。

tracert

ping 工具只能测试目的设备的连通性,但是看不到数据包的传输路径。所以在网络不通的情况下,无法知道网络问题发生在哪个位置。tracert 工具可以查看数据包的整条传输路径,包括途中经过的中间设备

IP 头部的 TTL 字段是为避免数据包循环转发而设计的。每经过一个路由器,数据包头中的 TTL 值减 1 。如果 TTL 值为 0 则丢弃报文,并向源设备回应一个 Time Exceeded 消息,告知错误类型。tracert 就是基于 TTL 字段和 ICMP 协议实现的。在 Windows 中命令是 tracert ,在 Unix MacOS 中命令是 traceroute

使用 tracert 命令时,源设备的 tracert 逐跳发送数据包,并等待每一个响应报文。发送第一个数据包时,TTL 值设为 1 。第一个路由器收到数据包后 TTL 值减 1 ,随即丢弃数据包,并返回一个 Time Exceeded 消息。源设备的 tracert 收到响应报文后,取出源 IP 地址,即路径上的第一个路由器地址。然后 tracert 发送一个 TTL 值为 2 的数据包。第一个路由器将 TTL 值减 1 ,并转发数据包。第二个路由器再将 TTL 值减 1 ,丢弃数据包并返回一个 Time Exceeded 消息。tracert 收到响应报文后,取出源 IP 地址,即路径上的第二个路由器地址。类似步骤,tracert 逐跳获得每一个路由器的地址,并探测到目的设备的可达性。

tracert 过程也是双向的消息通信,只有双向都成功传输时,才能正确探测路径。另外主机安装了防火墙,也可能造成路径探测失败。

网络实战

ping

Windows 电脑上使用 ping 命令,并查看返回信息。

同步抓包进行验证。

还可以直接使用 ping 命令,查看 ping 命令的使用方法

tracert

Windows 电脑上使用 tracert 命令,并查看返回信息。

同步抓包进行验证。

也可以直接使用 tracert 命令,查看 tracert 命令的使用方法

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

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

相关文章

Python爬虫——urllib_post请求百度翻译

post请求: post的请求参数,是不会拼接在url后面的,而是需要放在请求对象定制的参数中 post请求的参数需要进行两次编码,第一次urlencode:对字典参数进行Unicode编码转成字符串,第二次encode:将字…

GNN环境安装

参考: torch_geometric踩坑实战–安装与运行 亲测有效!! https://blog.csdn.net/m0_55245520/article/details/130424828pytorch 查看gpu cuda版本 https://blog.csdn.net/jacke121/article/details/93592487 x.1 安装 x.1.1 镜像信息补充…

【LeetCode】594. 最长和谐子序列

594. 最长和谐子序列(简单) 方法:哈希表计数 思路 题目规定的「和谐子序列」中的最值差值正好为 1,因而子序列排序后必然符合[a,a,.., a 1,a1]形式,即符合条件的和谐子序列长度为相邻两数(差值为 1)的出现次数之和。…

element中icon字体图标的使用

效果图 官方提供的图标 icon字体图标 安装 安装依赖 cnpm install element-plus/icons-vue 编写src/plugins/icons.js import * as components from "element-plus/icons-vue";export default {install: (app) > {for (const key in components) {const comp…

c++智能指针简单示例

代码 #include<iostream> using namespace std; #include<memory> // 头文件class TestClass { private:int Value;public:TestClass(int value) :Value(value) {cout << "构造函数调用" << endl;}~TestClass() {cout << "析构函…

如何有效阅读文献

作为研究生要保持看文献的能力&#xff0c;以《面向大规模图像定位的高效优先匹配&#xff08;Efficient & Effective Prioritized Matching for Large-Scale Image-Based Localization&#xff09;》文献为例&#xff0c;本文记录了自己在学习过程中如何阅读文献技巧。 文…

第八节 学生管理系统 (阶段案例)

学生管理系统 1.1 设计背景 管理系统&#xff0c;主要任务就是使用计算机对学生的各种信息进行日常管理&#xff0c;如&#xff1a; 添加删除修改查询退出系统 程序设计思路 1.2 需求设计分析 打印 “学生管理系统” 的功能菜单,提示用户选择功能序号; print_menu() 打印函…

WebSocket协议基础

文章目录 什么是websocketwebsocet 特点 一、websocket 建立连接流程二、websocket 握手流程客户端握手包2.服务端握手包 三、websocket数据总结参考 什么是websocket WebSOcket 是基于TCP的应用层协议。该协议和http或https 相似&#xff0c;但是却区别于http的一种新的协议。…

AD Class 、设计参数、规则的创建

设计 生产 线宽 间距 过孔 根据生产的要求进行桥接 Class 电源走线 和 信号走线 设计—》类里有 将所有的电源都添加进电源类里 新建的类别可以在Panls的PCB中看到 并且可以在这里面改变线的颜色 区分电源 对于走线的宽度,电源主要是用来载流的&#xff0c;信号主要是用来做信…

彻底理解Handler的设计之传送带模型

作者&#xff1a;彭泰强 0 这篇文章的目的 有时候在Handler相关的文章中可以看到&#xff0c;会把Handler机制的几个角色类比成一个传送带场景来理解。 例如&#xff0c;这篇文章中写到&#xff1a; 我们可以把传送带上的货物看做是一个个的Message&#xff0c;而承载这些货物…

6.2.8 网络基本服务----万维网(www)

6.2.8 网络基本服务----万维网&#xff08;www&#xff09; 万维网即www&#xff08;World Wide Web&#xff09;是开源的信息空间&#xff0c;使用URL也就是统一资源标识符标识文档和Web资源&#xff0c;使用超文本链接互相连接资源&#xff0c;万维网并非某种特殊的计算机网…

力扣 198.打家劫舍【中等】

198.打家劫舍 1 题目2 思路3 代码4 结果 1 题目 题目来源&#xff1a;力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/house-robber 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃…

【Vue3】初始化和Composition API(组合式)

Vue3 创建Vue3.0工程查看自己的vue/cli版本&#xff0c;使用Vue/cli创建使用vite创建 查看Vue3.0工程vue.config.js中&#xff0c;关闭语法检查&#xff0c;main.js讲解app.vue讲解 常用的Composition API&#xff08;组合式&#xff09;1.拉开序幕的setup返回对象返回渲染函数…

降级npm后,出现xxx 不是内部或外部命令解决方法

比如我安装了anyproxy npm install anyproxy -g 之后在cmd中输入anyproxy 发现 anyproxy 不是内部或外部命令解决方法. 一般出现这样的问题原因是npm安装出现了问题&#xff0c;全局模块目录没有被添加到系统环境变量。 Windows用户检查下npm的目录是否加入了系统变量P…

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测 目录 时序预测 | MATLAB实现Hamilton滤波AR时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 预测在很大程度上取决于适合周期的模型和所采用的预测方法,就像它们依赖于过滤器提取的周期一样。标准 Hodrick-P…

Top-down方法学

Top-down方法学由Intel提出&#xff0c;是一种软件性能分析技术。 x86处理器的PMU一般提供8个PMC&#xff0c;其中4个是固定的PMC&#xff0c;其对应的监控信号是不能配置的。另外4个PMC监控的信号是可以配置的。 Top-down方法学的动机 通过PMC&#xff0c;软件工程师可以获…

【观察】超融合+软件定义,构建双活数据中心“新范式”

随着数字化转型的加速&#xff0c;企业的业务经营活动越来越多依赖于数据中心等基础设施&#xff0c;“全天候”业务连续性运营也正成为大中型企业追求的目标&#xff0c;如何实现减少甚至消除正常和非正常的停机对业务可用性造成的影响&#xff0c;不但是企业IT建设与运维团队…

Spring - 更简单的获取 Bean 对象

目录 二、获取 Bean 对象&#xff08;对象装配或者对象注入&#xff09; 1. 属性注入 1.1 属性注入的优点和缺点&#xff1a; 2. Setter注入 2.1 Setter注入的优点和缺点 3. 构造方法注入&#xff08;spring 官方推荐的对象注入方式&#xff09; 3.1 构造方法的优点和缺点…

【PHP面试题47】Redis的持久化有哪几种?有什么区别?谈谈你的理解

文章目录 一、前言二、RDB&#xff08;Redis数据库&#xff09;持久化方式2.1 触发条件2.2 RDB文件的格式2.3 RDB持久化原理2.4 RDB方式的优缺点 三、AOF&#xff08;Append Only File&#xff09;持久化方式3.1 触发条件3.2 AOF文件的格式3.3 AOF持久化原理3.4 AOF方式的优缺点…

cmake项目相关的变量

cmake项目相关的变量 在cmake项目中&#xff0c;通常需要对路径进行操作&#xff0c;比如我们需要知道源码的顶级目录&#xff0c;源码的构建目录和某个project名字相关的一些目录等。 CMAKE_SOURCE_DIR&#xff0c;这个变量的值代表的是源码的顶级目录。但是这个变量的值可能…