写在前面:

 近期,博主在工作中碰到不少奇奇怪怪的事情,几乎每天都在处理故障、分析故障的过程中,博客更新的进度也耽搁了。在分析故障事件的过程中,我们常用到wireshark这一软件,来查看连接的建立是否正常,应用的交互是否存在异常等等。

下面,博主将最近掌握到的wireshark的一些用法,进行整理分享给大家。这些用法将从一个数据包的全貌到一次TCP连接的情况,逐一使用。


前情提要:

首先,我们应该清楚,当我们拿到了一份数据包,这份数据包是如何获取的十分重要。它可能是你直接在服务器上抓取的,也可能是你通过交换机等设备做流量镜像获得的。不同的数据包的获取途径,对我们分析故障事件的具体情况所造成的影响也不同。如果是直接在交互两端抓取到的,可以用来判断该数据包是否被收到,内部处理了多久等等信息。而如果你是通过流量镜像获取的数据包,在经历了流量镜像设备的转发、去重等等操作后。我们对这份数据包的可靠性要打一个问号?也只有了解清楚了流量镜像设备到底做了什么,才能够使这份数据包更好的帮助我们分析问题。


方法介绍:

整体分析—端到端分析—对话

当我们拿到一份数据包,我们想从整体上分析这组数据包中的交互情况时,我们可以使用

统计——对话

wireshark 两端往返时延测量 wireshark怎么看时延_重传

这将帮助你在OSI 7层模型中不同的维度,分析这一组数据包整体的交互情况,包括链路层—以太网,网络层—IPv4、IPv6,传输层—TCP、UDP。

如果我们想要知道,哪两个IP地址间的交互在这一段时间流量最大,交互时间最长等,我们可以通过IPv4这一维度,分析这一数据包中的对话

wireshark 两端往返时延测量 wireshark怎么看时延_重传_02

交互时间最长的两个IP地址

其中,Duration表示了这两个IP地址之间的交互持续了多久,单位是秒。我们可以通过排序,将交互时间最长的一组IP选出来。

那么我们想了解他们这两个IP地址之间到底交互了什么,我们可以右键选择作为过滤器应用,进行过滤

wireshark 两端往返时延测量 wireshark怎么看时延_TCP_03

之后,过滤的语句会自动出现在wireshark的主页面中,并进行了过滤,这里我们选择的是在这一组数据包中交互时间最长的两个IP之间的情况。但这往往不能说明什么,可能确实在应用中,两者之间就是需要经常需要数据交互的。

耗时最长的TCP连接

而我们如果在实际故障处理中,如果应用反馈存在网络延时,响应慢等情况,在应用交互为TCP短连接的情况下,我们可以通过每一次TCP连接的耗时,进行查看。

选择TCP标签,同样通过Duration进行排序,我们可以发现第一笔TCP连接耗时接近600秒,也就是10分钟,在通过TCP短连接交互的应用中,这是非常异常的。

wireshark 两端往返时延测量 wireshark怎么看时延_wireshark 两端往返时延测量_04

同样通过之前的方法,将这个TCP连接过滤出来。

通过实际查看,这笔TCP连接无异常。。。

我们选择其他的一笔,进行查看

wireshark 两端往返时延测量 wireshark怎么看时延_IP_05

可以看到这里存在着大量的重传包,服务端始终在尝试与客户端断开连接,但客户端没有响应。导致一直等待到服务端超时。

同样的,我们可以在对话中分析:谁传递了最多的数据,谁上传的多,谁下载的多等等信息。分析方法类似,不再这里举例。

对话可以帮助我们用来分析端到端的交互情况,但针对数据包中存在的异常情况,以及故障发生前的前后情况对比,对话并不是很好用。

这里我们采用I/O图表,进行分析。

整体分析—过程对比分析—I/O图表

I/O图表可以用来分析,在事件发生前后,各项指标的变化情况。

wireshark 两端往返时延测量 wireshark怎么看时延_IP_06

打开后,默认设置了针对数据包的IO情况和TCP异常,这两个过滤器

我们也可以根据实际需要,利用过滤器,查看事件发生前后,相关指标的变化,如下图:

wireshark 两端往返时延测量 wireshark怎么看时延_IP_07

要更好的使用对话,我们需要熟悉Wireshark的过滤语句。下面博主整理一些与TCP指标相关的过滤语句

查看新建连接情况—过滤SYN包—tcp.flags.syn == 1

查看重传情况—过滤重传包—tcp.analysis.retransmission

查看新建连接失败,或存在异常的情况—过滤SYN包且为重传包—tcp.flags.syn == 1 && tcp.analysis.retransmission

查看断开连接失败,或存在异常的情况—过滤FIN包且为重传包—tcp.flags.fin == 1 && tcp.analysis.retransmission

查看TCP连接响应情况—过滤ACK包的响应时间—tcp.analysis.ack_rtt >= 时间

查看客户端与服务端是否存在性能瓶颈—过滤TCP零窗口—tcp.analysis.zero_window

除了上面提到的以外,还有很多很多,你也可以直接在wireshark中,针对你感兴趣的指标,选择复制—作为过滤器,如下图:

wireshark 两端往返时延测量 wireshark怎么看时延_wireshark_08

例如,我们想针对代理设备,查看代理设备是否将TCP连接都进行了转发。

例如代理设备对外地址为1.1.1.1,对内地址为1.1.1.2

过滤语句可以这样写tcp.flags.sys == 1 && ip.addr == 1.1.1.1 、tcp.flags.sys == 1 && ip.addr == 1.1.1.2.对比两个曲线是否重叠

wireshark 两端往返时延测量 wireshark怎么看时延_wireshark 两端往返时延测量_09


总结:

在我们进一步掌握了wireshark的一些用法后,更重要的还是要首先了解故障现象,在此基础上我们利用我们了解的网络指标,如延时、重传等等,利用wireshark工具,分析故障前后,这写指标的变化,帮我们分析问题可能出现在哪里。这要求我们对数据包的各项字段所代表的意义要更加了解,才能帮助我们更好的分析问题。