日常网络中常用的监控大多是基于ICMP协议开发的,今天打算梳理一下已知的各种监控工具(手段),看看他们之间有什么区别和关联。配合Wireshark完成了一些对协议上的理解。本博客中提到的用源地址是172.31.0.7(我云主机中的内网ip)目的地址是202.101.33.1没有什么特殊的意义,随便敲了一个可用的地址,就目前狼多肉少的年代,随意敲一个ip出来可能都是在用的。
注:以下截图和参数均在CentOS 6.5中呈现的,其他系统和版本可能不相同。
ICMP协议
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它本身不会像TCP、UDP那样作为信息载体的传输协议,但是它可以承载一些数据交互性的数据,针对网络情况作出判断和结果输出。按照官方语言解释就是:错误侦测与回报机制。
简单的说一下ICMP的类型:
ICMP类型介绍――描述
类型0 Echo Reply――回显应答(Ping应答)
类型3 Network Unreachable――网络不可达
类型11 TTL equals 0 during transit――传输期间生存时间为0
好了,我们带入应用慢慢理解其中的意思吧。我们在排查网络故障中常用的基于ICMP的工具有ping、traceroute、MTR、fping,用的最多的应该就是ping了吧?话不多说,就从ping开始入手吧。
ping
使用
ping的使用很简单,无论在Windows、linux、mac系统中都是可以直接拿来用的,最原始的使用格式就是ping后面加上目的ip即可,默认是用设备的接口地址作为源地址进行ping操作,也可以通过增加参数来更改默认值。
-c count
增加-c参数可以指定ping的次数,比如计算50次中的丢包率,延迟就需要写入-c 50即可。
-i interval
这里明确说一下这是小写的i不要记混,ping默认的间隔是1秒发送一次ping包,可以通过-i修改间隔时间,间隔时间最短目前只支持到0.2s。
-s packetsize
修改ping包的大小,默认值为56字节,可以测试大包修改相应的数值。
-t ttl
通过-t可以修改ttl值(生命周期),这里多说一点,现实网络中传输是要经过运营商的,也就是常见的电信、联通、移动等ISP服务提供商,所以两个设备之间必定有多设备进行转发,才可以把数据包传到目的设备上,当数据包经过一次转发设备ttl值就会递减1个值,所以默认ping的话只要对端设备不进行icmp策略限制,只要对端不是宕机状态,理论上ping是完全可以把包送过去的,国内最远的距离也不过30跳,当然如果中间路由有环路发生,ttl值就会递减到0从而丢弃报文。
利用这一点,就可以通过ttl值来检测网络中的跳数,比如我在筛选IDC网络质量时会设定一个目的地址,多个IDC机房同时ping向同一个目的ip,把ttl值固定在10,凡是没有ping通的就说明已经超过了10跳,没有通的IDC就会被筛选在外了。
-I interface or address
这里的i就是大i(I)了,所代表的意思是指定接口/ip地址为源进行ping操作,默认是通过自己的接口ip作为源的,或者是设备上的默认路由接口,所以使用该参数就可以更换想要的源地址进行ping操作。
抓包
ping延时字段
Traceroute
使用
在使用上直接输入traceroute后面跟上目的ip地址就可以正常使用。如需要更改默认配置可参考以下参数。
-i device
Specifies the interface through which traceroute should send packets. By default, the interface is selected according to the routing table.
默认情况下调用默认接口、默认路由ip为源向目的ip进行探测,通过-i参数可以修改默认源接口或源ip地址。
-m
max_ttl Specifies the maximum number of hops (max time-to-live value) traceroute will probe. The default is 30.
默认ttl值为30,也就是说默认可以探测出30跳设备ip信息,在国内30跳完全够用,除非有环路发生。如果为了排除某些超过额定跳数的节点可以通过-m来设定。
-w waittime
Set the time (in seconds) to wait for a response to a probe (default 5.0 sec)
每次探测等待回应的时间默认为5秒,如果某个节点有icmp回应限制,不进行icmp回应,那么traceroute进程需要等上5秒后才会发出下一次探测请求,通过-w可以修改等待时间。
-q nqueries
Sets the number of probe packets per hop. The default is 3.
每一个中间节点设备的探测次数默认为3次,如果某一跳的负载设备有5个或者更多,那么默认探测可能就无法全面的反馈出转发节点信息,可以通过-q参数修改每一跳的发包数量。
-n
Do not try to map IP addresses to host names when displaying them.
默认情况下traceroute在探测时会解析主机名,如果我们不需要知道主机名只需要ip信息的话加上-n即可。
-f first_ttl
Specifies with what TTL to start. Defaults to 1.
首次探测ttl为1,这是为了全面的反馈出中间路径的所有设备信息,但是如果前几个设备都是内网设备,探测内网对于监控来说是没有必要的,所以我们可以通过-f参数修改初始ttl值来忽略前几跳的内网设备。
抓包
探测失败的原因
MTR
抓包
MTR的作用和traceroute很相似,大致上都是逐跳的回显出每跳设备的ip信息。
第六跳出现了
MTR与traceroute对比
既然提到两种探测机制比较相近但是又不完全一样,理所应该做个对比。
- 首先看到的是MTR全程使用的ICMP协议,traceroute间接使用UDP探测,ICMP回显。
- 通过应用界面的输出结果MTR为实时探测,traceroute相对来说数据更新较为后置,如果需要更新数据,需要手动多次探测。
- MTR输出信息全面,丢包、最大延迟、平均延迟、最小延迟都可以展现出来,traceroute只能展现出ip信息和延迟丢包信息。
- MTR的多次探测是轮询完一次之后继续下一轮的探测,而traceroute可逐条发送多个探测报文进行探测,多次探测后再继续探测下一个转发节点。
- 它们同样利用TTL递增来探测逐跳设备信息。
fping
fping就像是扇形的ping检测,由一个源地址为节点出发,分散性的ping向目标ip段,让测试变得更加高效。
使用
-g
-q
安静模式,所谓安静就是中途不输出错误信息,直接在结果中显示,输出结构整齐、高效。
-C
这里的“c”是大“C”,输入每个ip探测的次数。
-i
通过-i参数可以修改发包间隔,默认为25毫秒一个探测报文。
抓包
fping与ping的对比
同样的,既然两者在探测方法上很相似,那就做个对比吧。
1. 它们使用的协议相同都是ICMP。
2. 探测机制和默认回显相同都是延迟、丢包状态。
3. fping可同时探测多个ip,ping只能手工输出不通ip段。
4. fping的数据包大小为56字节,ping的数据包字节为48(ping全部默认字节为56)。
5. fping默认ping间距为25毫秒,ping默认为1秒。
总结
分析也分析了,对比也对比了,简单的总结一下吧。
1. 单独进行网络连通性测试使用ping即可。
2. 范围性的检测连通性,比如检测一个办公室内,哪些ip正在使用,可以使用fping。
3. 在网络排查中单独ping很难把所有中间转发链路和转发接口全部压上的,所以使用fping,利用五元组(源目ip、源目mac、端口号)中的不同的目的ip、目的mac可以尽可能的压上所有链路,进行网络探测工作。
4. fping还可以用于网络监控、监控设备存活、批量输出延迟信息使用。
5. traceroute可直接探测源目ip地址中间,转发设备的ip信息和连通性。
6. MTR可以实时监测每时每刻的转发信息。
7. 相比traceroute的信息输出,MTR有着更全面输出结果。
8. MTR的整齐输出格式可用于日常监控使用,可以结合ping或者fping进行连通性探测,当出现某个目的ip不通时激活MTR进程,进行逐条探测,然后以文本形式输出(-r参数),可作为历史故障分析使用。
日常网络工作中会遇到千奇百怪的故障类型,只会一种探测手段肯定无法全面的分析故障,多掌握一种工具,就多了一把利器,多了一条解决问题的路。
愿我们的运维之路越走越宽,越走越顺!