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

目录

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

1、ICMP回显请求

2、ICMP回显应答

二、ARP高速缓存

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

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

[2、RR 选项的 IP 头部格式](#2、RR 选项的 IP 头部格式)

[2.1、RR 请求](#2.1、RR 请求)

2.2、RR响应

[四、ping 的去返路径](#四、ping 的去返路径)

[五、tracert 原理](#五、tracert 原理)

[1、TTL 字段](#1、TTL 字段)

[2. 工作过程](#2. 工作过程)

[六、tracert 测试](#六、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 消息,表示知道数据包已经到达目的地。

相关推荐
kaisun6415 分钟前
Docker 构建网络问题排查
网络·docker·eureka
雪度娃娃38 分钟前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
YUANQIANG20241 小时前
通信领域进行蒙特卡洛仿真的思路和步骤
网络
eam0511231 小时前
OSPF综合实验
网络
QQ15401828561 小时前
USB转千兆以太网芯片方案
网络·pt153s·千兆以太网芯片·usb转以太网·千兆网口芯片
曦夜日长2 小时前
Linux系统篇,进程概念(一):计算机体系、操作系统的认识、程序的加载过程
linux·运维·网络
似水এ᭄往昔2 小时前
【Linux网络编程】--Socket编程预备
linux·服务器·网络
笨蛋不要掉眼泪2 小时前
Java并发编程 :深入剖析LinkedBlockingQueue
java·开发语言·网络·并发
杨浦老苏2 小时前
网络连接实时可视化利器TapMap
网络·docker·可视化·监控·群晖
林熙蕾LXL2 小时前
socket编程-TCP开发常用函数
网络协议·tcp/ip·php