Linux下网络排查之ping|traceroute|mtr工具

ping

ping使用了ICMP回送请求和回送应答报文。ping工具发出去的数据包没有通过tcp/udp协议,但是要经过ip协议。ping命令计算的时间是数据包的往返总时间。

ping命令每一个发出一个探测包,会指定一个连续递增的icmp_seq编号,所以在ping的结果中,每一行都会显示icmp_seq编号。当网络有丢包时,即客户端没有收到ping的响应包,那么就会导致ping的结果中icmp_seq编号不连续。

ping命令常用的选项如下:

-c num        #表示使用ping发出去num个数据包
-n            #表示ping的输出中包含主机信息的都用ip表示,不在进行ip和主机名之间的映射,那样ping的响应速度会更快
-s packetsize #指定ping发出去的数据包的大小,单位是B.  如果不配置此选项将默认为56B
-t ttl        #设定数据包在网络上传输的Time To Live(TTL)生命周期
-f            #快速ping,Flood ping,发送接收ICMP Echo报文的频率快了非常多

举例如下:

1
2
3
ping -c 3 -s 512 www.baidu.com  #表示向www.baidu.com发送3个512B大小的数据包,来进行网络探测
ping -I 10.21.70.25 10.52.10.21 #一台服务器上配置了多个IP,可以指定某一个IP作为源IP。本例源IP为10.21.70.25,向10.52.10.21发起ping探测
ping -f www.baidu.com #ping -f是快速ping,也就是非常快速地向目的端发送ICMP报文。当发出一个ICMP报文时,会在终端显示一个点,同时当收到一个ICMP报文响应时,就是在终端上删除一个点。因此使用ping -f时,终端显示的点号的数量,其实就是丢包的数量。

备注:关于ping工具,有一个线上问题案例,就是ping某个域名很慢,但是ping该域名下的IP却很快。这是因为,执行ping www.xxx.com时,即做正向解析也会做IP的反向解析,因此ping域名慢的问题往往可能是IP到域名的方向解析出了问题导致。我们在执行ping命令时,加上-n选项就不会做IP的反向解析啦,可以暂时解决这个问题。

traceroute

traceroute也是使用ICMP协议,使用了ICMP的时间超过差错差错报告报文以及ICMP终点不可达报文。对于ICMP协议,其原理为:

traceroute在探测网络时,每一个TTL轮次,缺省情况下会发送3个探测包。例如当traceroute把TTL设置为2时,它默认会发三个探测包。所以在traceroute的结果中,每一行有三个响应延迟值,分别对应三次探测。另外,每个TTL的三次探测到路由器,并不一定是同一个哦,因此在traceroute结果中每一行可能有多个ip哦。另外,当某次探测没有得到响应时,traceroute结果中就会显示星号(*).

traceroute的重要选项有:

-U   #使用UDP协议来探测,这是默认的检测协议。  
-I   #使用ICMP协议来探测  
-T   #使用TCP协议来探测  

使用举例如下:

1
2
traceroute www.baidu.com               #向www.baidu.com发起traceroute探测
traceroute -s 10.21.70.25 10.52.10.21 #一台服务器上配置了多个IP,可以指定某一个IP作为源IP。本例中指定源IP为10.21.70.25,向10.52.10.21发起traceroute探测

备注:使用traceroute返回的每行信息中有三个时间值,那是因为对于每个节点或者路由器,源端发了三次探测请求。

mtr

在Linux中有一个更好的网络连通性判断工具,它可以结合ping | nslookup | tracert 来判断网络的相关特性,这个命令就是mtr.

使用格式:

1
mtr [options] hostname

常用的选项:

-r      #将mtr设置为报告模式,追踪结果以报告模式输出。若没有-r显现,那么将进入mtr的实时交互模式
-c num  #定义追踪的次数,每次是1s,且-c必须和-r配合使用,默认的10次

使用举例:

(1)mtr的实时显示模式

1
mtr 202.108.33.94

(2)mtr的报告模式

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@10.10.90.97 ~]# mtr -r 202.108.33.94  
FOCUS9097 Snt: 10 Loss% Last Avg Best Wrst StDev
220.181.61.252 0.0% 6.8 3.3 1.8 7.4 2.2
220.181.17.217 0.0% 0.4 0.5 0.4 0.7 0.1
220.181.16.17 0.0% 0.6 0.5 0.5 0.6 0.0
202.97.53.14 10.0% 0.7 0.7 0.7 0.8 0.0
219.158.35.1 0.0% 0.8 0.8 0.8 0.9 0.0
219.158.5.81 0.0% 1.2 1.3 1.2 1.6 0.1
123.126.0.138 0.0% 1.2 1.1 1.1 1.3 0.1
61.148.153.126 0.0% 1.9 10.5 1.5 89.9 27.9
61.148.143.22 0.0% 1.5 1.6 1.5 1.7 0.0
210.74.178.198 0.0% 1.6 1.6 1.5 1.9 0.1
202.108.33.94 0.0% 1.5 1.5 1.4 1.5 0.0

输出解释:

第一列:显示的是IP地址和本机域名,这点和tracert很像
第二列:snt:10 设置追踪的次数,默认值是10 可以通过参数 -c来定制,例如mtr -r -c 15 202.108.33.94
第三列:Loss: 是显示的每个对应IP的丢包率
第四列:Last: 显示的最近一次的返回时延
第五列:Avg : 是平均值 这个应该是发送ping包的平均时延
第六列:Best: 是最好或者说时延最短的
第七列:Wrst: 是最差或者说时延最常的
第八列:StDev: 是标准偏差