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

《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute

目录

一、ICMP回显请求和回显应答

1、ICMP回显请求

2、ICMP回显应答

二、ARP高速缓存

三、IP记录路由选项(Record Route,RR)

1、记录路由选项的工作过程

2、RR 选项的 IP 头部格式

2.1、RR 请求

2.2、RR响应

四、ping 的去返路径

五、tracert 原理

1、TTL 字段

2. 工作过程

六、tracert 测试


一、ICMP回显请求和回显应答

ping + ip/域名,这应该是 ping 程序最被常用的指令了,用来检测网络的连通性。其中,主要包含两类 ICMP 报文:icmp回显请求和回显应答,其报文格式如下

1、ICMP回显请求

type = 8,code = 0

2、ICMP回显应答

type = 0,code = 0

二、ARP高速缓存

正如原文中说到:“通常,第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP高速缓存中的缘故。”

解释:通常情况下,当我们第一次ping一个陌生的域名时,会先尝试寻求 dns 解析域名得到 ip 地址,然后再发送 arp 得到 ip 地址对应的以太网地址,这会需要一定的时间。而当得到 ip 跟 以太网地址的映射后会记录到 APR 高速缓存中,在这个映射被老化之前,以后的 ping 就不再需要经过 arp 请求动作。所以在 ping ip/域名时,可能会出现 “第1个往返时间值要比其他的大” 的现象。

三、IP记录路由选项(Record Route,RR)

记录路由选项(RR):是一种IP选项,用于记录数据报在传输过程中经过的路由器的IP地址。ping 程序通过设置这个选项,可以追踪数据报的传输路径。

注:值得注意的是,RR 是一个 IP选项,而不是定义封装在 ICMP 报文中的。

1、记录路由选项的工作过程

  • 发送阶段

    • 当ping程序发送包含IPRR选项的IP数据报时,数据报中会预留一个字段用于记录路由信息。

    • 每个处理该数据报的路由器都会将自己的IP地址写入这个预留字段中。

    • 这样,数据报在传输过程中会逐步记录经过的路由器的IP地址。

  • 接收阶段

    • 当数据报到达目的地时,目标主机的IP地址也会被记录在清单中。

    • 目标主机收到数据报后,会生成一个ICMP回显应答报文。

    • 在回显应答报文中,记录路由选项字段中的IP地址清单会被复制到回显应答报文中。

    • 当回显应答报文返回到源主机时,沿途经过的路由器也会将自己的IP地址加入到清单中。

2、RR 选项的 IP 头部格式

如下头部格式所示:其中,options 的 Type 为 7 表示 RR。Tpye、Length、Pointer 各占 1字节。

注:需要说明的一点,IP首部中的首部长度字段只有 4bit,因此整个IP首部最长只能包括15个32 bit 长度(即60个字节)。由于IP首部固定长度为20字节,RR选项用去3个字节,这样只剩下37个字节(60-20-3)来存放IP地址清单,也就是说只能存放 9个 IP地址。

当我们使用 ping 命令时也会有提示,RR(IP地址)清单 有效范围为 1~9。

2.1、RR 请求

如下,是一个 ping 程序携带 -r 8 参数抓取的报文,可以看到:

①、code是一个字节,指明IP选项的类型。对于RR选项来说,它的值为7。

②、len是RR选项总字节长度,即 35字节 = 3 +(4*8)。

③、pontier 称作指针字段,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个IP地址的位置。随着每个IP地址存入清单,ptr的值分别为8,12,16,最大到36。

④、在 IP首部初始化了8个四字节的“Empty Route”

2.2、RR响应

可以看到,pontier 指针的值为 20,即记录了 4 = (20/4 - 1) 个路由IP地址

四、ping 的去返路径

值得留意的是,ping 的出发路径跟返回返回路径并不一定是对等的。这取决于路径中的设备的路由决策。

比如,由设备A ping 目的设备C,其 ping 的出发路径是 A -> B -> C,

而返回路径可能是 C->D->B->A,这是因为对于 C 目标设备来说,它并不知道 A设备的确定路由,于是采用默认路由策略将分组送往 D设备。

五、tracert 原理

注:我是在 windows 上测试的,所以使用的是 tracer。如果你是在例如 linux 上系统上执行,应该使用的是 traceroute。

我们知道,IP首部中留给选项的空间有限,不能存放当前大多数的路径。在IP首部选项字段中最多只能存放9个IP地址。所以这通常没办法通过 ping 来探测一个完整路径。

