浅谈ICMP/ping、traceroute、MTR、fping

日常网络中常用的监控大多是基于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-抓包截图

– 通过抓包来看ping所使用的协议类型为ICMP。

– 报文内容上有源ip地址和目的ip地址。

– ping的工作原理是一问一答的形式,request作为发起端的“问”,reply作为回复端的“答”。

– request和reply的ttl值也不相同,一个是64一个是241。

– “time字段”展示就是发送时间和回应时间,通过计算可以得出ping的延时。

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值来忽略前几跳的内网设备。

traceroute-f-参数对比

抓包

traceroute-UDPICMP

– 与ping很相似,都有源地址和目的地址。

– traceroute的报文形式比较特殊,并不是全部使用icmp协议,从抓包上看同时使用了udp协议。

– 左图是在linux系统中回显的结果,右图是通过抓包工具展示的情况,对比分析。

– 图中黑底色的条目是异常报文,作为报错显示出来。

– 通过抓包查看,探测是使用udp进行逐条探测,然后“不知道什么原因”探测就失败了,失败之后通过icmp返回数据。

– traceroute默认测试的时候出现了大量的dns报文,也就是说默认是添加了解析的可以通过-n参数取消dns解析,不查看ip的主机名。

探测失败的原因

tracert-ttl递增

– 依次打开了几个抓包窗口,细心的朋友应该会发现在标题栏显示出来的分组号并不是连续的,那是因为traceroute探测时默认发出3个探测报文,所以分组号也是相隔3个。

– 根据抓包中红色指针的位置看,ttl值是逐渐递增的,也就是说每发出3次报文后,ttl递增1个。

– 由此看出,traceroute在探测到目的ip地址时候,第一次探测ttl为1,然后就失败了(上文ping中说到ttl为0报文就被丢弃),失败的时候通过icmp返回了一个ip,这个ip就回显在我们的探测界面上了。然后进行第二次探测ttl值该为2时,同样也会失败,然后返回值,周而复始直到最终到达目的ip地址上。

– icmp返回的信息会携带着被谁丢弃的报文,然后把它的ip带回来并显示出来,这样也就是我们在使用时看到的显示出逐跳的ip地址。

– 通过修改参数-q可以修改每跳发送的数据包,默认值为3个,在网络环境中转发设备或者转发接口会有很多,通过修改-q参数可以提升每次探测的数量从而可以被更多的同跳其他设备进行包转发,返回的值(转发设备ip、转发延迟、转发丢包等信息)可作为排障的参考。

MTR

抓包

MTR的作用和traceroute很相似,大致上都是逐跳的回显出每跳设备的ip信息。

mtr-crt与抓包对比

– 不难看出它的探测机制也是TTL逐条递增来探测的,同样是根据TTL为0时返回失败的信息。

– 从左边回显出来数据来看,MTR是实时的,设置好发包频率就可以快速的回显数据。

– 右边抓包数据来看粉底色的数据为正常的数据包传输,黑底色为错误信息包的回显输出。

– 仔细对比两边的数据发现第六跳和其他跳数返回值不太一样,按理说也应该在右边抓包图中出现黑底色的数据,但是该出中却没有出现。

第六跳出现了

mtr-第6跳出现了

– 我上面的截图中,左右两边的时间是不一样,左边是已经发第8个包了,右边为一开始的输出结果。

– 一开始的时候左边第六跳确实没有回显出来,但是多次探测后第六跳出现,也就是图中显示的丢包百分比。

– 然后抓包数据在后来的几次发包中才有了数据呈现。

MTR与traceroute对比

既然提到两种探测机制比较相近但是又不完全一样,理所应该做个对比。

mtr与traceroute对比

  1. 首先看到的是MTR全程使用的ICMP协议,traceroute间接使用UDP探测,ICMP回显。
  2. 通过应用界面的输出结果MTR为实时探测,traceroute相对来说数据更新较为后置,如果需要更新数据,需要手动多次探测。
  3. MTR输出信息全面,丢包、最大延迟、平均延迟、最小延迟都可以展现出来,traceroute只能展现出ip信息和延迟丢包信息。
  4. MTR的多次探测是轮询完一次之后继续下一轮的探测,而traceroute可逐条发送多个探测报文进行探测,多次探测后再继续探测下一个转发节点。
  5. 它们同样利用TTL递增来探测逐跳设备信息。

fping

fping就像是扇形的ping检测,由一个源地址为节点出发,分散性的ping向目标ip段,让测试变得更加高效。

使用

-g

ip区间表示需要增加-g参数,可以用fping -g 192.168.1.0/24这样的形式展示也可以用fping -g 192.168.1.1 – 192.168.1.254这样区间展现的形式。

-q

安静模式,所谓安静就是中途不输出错误信息,直接在结果中显示,输出结构整齐、高效。

-C

这里的“c”是大“C”,输入每个ip探测的次数。

-i

通过-i参数可以修改发包间隔,默认为25毫秒一个探测报文。

抓包

fping-crt和抓包左右对照

– 通过截图中的信息可以看出,fping全程使用ICMP协议,犹如使用了多次ping工具。

– 理解我说的扇形ping。

– 遇到不通的地址返回“- – – – -”表示失败。

– 多次返回ping的延迟数据。

– 左侧红框内的ip和右侧红框内的ip对应,依次遍历所有/27内的所有ip信息。

fping与ping的对比

同样的,既然两者在探测方法上很相似,那就做个对比吧。

fping与ping中的date数据不同

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参数),可作为历史故障分析使用。

日常网络工作中会遇到千奇百怪的故障类型,只会一种探测手段肯定无法全面的分析故障,多掌握一种工具,就多了一把利器,多了一条解决问题的路。

愿我们的运维之路越走越宽,越走越顺!

猜你喜欢

转载自blog.csdn.net/yangyangblog/article/details/80554113