Linux命令详解:ping 和 traceroute命令

作者:平解技术控
https://www.jianshu.com/p/828c0f927778

Linux命令有很多,今天跟大家介绍常用的两个命令ping 、traceroute命令,按照工具的作用,原理,用法三个维度来理解。

一、ping

1.作用

探测端到端的连通性,包往返时延。

2.原理

icmp协议,是在IP协议之上的一种协议,包括首部和数据两个部分。icmp协议头部的三个固定字段,type,code,checksum。ping使用其中type为8和0的两种类型。type8为request,type 0 为reply。首部其他字段因不同包类型有所区分。

通过抓到的包,来看下各个字段。

Linux命令详解:ping 和 traceroute命令

ping报文

request包

Linux命令详解:ping 和 traceroute命令

ping-request包

Linux命令详解:ping 和 traceroute命令

ping-reply包

可以看出,ping包头部除了三个固定字段之外,还有Identifier,Sequence。data字段为Timestamp。其中Identifier,Sequence主要是为了让request,reply能配对,比如哪个reply是回复哪个request的。看上图的request和reply包,Identifier BE LE 相同,Identifier一般是发送的进程号。Sequence number BE LE 也相同,表示发送的***,一对请求和答复包Sequence number BE LE 相同。Timestamp里面记录了传输时间戳和***。首先看request包里面的发送时间,和reply包里面的发送时间相同。

Linux命令详解:ping 和 traceroute命令

request中的timestamp字段

Linux命令详解:ping 和 traceroute命令

reply中的timestamp字段

Response  time,rtt正是 reply包里面relative时间减去request包里面的时间。

所以ping包可以连续的去给对端发request,而不用等对端回复某一个包之后再发,默认1s 发送一个request包。

3.用法

不带任何参数,默认ping 的数据包大小是 56 字节。会持续不断的ping下去。

输出参数解释:min/avg/max/stddev 前三个好理解,最后一个参数,mac下是stddev,linux下面是 mdev Mean Deviation,代表 ICMP 包的 RTT 偏离平均值的程度,可以通过这个值看出网络抖动的情况,mdev值越大说明,整个链路上的包延时越不稳定。值越小,说明越稳定。

Linux命令详解:ping 和 traceroute命令

ping不带参数结果

ping参数用法:

-l  指定发送包的大小

-c 指定发送包的次数

-i 指定发送间隔,默认是1s

-I  指定发送包的网卡 ,一般是查看路由表,哪个网卡路由匹配用哪个网卡发送。

Linux命令详解:ping 和 traceroute命令

ping参数学习

以上指定了 包大小,-M do表示不要分片,-c 4 次数,这个命令在探测链路mtu的时候会用到。

二、traceroute

1.作用

探测端到端,链路每一跳的时延。

2.原理

先看一个traceroute的访问截图和抓包截图

Linux命令详解:ping 和 traceroute命令

traceroute访问截图

源IP :192.16843,87 家里的局域网地址

Linux命令详解:ping 和 traceroute命令

traceroute抓包截图

源IP :192.16843,87 家里的局域网地址

目的IP: 61.135.169.121 百度的地址

可以看出traceroute开始的时候,源地址发包,ttl 值依次从为1,1,12,2,2,3,3,3...ttl依次增大,并且每个ttl值发三个包。在看发包源端口 44136,一直没有变,访问的目的端口从 33435依次增大。tracroute假设服务器的端口 33435没有监听,如果恰巧这个端口服务端监听了,那么traceroute就不能正常判断了。路径上的每一跳,或者返回icmp ttl超时的错误包,或者不返回,直到达到主机之后,主机会返回一个服务不可达的包,这个时候trcaeroute认为探测到了主机。

ttl为1的包发出去之后,收到了中间路由器的回包,像ttl为 2,3的包没有收到回包,控制台看的结果为 *

Linux命令详解:ping 和 traceroute命令

traceroute没有收到回包为*

看下发包的详细特征:

Linux命令详解:ping 和 traceroute命令

traceroute发包

可以看出这个包是UDP包

Linux命令详解:ping 和 traceroute命令

traceroute-ttl超时响应包

可以看出这个包是 ICMP包,type 11,code 0 ,TTL超时包。这个包的源地址为 192.168.43.138为中间路由器的发回来的包。这个包将发包的信息封装到了自己里面,可以和上一个图对比。

3.用法

常规的用法如上面,看下哪一个路径上的延时变大。除了UDP包探测之外,traceroute还可以指定使用TCP协议探测,可以使用-p指定端口

命令:traceroute -T  www.baidu.com

探测mtu大小: traceroute www.baidu.com -F 1472

Linux命令详解:ping 和 traceroute命令

trcaeroute-tcp返回结果

好文推荐:

别总写代码,这130个网站比涨工资都重要

30分钟理解决策树的基本原理

最新2020年3月份编程语言排行榜详情

Linux命令详解:ping 和 traceroute命令