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 | ping -c 3 -s 512 www.baidu.com #表示向www.baidu.com发送3个512B大小的数据包,来进行网络探测 |
备注:关于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 | traceroute www.baidu.com #向www.baidu.com发起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 | [root@10.10.90.97 ~]# mtr -r 202.108.33.94 |
输出解释:
第一列:显示的是IP地址和本机域名,这点和tracert很像
第二列:snt:10 设置追踪的次数,默认值是10 可以通过参数 -c来定制,例如mtr -r -c 15 202.108.33.94
第三列:Loss: 是显示的每个对应IP的丢包率
第四列:Last: 显示的最近一次的返回时延
第五列:Avg : 是平均值 这个应该是发送ping包的平均时延
第六列:Best: 是最好或者说时延最短的
第七列:Wrst: 是最差或者说时延最常的
第八列:StDev: 是标准偏差