traceroute+mtr
traceroute与mtr
traceroute
-
从源地址发出一个UDP探测包到目的地址,并将TTL设置为1;
-
到达路由器时,将TTL减1;
-
当TTL变为0时,包被丢弃,路由器向源地址发回一个ICMP超时通知(ICMP Time Exceeded Message),内含发送IP包的源地址,IP包的所有内容及路由器的IP地址;
-
当源地址收到该ICMP包时,显示这一跳路由信息;
-
重复1~5,并每次设置TTL加1;
-
直至目标地址收到探测数据包,并返回端口不可达通知(ICMP Port Unreachable);
-
当源地址收到ICMP Port Unreachable包时停止traceroute。
注:
1. Linux和Mac OS等系统使用UDP包进行探测,目标端口号默认为33434,每次探测目标端口号加1。Traceroute故意使用了一个大于 30000 的目标端口号,以保证目标地址收到数据包后能够返回一个“端口不可达”的 ICMP 报文,于是源地址就可将端口不可达报文当作跟踪结束的标志。
2.每个探测包都有唯一的标识号,使得Traceroute能够识别返回的包。UDP数据包使用递增的目标端口号进行标识。
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
1.命令格式:
traceroute[参数][主机]
2.命令功能:
traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。
3.命令参数:
-d 允许进行socket级别的调试(当Linux kernel支持它的时候)Enable socket level debugging (when the Linux kernel supports it)
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 将`“不要分段Don't Fragment”`位置位。这将告诉中间路由器不要将该包分段(当路由器发现该探测包对于网络中MTU来说太大的时候)
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络接口送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-T 对探测使用TCP SYN
-m 设置检测数据包的最大存活数值TTL的大小。默认30
-n 直接使用IP地址而非主机名称。
-p port 设置要使用的目标端口。要么是“默认”方法的初始udp端口值(按每个探测递增,默认值为33434),或“icmp”的初始序列(也递增,默认值为1),或某个固定目标其他方法的端口(默认为80“tcp”,53代表“udp”等)
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。源地址
-t 设置检测数据包的TOS数值。
对于IPv 4,设置服务类型(TOS)和优先级值。有用的值是16(低延迟)和8(高吞吐量)。注意,为了使用一些TOS优先级值,您必须是超级用户。对于IPv 6,设置流量控制值
-v 详细显示指令的执行过程。
-w 指定等待应答的时间,默认5s。
-q nqueries设置每个跳的探测数据包数。默认为3
-z 探测之间的最小时间间隔(默认为0)。如果值大于10,则它指定一个以毫秒为单位的数字,否则为秒数(浮点值也允许)。当某些路由器对icmp消息使用速率限制时非常有用。
-M 对traceroute操作使用指定的方法。默认的传统udp方法名为默认情况下,icmp(-I)和tcp(-T)分别有icmp和tcp名称。方法特定的选项可以通过-O传递。大多数方法都有其简单的快捷方式,(-I意思是-M icmp等)。
-O 指定一些特定于方法的选项。几个选项用逗号分隔(或在cmdline上使用多个-O)。
-U 使用UDP对特定的目标端口进行跟踪(而不是增加每个探针的端口)。默认端口为53(DNS)
-P protocol 使用指定协议的原始数据包进行跟踪路由。默认协议是253(rfc3692)。
例1:traceroute 用法简单、最常用的用法
命令:
traceroute www.baidu.com
输出
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
1 bogon (192.168.0.1) 11.205 ms 11.283 ms 15.513 ms
2 bogon (10.18.0.1) 18.147 ms 18.089 ms 18.013 ms
3 bogon (172.17.4.53) 18.811 ms 18.737 ms 18.667 ms
4 bogon (172.17.2.74) 17.919 ms 17.877 ms 17.813 ms
5 bogon (172.17.3.73) 18.413 ms 18.358 ms 18.300 ms
6 1.193.202.1.static.bjtelecom.net (1.202.193.1) 42.078 ms 23.129 ms 6.226 ms
7 * * *
8 36.110.244.46 (36.110.244.46) 12.896 ms 18.089 ms 19.891 ms
9 36.110.244.94 (36.110.244.94) 21.361 ms 36.110.244.90 (36.110.244.90) 20.628 ms *
10 220.181.182.30 (220.181.182.30) 19.863 ms 220.181.182.170 (220.181.182.170) 19.821 ms 220.181.182.178 (220.181.182.178) 19.759 ms
11 * * *
12 * * *
30 * * *
说明:
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;
Traceroute每跳默认发送3个探测包(发包的数量可通过-q进行设置),探测包的返回会受到网络情况的影响。如果防火墙封掉了ICMP的返回信息,那么相应的延时位置会以*显示。如果某台网关阻塞或者某台DNS出现问题,那么相应行的延时会变长。可以加-n 参数来避免DNS解析,以IP格式输出数据。
traceroute 主要利用 IP 数据包的 TTL 字段值 + ICMP 来实现,它发送的用于探测网络路径的数据包的 IP 之上的协议可以是 UDP、TCP或ICMP。
不同模式下,探测过程中设计的数据包如下:
UDP 模式
UDP 探测数据包(目标端口大于 30000) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 ICMP Destination Unreachable 数据包
TCP 模式
TCP [SYN] 探测数据包(目标端口为 Web 服务的 80) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 TCP [SYN ACK] 数据包
ICMP 模式
ICMP Echo (ping) Request 探测数据包 + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 ICMP Echo (ping) reply 数据包
MTR
运行Mtr指定一个IP地址,Mtr会查看运行Mtr的主机和指定目标主机之间的网络节点。在确定目标主机和本地主机间每个网络节点的IP地址后,它向每个网络节点发送一个ICMP ECHO请求,以确定到每个节点的链路的质量。就像这样它会打印到每个节点的运行统计信息。通过这个工具我们可以大概定位到网络出问题的节点,再来具体分析。
查看mtr的参数
mtr -h 提供帮助命令
mtr -v 显示mtr的版本信息
mtr -r 已报告模式显示
mtr -w 选项标志使用主机名
mtr -c 设置每秒发送数据包的数量
mtr -s 用来指定ping数据包的大小
mtr -n no-dns不对IP地址做域名解析
mtr -a 来设置发送数据包的IP地址 这个对一个主机由多个IP地址是有用的
mtr -i 使用这个参数来设置ICMP返回之间的要求默认是1秒。因此将其设置为十分之几秒(0.1,0.2等)通常很有帮助。
mtr -u 使用UDP数据报而不是ICMP ECHO。
mtr -4 IPv4
mtr -6 IPv6
例1
mtr -r -c 30 -s 1024 -n www.baidu.com
[root@master ~]# mtr -r -c 30 -s 1024 -n www.baidu.com
HOST: master Loss% Snt Last Avg Best Wrst StDev
1. 192.168.0.1 3.3% 30 5.1 10.2 1.8 33.8 7.8
2. 10.18.0.1 0.0% 30 7.0 10.7 3.3 40.7 9.5
3. 172.17.4.53 0.0% 30 5.4 10.4 3.6 32.0 7.8
4. ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
5. 172.17.3.73 3.3% 30 10.4 11.9 4.3 25.5 6.5
6. 1.202.193.1 0.0% 30 19.8 20.3 4.5 106.8 24.3
7. ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
8. 36.110.244.46 93.3% 30 9.0 17.4 9.0 25.8 11.8
9. 36.110.246.242 33.3% 30 32.0 16.2 7.0 55.5 11.0
10. 220.181.17.18 0.0% 30 5.9 17.0 5.9 49.2 11.2
11. ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
12. ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
13. ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
14. ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
15. 220.181.38.150 0.0% 24 22.9 14.2 7.7 26.4 5.5
报告说明:
第一列:显示的是IP地址和本机域名
第二列:是显示的到每个对应节点IP的丢包率
第三列:snt:30 设置每秒发送数据包的数量,默认值是10 可以通过参数 -c来指定。
第四列:显示到对应节点最后一次值的返回时延(毫秒)
第五列:发送的数据包到对应节点返回的平均(average)时延(毫秒)
第六列:发送的数据包到对应节点返回的最好或者说时延最短的(毫秒)
第七列:发送的数据包到对应节点返回的最差或者说时延最常的(毫秒)
第八列:每个节点时延的标准偏差(standard deviation )(毫秒)
#注:
在大多数情况下,average(Avg)列是关注的焦点。
最后一列StDev提供了每个主机的延迟标准偏差。标准差越大,延迟测量之间的差异越大。标准偏差允许您评估所提供的平均值(平均值)是否代表数据集的真实中心,或者是否因某种现象或测量误差而偏斜。如果标准偏差很高,请查看最佳和最差延迟测量,以确保平均值是实际延迟的良好表示,而不是太大波动的结果。
1、为什么提示有???
问号:是因为该节点防火墙封掉了ICMP的返回信息,所以我们得不到相关的数据包返回数据。
2、为什么中间某些节点有丢包而后面节点有没有丢包了:
对于MTR报告我们主要关注丢包率和延时。如果在Loss% 列有丢包,说明这一跳可能有问题。但是,ISP会人为的限制ICMP的速率,这也会导致丢包现象。
3、如何排除是限速干扰了?
我们只需要观察丢包的下一跳或者后面几跳是否有丢包率为0的情况,如果有,则说明是设备本身的干扰。
判定理由:如果中间路由某跳确实丢包,那么后续节点肯定收不到预定的数据包数量了。对于MTR测试结果,一般首先看最后一跳,如果最后一跳有丢包,那么这个分析才是有意义的。
例2
mtr -r -n www.google.com
[root@master ~]# mtr -r -n www.google.com
HOST: master Loss% Snt Last Avg Best Wrst StDev
1. 192.168.0.1 0.0% 10 6.5 5.8 1.4 12.5 3.9
2. 10.18.0.1 0.0% 10 3.6 6.3 2.6 12.2 3.8
3. 172.17.4.53 0.0% 10 3.3 9.0 2.9 27.5 9.5
4. 172.17.2.74 0.0% 10 11.9 7.4 2.8 14.5 4.2
5. 172.17.3.73 0.0% 10 8.1 11.1 4.4 34.8 8.8
6. 1.202.193.1 0.0% 10 9.8 24.5 6.8 84.9 25.3
7. 106.120.235.13 60.0% 10 6.4 20.5 6.4 54.1 22.7
8. 219.141.135.174 0.0% 10 8.4 13.4 5.1 48.5 12.7
9. ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
流量确实到达目标主机。但是,MTR报告显示丢失,因为目标主机未发送回复。这可能是由于未正确配置的网络或防火墙(iptables)规则导致主机丢弃ICMP数据包的结果。