概述

假设一个场景:浏览器访问网站有时较慢,通过后台日志查看服务正常,为了定位哪些服务较慢,我们可以借助wireshark抓包来分析哪些点是性能瓶颈。

本文涉及概念:

· 捕获过滤器、显示过滤器

· 着色规则

· 过滤单一HTTP会话

捕获文件

若想定位问题需要首先捕获有问题的包,假若本机地址为192.168.16.86,远程服务器端口80,打开wireshark设置捕获过滤器如下,进行开始捕获,然后访问http服务,访问结束后停止捕获。





过滤单一http会话

在捕获的包中往往还有其它一些数据包,这时我们需要过滤出我们访问服务的那个单独会话,方法有两种:

(1) 会话过滤

在我们确认的一个包上右键单击,在弹出的快捷中选择Conversation Filter|TCP



此时就会在显示过滤器中自动填写过滤表达式过滤出单一会话



上述方法与菜单Statistics|Conversations打开的会话统计对话框中右击某会话选择Apply as Filter|Selected|AB一样,也会在显示过滤器中自动填写过滤表达式过滤出会话。



(2) 追踪流

同样是在确认的一个包上右击,在弹出的快捷中选择Flow|TCP Stream



此时就会在显示过滤器中自动填写过滤表达式过滤出单一流。这次的显示过滤器为tcp.stream eq 2,说明是整个捕获文件中多个tcp流中的第3个(索引从0开始),这个编号是wireshark编的顺序。另外还会弹出整个流会话内容,若想查询会话内容,请使用此方法。



与第一种方式一样,还有一种操作方式与此方式一样,就是在特定包的packet detail面板中,找到TCP分析结果中的Stream index,然后右击选择Apply as Filter|Select,可以达到一样的效果(注意不会弹出流会话对话框)。



找到较长时间的包

过滤出了我们想要的会话,下面就要找出较长时间的包了,在TCP分析结果右右击,确保选中了协议首选项中的Calculate conversation timestamp。



由于勾选了计算会话时间,所以每个TCP分析结果下都会有一个Timestamps,此选项中有2个内容,一个是当前数据包相对于当前会话第1个包所经过的时间,一个是当前数据包相对于当前会话中前一个数据包所经过的时间,我们计算延迟的话使用第2个,在第2个上右击Apply as Column,这样这列的数值就会作为Packet List面板中的一列,因为列标题太长,我们可以右击列标题对列进行编辑,改变下列标题的名称为TCP delta。




通过新增的TCP delta列我们可以清楚的看到此会话中每一个包与上一个包所间隔的时间。仅靠人工排查间隔时间很容易漏掉某些包,特别是有许多包时间间隔较近时,这时我们可以使用wireshark的着色,即对符合某一条件的数据包显示特定的颜色,假设我们想对上述过滤出来的会话包间隔大于30秒的话以蓝色背景白色字体显示出来,这样我们就可以一眼看出哪个包间隔时间较长。

通过View|Coloring Rules打开着色规则对话框,新加一条规则,指定规则过滤条件及前景色和背景色。这个过滤条件哪来的?怎么写?还记得前面timestamp选项么,当我们点击timestamp下的Time Since previous frame in this TCP stream时,在任务栏就会显示此过滤项。这也是之前教程中分析各种协议各个字段域名的由来。



新增好后再次看Packet List面板,间隔大于30s的数据包已经标记为了蓝底白字了。这时就可以根据此包交互内容判定服务是否有问题了。



注:以上内容只是解决问题的一个参考思路,并非实际生产分析数据及过程。