目录
一、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. 工作过程
-
发送数据包:
-
tracert
从本地主机开始,发送一个带有 TTL 值为 1 的 UDP(或 ICMP)数据包到目标主机。 -
第一个路由器收到数据包后,将 TTL 减 1,发现 TTL 为 0,于是丢弃数据包,并向发送方发送一个 ICMP Time Exceeded 消息。
-
发送方收到这个消息后,记录下第一个路由器的 IP 地址。
-
-
递增 TTL 值:
-
接下来,
tracert
再发送一个带有 TTL 值为 2 的数据包。 -
数据包经过第一个路由器后,TTL 减 1 变为 1,继续到达第二个路由器。
-
第二个路由器将 TTL 减 1,发现 TTL 为 0,于是丢弃数据包,并向发送方发送一个 ICMP Time Exceeded 消息。
-
发送方记录下第二个路由器的 IP 地址。
-
-
重复过程:
-
tracert
逐渐增加 TTL 值,依次记录每一跳路由器的 IP 地址,直到数据包到达目标主机。 -
当数据包到达目标主机时,目标主机会返回一个 ICMP Echo Reply 消息,表示数据包已经到达目的地。
-
-
输出结果:
-
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 消息,表示知道数据包已经到达目的地。