Traceroute 背景和作用
最开始时在Ip 数据报文中有一个选项字段(IP记录路由选项),用于记录数据包在网络中的路由路径,当网络包在网络中每经过一台路由器,路由器会将自己的IP地址添加到数据包的选项字段中。这样,当数据包到达目的地时,就可以提取出整个路由路径。但是因为并不是所有路由器都支持记录路由选项,因此在一些路径中并不能使用;
还有一个最重要的原因是IP首部中留给选项空间有限,不能存放太多的路径,对于现在的网络来说,是远远不够的;
基于此,实现了Traceroute 程序。在日常实际工作中,主要用于测试数据包到达网络主机所经过的路径和每一跳的延迟,帮助排查网络故障和优化网络性能;
基本使用
- 例如: traceroute www.baidu.com
- www.baidu.com 经DNS 解析后,访问 110.242.68.4,网络中一个IP数据包一共最大64 跳,如果超过64 跳还没到达目的主机,则进行丢弃,避免在网络中无休无止的进行包转发,产生死循环现象;一个包的大小为52 byte,由 20 byte IP 首部+ 8 byte UDP 首部+24 byte UDP 数据组成;
localhost:~ xiaolin.zhang$ traceroute www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 110.242.68.4
traceroute to www.a.shifen.com (110.242.68.4), 64 hops max, 52 byte packets
- 后面行的第一列代表当前 TTL,接下来是中间路由器或主机的IP 地址,针对每个TTL,会发送三份udp 数据包, 每接收一份ICMP 报文,计算往返时间;
1 192.168.1.1 (192.168.1.1) 7.320 ms 1.792 ms 1.944 ms
2 10.70.0.1 (10.70.0.1) 4.953 ms * *
3 125.34.174.17 (125.34.174.17) 15.450 ms
125.34.172.137 (125.34.172.137) 10.051 ms
221.223.116.217 (221.223.116.217) 5.685 ms
4 * 125.33.186.237 (125.33.186.237) 7.111 ms *
5 219.158.118.50 (219.158.118.50) 11.111 ms * 44.058 ms
6 110.242.66.162 (110.242.66.162) 12.751 ms
110.242.66.190 (110.242.66.190) 11.558 ms
110.242.66.170 (110.242.66.170) 13.702 ms
7 221.194.45.134 (221.194.45.134) 24.503 ms
221.194.45.130 (221.194.45.130) 20.673 ms
221.194.45.134 (221.194.45.134) 29.088 ms
8 * * *
省略号...
64 * * *
以TTL=1 来抓包观察,客户端发送了3份UDP 数据包,目的端口不断进行递增(客户端发送的第一个UDP报文目的端口为33435,第二个报文目的端口为33436,第三个报文目的端口为33437,后面的TTL跳数目的端口逐步加1),第一个网关192.168.1.1收到数据包后,分别向客户端192.168.1.3 发送3份ICMP 超时数据包;
截屏2023-11-05 下午6.48.28.png3.从第8跳开始出现很多*, 标识ICMP 响应报文可能超时,或者可能因为有些中间节点不能支持对UDP 协议的响应或者不支持返回ICMP 差错报文,通过traceroute -I www.baidu.com 使用ICMP 协议(echo request ,echo reply)进行响应;
截屏2023-11-05 下午7.12.22.png- Traceroute 其他用法
traceroute [-dFlnrvx][-f<存活数值>][-g<网关>...][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]
-d 使用Socket层级的排错功能。
-f<存活数值> 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g<网关> 设置来源路由网关,最多可设置8个。
-i<网络界面> 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m<存活数值> 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p<通信端口> 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s<来源地址> 设置本地主机送出数据包的IP地址。
-t<服务类型> 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w<超时秒数> 设置等待远端主机回包的时间。
-x 开启或关闭数据包的正确性检验。
Traceroute 工作过程
截屏2023-11-05 下午7.16.11.png- 主机A发送一份TTL 字段为1 的IP 数据包给目的主机,处理数据包的路由器1将TTL值减1,并丢弃该数据包,并发送回一份ICMP超时的报文,此时客户端就获取到了第一个路由器1的IP地址;
2.主机A发送TTL字段为2的IP数据包给目的主机,经过路由器1,路由器2后,TTL 值为0,于是将数据包丢弃,并返回ICMP超时的报文,此时客户端就获取到了第二个路由器2的IP地址;
3.主机A发送TTL字段为3的IP数据包给目的地址,经过路由器1,路由器2,到达主机Server,那么在Traceroute程序中应该如何判断到达目的主机呢?Traceroute使用一个不可能的值作为UDP 端口(大于30000),目的主机的所有应用程序都不会使用该端口,当数据包到达目的Server 时,IP 层发现是给自己的报文,并返回一个ICMP 端口不可达的报文给主机A;
4.主机A接收到该ICMP端口不可达报文后,就知道已经到达目的主机了,后面不用在继续探测了,于是结束程序;
MTU 发现机制
- 如果在发送IP数据包过程中,设置了不允许分片标记,那么在遇到接口的MTU值< 当前发送的IP数据包长度时,接口将不能对报文进行转发,此时,会返回一个ICMP 不可达差错,需要进行分片的报文,那么,我们就需要知道链路中最小的MTU是多少?
- Traceroute程序在进行MTU探测时,在发送第一个分组时使用接口MTU值1500,在遇到ICMP 不能分片差错报文后,需要使用ICMP 差错报文的MTU值进行发送; 如下图,R1 IP层接收到UDP层传递下来的数据包为1500 字节,开始使用1500 字节的MTU进行发送,当R2接口2 收到报文后,并且接口3 不允许进行分片,R2 在返回的差错报文中标记接口3的MTU1200,R1 收到后,使用MTU为1200 字节的分组发送报文,这样在通过R2 接口3 转发后继续后面的路由器MTU值的探测,经过这个过程,我们就可以确定链路中最小的MTU值;
网友评论