作者:平解技术控
https://www.jianshu.com/p/828c0f
Linux命令有很多,今天跟大家介绍常用的两个命令ping 、traceroute命令,按照工具的作用,原理,用法三个维度来理解。
探测端到端的连通性,包往返时延。
icmp协议,是在IP协议之上的一种协议,包括首部和数据两个部分。icmp协议头部的三个固定字段,type,code,checksum。ping使用其中type为8和0的两种类型。type8为request,type 0 为reply。首部其他字段因不同包类型有所区分。
通过抓到的包,来看下各个字段。
ping报文
ping-request包
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包里面的发送时间相同。
request中的timestamp字段
reply中的timestamp字段
Response time,rtt正是 reply包里面relative时间减去request包里面的时间。
所以ping包可以连续的去给对端发request,而不用等对端回复某一个包之后再发,默认1s 发送一个request包。
不带任何参数,默认ping 的数据包大小是 56 字节。会持续不断的ping下去。
输出参数解释:min/avg/max/stddev 前三个好理解,最后一个参数,mac下是stddev,linux下面是 mdev Mean Deviation,代表 ICMP 包的 RTT 偏离平均值的程度,可以通过这个值看出网络抖动的情况,mdev值越大说明,整个链路上的包延时越不稳定。值越小,说明越稳定。
ping不带参数结果
ping参数用法:
-l 指定发送包的大小
-c 指定发送包的次数
-i 指定发送间隔,默认是1s
-I 指定发送包的网卡 ,一般是查看路由表,哪个网卡路由匹配用哪个网卡发送。
ping参数学习
以上指定了 包大小,-M do表示不要分片,-c 4 次数,这个命令在探测链路mtu的时候会用到。
探测端到端,链路每一跳的时延。
先看一个traceroute的访问截图和抓包截图
traceroute访问截图
源IP :192.16843,87 家里的局域网地址
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的包没有收到回包,控制台看的结果为 *
traceroute没有收到回包为*
看下发包的详细特征:
traceroute发包
可以看出这个包是UDP包
traceroute-ttl超时响应包
可以看出这个包是 ICMP包,type 11,code 0 ,TTL超时包。这个包的源地址为 192.168.43.138为中间路由器的发回来的包。这个包将发包的信息封装到了自己里面,可以和上一个图对比。
常规的用法如上面,看下哪一个路径上的延时变大。除了UDP包探测之外,traceroute还可以指定使用TCP协议探测,可以使用-p指定端口
命令:traceroute -T www.baidu.com
探测mtu大小: traceroute www.baidu.com -F 1472
trcaeroute-tcp返回结果
好文推荐:
别总写代码,这130个网站比涨工资都重要
30分钟理解决策树的基本原理
最新2020年3月份编程语言排行榜详情