所以我们需要其他方式来探测完整的路由路径,比如 tracert。 tracert 的工作原理基于 IP 协议中的 TTL(Time To Live,生存时间) 字段和 ICMP(Internet Control Message Protocol,互联网控制消息协议) 消息。

1、TTL 字段

  • 每个 IP 数据包都有一个 TTL 字段,初始值由发送方设置。

  • 每经过一个路由器,TTL 值会减 1。当 TTL 值减到 0 时,路由器会丢弃该数据包,并向发送方发送一个 ICMP Time Exceeded 消息。

  • tracert 利用这一机制来确定数据包经过的每一跳路由器。

2. 工作过程

  1. 发送数据包

    • tracert 从本地主机开始,发送一个带有 TTL 值为 1 的 UDP(或 ICMP)数据包到目标主机。

    • 第一个路由器收到数据包后,将 TTL 减 1,发现 TTL 为 0,于是丢弃数据包,并向发送方发送一个 ICMP Time Exceeded 消息。

    • 发送方收到这个消息后,记录下第一个路由器的 IP 地址。

  2. 递增 TTL 值

    • 接下来,tracert 再发送一个带有 TTL 值为 2 的数据包。

    • 数据包经过第一个路由器后,TTL 减 1 变为 1,继续到达第二个路由器。

    • 第二个路由器将 TTL 减 1,发现 TTL 为 0,于是丢弃数据包,并向发送方发送一个 ICMP Time Exceeded 消息。

    • 发送方记录下第二个路由器的 IP 地址。

  3. 重复过程

    • tracert 逐渐增加 TTL 值,依次记录每一跳路由器的 IP 地址,直到数据包到达目标主机。

    • 当数据包到达目标主机时,目标主机会返回一个 ICMP Echo Reply 消息,表示数据包已经到达目的地。

  4. 输出结果

    • tracert 将每一跳的路由器 IP 地址、延迟时间等信息显示出来,形成完整的路径。

六、tracert 测试

1、tracert 100.164.0.1 的执行结果如下图

其实际路径是:192.168.31.201 -> 192.168.31.1 -> 100.64.0.1

2、对应抓取的报文如下:

正如原文中所说 tracert 一次发三个包,这在上图的抓包中明显体现了这一点。为了简化分析,我们只保留一份数据,如下:

3、过程分析

①、192.168.31.201 向 100.64.0.1 发送 ICMP 回显请求,并设置 TTL = 1

②、上面的包传到 192.168.31.1 时,TTL 就为 0 了,所以会回一个 ICMP Time Exceeded 消息。

当 192.168.31.201 的 tracert 收到这个 ICMP 差错报告报文后,就知道第一个路由是 192.168.31.1,将其记录下来

③、然后将 TTL 设置为 2,继续发送

④、192.168.31.201 主机收到  ICMP Echo Reply 消息,表示知道数据包已经到达目的地。

相关文章:

《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute

目录 一、ICMP回显请求和回显应答 1、ICMP回显请求 2、ICMP回显应答 二、ARP高速缓存 三、IP记录路由选项(Record Route,RR) 1、记录路由选项的工作过程 2、RR 选项的 IP 头部格式 2.1、RR 请求 2.2、RR响应 四、ping 的去返路径 五…...

Leetcode:1. 两数之和

题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示…...

【Java学习笔记】冒泡排序

冒泡排序 思想&#xff1a;经过一轮遍历比较&#xff0c;把最大的放在数组的末尾 int[] a {3, 2, 1}; for( int i 0; i < a.length-1; i){for( int j 0; j < a.length-1-i; j){if(a[j] > a[j1]){int temp a[j];a[j] a[j1];a[j1] temp;}} } for( int i 0; i &…...

【数字图像处理】立体视觉基础(2)

相机标定 【1】相机标定的概念 相机参数&#xff1a;相机成像的几何模型的参数 相机标定&#xff1a;求解参数的过程 【2】相机标定的作用 &#xff08;1&#xff09;求出相机的内、外参数&#xff0c;以及畸变参数 &#xff08;2&#xff09;校正镜头畸变影响&#xff0c;…...

NtripShare 2025第一季度主要技术进展

GNSS方面 1、开源GNSS接收机配置软件基础版本。 2、商业版本GNSS接收机配置软件&#xff0c;增加PPP、文件保存、前端解算&#xff08;静态、RTK-Static&#xff09;&#xff0c;前端坐标转换。 3、GNSS接收机配置软件全面适配米尔T133i硬件方案。 视觉检测方面 1、做出第…...

