写在前面:
近期,博主在工作中碰到不少奇奇怪怪的事情,几乎每天都在处理故障、分析故障的过程中,博客更新的进度也耽搁了。在分析故障事件的过程中,我们常用到wireshark这一软件,来查看连接的建立是否正常,应用的交互是否存在异常等等。
下面,博主将最近掌握到的wireshark的一些用法,进行整理分享给大家。这些用法将从一个数据包的全貌到一次TCP连接的情况,逐一使用。
前情提要:
首先,我们应该清楚,当我们拿到了一份数据包,这份数据包是如何获取的十分重要。它可能是你直接在服务器上抓取的,也可能是你通过交换机等设备做流量镜像获得的。不同的数据包的获取途径,对我们分析故障事件的具体情况所造成的影响也不同。如果是直接在交互两端抓取到的,可以用来判断该数据包是否被收到,内部处理了多久等等信息。而如果你是通过流量镜像获取的数据包,在经历了流量镜像设备的转发、去重等等操作后。我们对这份数据包的可靠性要打一个问号?也只有了解清楚了流量镜像设备到底做了什么,才能够使这份数据包更好的帮助我们分析问题。
方法介绍:
整体分析—端到端分析—对话
当我们拿到一份数据包,我们想从整体上分析这组数据包中的交互情况时,我们可以使用
统计——对话
这将帮助你在OSI 7层模型中不同的维度,分析这一组数据包整体的交互情况,包括链路层—以太网,网络层—IPv4、IPv6,传输层—TCP、UDP。
如果我们想要知道,哪两个IP地址间的交互在这一段时间流量最大,交互时间最长等,我们可以通过IPv4这一维度,分析这一数据包中的对话
交互时间最长的两个IP地址
其中,Duration表示了这两个IP地址之间的交互持续了多久,单位是秒。我们可以通过排序,将交互时间最长的一组IP选出来。
那么我们想了解他们这两个IP地址之间到底交互了什么,我们可以右键选择作为过滤器应用,进行过滤
之后,过滤的语句会自动出现在wireshark的主页面中,并进行了过滤,这里我们选择的是在这一组数据包中交互时间最长的两个IP之间的情况。但这往往不能说明什么,可能确实在应用中,两者之间就是需要经常需要数据交互的。
耗时最长的TCP连接
而我们如果在实际故障处理中,如果应用反馈存在网络延时,响应慢等情况,在应用交互为TCP短连接的情况下,我们可以通过每一次TCP连接的耗时,进行查看。
选择TCP标签,同样通过Duration进行排序,我们可以发现第一笔TCP连接耗时接近600秒,也就是10分钟,在通过TCP短连接交互的应用中,这是非常异常的。
同样通过之前的方法,将这个TCP连接过滤出来。
通过实际查看,这笔TCP连接无异常。。。
我们选择其他的一笔,进行查看
可以看到这里存在着大量的重传包,服务端始终在尝试与客户端断开连接,但客户端没有响应。导致一直等待到服务端超时。
同样的,我们可以在对话中分析:谁传递了最多的数据,谁上传的多,谁下载的多等等信息。分析方法类似,不再这里举例。
对话可以帮助我们用来分析端到端的交互情况,但针对数据包中存在的异常情况,以及故障发生前的前后情况对比,对话并不是很好用。
这里我们采用I/O图表,进行分析。
整体分析—过程对比分析—I/O图表
I/O图表可以用来分析,在事件发生前后,各项指标的变化情况。
打开后,默认设置了针对数据包的IO情况和TCP异常,这两个过滤器
我们也可以根据实际需要,利用过滤器,查看事件发生前后,相关指标的变化,如下图:
要更好的使用对话,我们需要熟悉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中,针对你感兴趣的指标,选择复制—作为过滤器,如下图:
例如,我们想针对代理设备,查看代理设备是否将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工具,分析故障前后,这写指标的变化,帮我们分析问题可能出现在哪里。这要求我们对数据包的各项字段所代表的意义要更加了解,才能帮助我们更好的分析问题。