简介
Wireshark 显示过滤器中有很多 time 相关的过滤表达式,譬如一般常看到的 frame.time
字段代表帧被捕获的绝对时间,以及一些用于分析关联数据包之间时间的字段,像是本文计划讲到的 frame.time_delta
、 frame.time_delta_displayed
,包括还有 RTT
相关、 tcp.time
、 http.time
、 dns.time
等等功能强大的字段。如果能好好掌握并运用上述时间字段的功能,对于网络数据包协议分析将会有极大的帮助。
本文简单讲解下最常用到的 frame.time_delta
和 frame.time_delta_displayed
字段。
frame.time
Absolute time when this frame was captured,帧被捕获的绝对时间。
frame.time_delta
Time delta from previous captured frame,相较于上一个捕获帧的时间增量。
frame.time_delta_displayed
Time delta from previous displayed frame,相较于上一个显示帧的时间增量。
以上时间单位均为 s 秒。
原理
一图胜千言
Time Delta 列为自选添加,字段即为
frame.time_delta_displayed
。
frame.time
可以简单认为就是 Time 列中的时间(注:只是时间显示格式的不同),实际字段显示见下
frame.time_delta
拿帧 2 为例,和帧 1 (相对于帧2,为上一个捕获帧)的时间增量值为 0.000963327 s。
frame.time_delta_displayed
如果仍拿上图的帧 2为例,和帧 1 (相对于帧2,为上一个显示帧)的时间增量值同样也为 0.000963327 s。
那么该值在什么情况下会不一样呢?就体现在 displayed 上,如果应用显示过滤器,譬如过滤源 ip 为 192.168.0.1 的情况下,显示过滤后的帧仅有帧 1 和 帧 3 ,如下图。
那么在帧 3 的数据包细节中,frame.time_delta_displayed
即和帧 1 (相对于帧3,为上一个显示帧)的值为 0.003788956 s。而 frame.time_delta
即和帧 2 (此处因过滤显示的原因隐藏,但实际存在,所以相对于帧 3,仍为上一个捕获帧)的值为 0.002825629 s。
扩展
以上为 frame.time_delta
和 frame.time_delta_displayed
字段最基本的解释,可以结合包括 is present、==、!=、>、<、>=、<=、in 等关系表达式进行各种显示过滤。
而对于排查网络缓慢问题时,对于高增量时间的判断一般会用到 >、<、>=、<=。在其中特别想提到的就是 frame.time_delta > 0.01
可成功过滤,而 frame.time_delta_displayed > 0.01
是无法正常过滤的,这是什么问题???
这也是本文的由来,重点想表达的地方。
frame.time_delta
frame.time_delta_displayed
为什么帧 3 的 frame.time_delta_displayed
值为 0.0028256296 s ,但却无法成功过滤出来。
解答
仔细查看帧 1, frame.time_delta_displayed
显示为 0,不匹配,因此被过滤掉未显示。现在是帧 2,由于帧 1 未显示,因此 frame.time_delta_displayed
也显示为 0,不匹配,因此被过滤掉未显示。然后是帧 3 … 无限套娃 。
明白了嘛?仔细体会下 disaplayed 的含义。
那么,有人问非要用 frame.time_delta_displayed > xxx
过滤行不行,嗯,也行,必须通过显示帧 1 来开始工作,例如使用显示过滤器 frame.number == 1 || frame.time_delta_displayed > xxx
。