头歌实训之存储过程、函数与触发器

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

【华为】防火墙双击热备-之-主备模式-单外网线路-分享

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…...

c++ package_task

int print_sum(int a, int b) {std::cout << a << " " << b << " " << (a b) << std::endl;return a b; }int main() {// 创建绑定后的可调用对象auto print_sum_5 std::bind(print_sum, 5, 6);// 包装为 packag…...

基于计算机视觉的行为检测:从原理到工业实践

一、行为检测的定义与核心价值 行为检测(Action Recognition)是计算机视觉领域的关键任务,旨在通过分析视频序列理解人类动作的时空特征。其核心价值体现在时序建模和多尺度分析能力上——系统需要捕捉动作的起始、发展和结束全过程,同时适应不同持续时间(0.1秒至数分钟)…...

川翔云电脑32G大显存集群机器上线!

川翔云电脑今日重磅推出32G 大显存机型&#xff0c;为游戏玩家、设计师、AI 开发者等提供极致云端算力体验&#xff01; 一、两大核心配置&#xff0c;突破性能天花板 ✅ 32G 超大显存机型 行业领先&#xff1a;搭载 NVIDIA 专业显卡&#xff0c;单卡可分配 32G 独立显存&am…...

加里·基尔代尔:CP/M之父与个人计算时代的先驱

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 加里基尔代尔&#xff1a;CP/M之父与个人计算时代的先驱 一、早年生活与教育背景 1.…...

静态多态和动态多态的区别

C多态机制深度解析 多态是面向对象编程的核心特性&#xff0c;允许通过统一接口执行不同实现。在C中&#xff0c;多态表现为基类指针或引用调用虚函数时&#xff0c;根据实际对象类型执行对应派生类的函数逻辑。 基础实现示例 定义基类与派生类&#xff0c;演示动态绑定…...

MQL5教程 06 EA开发实战

文章目录 一、调用多指标多周期EA示例二、获取ZigZag顶点值三、逆势加仓EA 一、调用多指标多周期EA示例 shuju.mqh: class shuju{public:shuju(){} ~shuju(){}void MA(double &ma[],int count,string symbol, // 交易品种名称 ENUM_TIMEFRA…...

LLaMa Factory大模型微调

LLaMa Factory大模型微调 大模型微调平台&硬件LLaMA-Factory安装hfd下载hugging face模型自我认知微调Alpaca数据集指令监督微调断点续训 大模型微调 微调自我认知微调特定领域数据集。 平台&硬件 Ubuntu20.04显卡&#xff1a;M40 24G 2080TI 22G微调框架&#xff…...

Burp靶场JWT学习笔记1

JWT(JSON Web Token) 从其名字就可以看出来&#xff0c;它具有表示身份的作用&#xff0c;其本质是将用户信息储存到一串json字符串中再将其编码得到一串token JWT由三部分组成&#xff0c;分别是 Header&#xff0c;Payload&#xff0c;Signatrue JWTBase64(Header).Base6…...

C++?类和对象(下)!!!

一、前言 在之前我们已经讨论过了有关类和对象的前置知识以及类中的六大默认成员函数&#xff0c;在本期我们继续再讨论类和对象中剩余的友元、初始化列表等相关知识&#xff0c;如果需要再了解之前的知识的话&#xff0c;链接奉上&#xff1a;C&#xff1f;类和对象&#xff0…...

FastAPI 零基础入门指南:10 分钟搭建高性能 API

一、为什么选择 FastAPI&#xff1f; 想象一下&#xff0c;用 Python 写 API 可以像搭积木一样简单&#xff0c;同时还能拥有媲美 Go 语言的性能&#xff0c;这个框架凭借三大核心优势迅速风靡全球&#xff1a; 开发效率提升 3 倍&#xff1a;类型注解 自动文档&#xff0c;…...

prometheus通过Endpoints自定义grafana的dashboard模块

1、prometheus自定义的dashboard模块 文件路径/etc/prometheus/config_out/prometheus-env.yaml - job_name: serviceMonitor/monitoring/pfil/0honor_labels: falsekubernetes_sd_configs:- role: endpointsnamespaces:names:- monitoringrelabel_configs:- source_labels:- …...

机器人新革命:Pi 0.5如何让智能走进千家万户

在科技飞速发展的今天&#xff0c;机器人技术正在以一种令人惊喜的方式贴近我们的生活。最近&#xff0c;Physical Intelligence 公司推出了 Pi 0.5 版本&#xff0c;这一创新设计不仅颠覆了传统机器人的运作模式&#xff0c;更让我们看到了未来智能设备融入日常生活的无限可能…...

std::mutex底层实现原理

std::mutex是一个用于实现互斥访问的类&#xff0c;其具备两个成员函数——lock和unlock 锁的底层实现原理 锁的底层实现是基于原子操作的&#xff0c;这些原子操作是由指令支持的&#xff0c;因为单个指令是不能被中断的 一些与锁的实现有关的原子指令为&#xff1a; 待补充…...

从数据结构说起(一)

1 揭开数据结构神奇的面纱 1.1 初识数据结构 在C的标准库模板&#xff08;Standard Template Library,STL&#xff09;课程上&#xff0c;我初次结识了《数据结构》。C语言提供的标准库模板是面向对象程序设计与泛型程序设计思想相结合的典范。所谓的泛型编程就是编写不依赖于具…...

【后端】构建简洁的音频转写系统:基于火山引擎ASR实现

在当今数字化时代&#xff0c;语音识别技术已经成为许多应用不可或缺的一部分。无论是会议记录、语音助手还是内容字幕&#xff0c;将语音转化为文本的能力对提升用户体验和工作效率至关重要。本文将介绍如何构建一个简洁的音频转写系统&#xff0c;专注于文件上传、云存储以及…...

矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理

一、特殊材料矫平&#xff1a;挑战与创新解决方案 1. 高温合金&#xff08;如Inconel 718&#xff09;处理 技术难点&#xff1a; 屈服强度高达1100 MPa&#xff0c;传统矫平力不足 高温下易氧化&#xff0c;需惰性气体保护环境 解决方案&#xff1a; 采用双伺服电机驱动&a…...

云服务器 —— 公有 IP 与 私有 IP

云服务器的 公有 IP 和 私有 IP 在网络架构中扮演不同的角色&#xff0c;具体用途和区别如下&#xff1a; 目录 1. 公有 IP&#xff08;Public IP&#xff09; 作用&#xff1a; 特点&#xff1a; 示例场景&#xff1a; 2. 私有 IP&#xff08;Private IP&#xff09; 作用…...

Git基本使用(很详细)

一&#xff1a;Git 概述 1.1 定义&#xff1a;分布式版本控制系统 1.2 版本控制 &#xff08;1&#xff09;定义&#xff1a; 版本控制时一种记录文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统 &#xff08;2&#xff09;举例 多副本 优化&#xff1a; 不使用多…...

【人工智能】基于Python和Transformers库构建高效问答系统的实践与实现**

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着自然语言处理(NLP)的发展,问答系统成为了人工智能应用中的一个重要领域。近年来,预训练模型如BERT、GPT、T5等,通过大规模数据的预…...

仓颉编程语言最佳实例 “Hello, world!”

仓颉编程语言最佳实例 “Hello, world!” The Best Practice to Cangjie Programming Language - “Hello, world!” BY JACKSON 1. 仓颉集成开发工具&#xff08;IDE&#xff09;安装 打开Chrome浏览器&#xff0c;访问仓颉编程语言官网&#xff1a;https://cangjie-lang.…...

【机器学习-线性回归-3】深入浅出:简单线性回归的概念、原理与实现

在机器学习的世界里&#xff0c;线性回归是最基础也是最常用的算法之一。作为预测分析的基石&#xff0c;简单线性回归为我们理解更复杂的模型提供了完美的起点。无论你是机器学习的新手还是希望巩固基础的老手&#xff0c;理解简单线性回归都至关重要。本文将带你全面了解简单…...

[mysql]窗口函数

目录 窗口函数: 为何要学习窗口函数,与mysql5.7实现语句对比 现在我们介绍一下窗口函数: 函数规则 1序号函数 2分布函数 3前后函数 5其他函数 总结 窗口函数: 首先数据库的迁移是非常慢的,大家学习新特性的时候要考虑自己公司的数据库版本是不是和自己学习的吻合 为何…...

内存四区(栈)

今天我再次学到了有趣的知识&#xff0c;内存四区&#xff01; 内存四区分为代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区&#xff0c;今天我们详细来讲讲栈区&#xff01; 内存四区和栈区都是用来存放数据的&#xff0c;而栈区存放的数据具体有两类 1.形参数…...