前言
众所周知,Wireshark 中有很多关于 Time 的字段,譬如 Frame 中的 frame.time、frame.time_delta、frame.time_delta_displayed ,TCP 中的 tcp.time_delta、tcp.time_relative ,HTTP 中的 http.time,DNS 中的 dns.time ,以及包括 TCP IRTT、TCP RTT 等等,以上种种字段在众多网络数据包分析场景下都能起到很好的辅助作用。
本文简要概括下这些不同的 Time 字段功能和使用场景。
Frame
frame.time
frame.time
字段(Absolute time when this frame was captured)表示捕获该数据包的时间戳。它显示了数据包在网络中被抓取到的精确时间,包括日期、小时、分钟、秒、毫秒、微秒甚至纳秒数(依赖于捕获文件实际可用的时间戳精度)。
frame.time
字段很重要,因为它可以告诉我们数据包捕获的确切时间,帮助进行网络故障排除和分析,特别是当需要比较数据包之间的时间间隔时,frame.time
非常有用。
Packet List 中的 Time 格式,可在 View - Time Display Format 中更改,包括各类时间格式和时间精度。
frame.time_delta
frame.time_delta
字段(Time delta from previous captured frame)表示该数据包相对于前一个数据包捕获时间的差值。换句话说,它表示该数据包及前一个数据包之间的时间间隔。
frame.time_delta
字段对于分析网络通信中的延迟、丢包以及数据包到达顺序等方面非常有用。如果在某个时间段内出现了大量的数据包延迟或者出现丢包,那么这意味着网络可能存在阻塞或者其他故障。
frame.time_delta_displayed
frame.time_delta_displayed
字段(Time delta from previous displayed frame)与 frame.time_delta
字段的含义类似,也是表示当前数据包和前一个数据包之间的时间间隔。但两者有一个重要区别:frame.time_delta_displayed
字段只计算显示到界面的每个数据包之间的时间间隔,也就是说,如果 Wireshark 应用了显示过滤而没有显示某些数据包,那么这些数据包相对于前后数据包的时间差值将不会计算在内。
因为在网络数据包分析中,更多的情况会应用各种显示过滤,所以 frame.time_delta_displayed
字段相对于 frame.time_delta
字段会更有用,可以提供更准确的时间间隔。
在之前的文章 《frame.time_delta 和 frame.time_delta_displayed》中也有相关介绍,感兴趣的可以再看看。
frame.time_relative
frame.time_relative
字段(Time relative to time reference or first frame)是指当前数据包的捕获时间和首个数据包的捕获时间的时间差。frame.time_relative
可以在时间轴上用来更好地理解数据包的相对时间,可以快速判断在不同数据包之间的时间间隔。
该字段通常配合 Time Reference
功能一起使用,通过 Time Reference
功能可设置任意数据包作为参考时间值。譬如想知道 TCP 四次挥手的第三次 FIN 与第一次 FIN 之间的时间间隔,就可以将 Frame 6 设置成参考,也就是对后面的数据包来说,Frame 6 即为第一个数据帧,那么 Frame 8 中的 frame.time_relative
字段值即为 Frame 8 与 Frame 6 的时间间隔。
Time Reference,可设置多个数据帧作为不同的参考,也可随时取消设置。
TCP
tcp.time_delta
tcp.time_delta
字段(Time delta from previous frame in this TCP stream)表示当前 TCP 数据包和同一条 TCP 流中前一个 TCP 数据包之间的时间差。如字面意思,这个字段只能在 TCP 协议中使用,并且只记录同一条 TCP 流的数据包,即源和目的 IP 、端口相同,协议为 TCP 的数据包。
tcp.time_delta
可以用来检测 TCP 连接延迟、流量控制、拥塞控制情况等。例如,如果某些数据包之间的时间差值非常大,那么可能表明数据传输过程中存在阻塞或者其他性能问题,如下显示过滤大于等于 180ms 间隔的 TCP 数据包。
c
tcp.time_delta >= 0.180
tcp.time_relative
tcp.time_relative
字段(Time relative to first frame in this TCP stream)表示当前 TCP 数据包相对于同一条 TCP 流中第一个 TCP 数据包之间的时间差。如字面意思,这个字段也只能在 TCP 协议中使用,并且只记录同一条 TCP 流的数据包,即源和目的 IP 、端口相同,协议为 TCP 的数据包。
同样,该字段通常配合 Time Reference
功能一起使用,通过 Time Reference
功能设置任意数据包作为参考时间值后, tcp.time_relative
字段可以快速判断在同一个 TCP 连接上中不同 TCP 数据包之间的时间间隔。 需要注意的是,数据包文件中的一条 TCP 流中的第一个数据包并不一定是 TCP 三次握手中的第一个 SYN 数据包。例如,如果在开始捕获数据包时就没有捕获到这条 TCP 流的连接建立阶段,那么自然这条 TCP 流中的第一个数据包就不会是 SYN 数据包。
tcp.analysis.initial_rtt
tcp.analysis.initial_rtt
字段(How long it took for the SYN to ACK handshake)是指 TCP 三次握手建立的时间间隔,是用来测量 TCP 连接的延迟时间的一个指标。IRTT 表示"初始往返时间"(Initial Round Trip Time),在 TCP 连接刚开始建立的时候,计算 IRTT 就非常重要了,可以作为该条 TCP 流判断后续 TCP 数据包交互 RTT 时间、TCP 传输延迟等情况的一个参考基准。
当然如果 IRTT 值就始终太高,很有可能是由于网络延迟、拥塞或是系统性能问题所造成,通常就要直接进行故障处理,以查明延迟时间过长的原因并进行改善,如下显示过滤 IRTT 大于等于 100ms 间隔的 TCP 数据包。
c
tcp.analysis.initial_rtt >= 0.100
区别于通常常说的 RTT 一发一收两个数据包之间的时间间隔,IRTT 是 TCP 建连阶段三个数据包之间的时间间隔。
tcp.analysis.ack_rtt
tcp.analysis.ack_rtt
字段(How long time it took to ACK the segment)是指 TCP 数据包分段和该 TCP 数据包分段的 ACK 确认之间的时间间隔,是用来测量 TCP 连接的延迟时间的一个指标。
tcp.analysis.ack_rtt
可以用来检测 TCP 连接延迟情况,如果 RTT 值过大,那么可能表明数据传输过程中存在网络阻塞或者其他系统性能问题,如下显示过滤大于等于 100ms 确认间隔的 TCP 数据包。
c
tcp.analysis.ack_rtt >= 0.100
在不同的捕获点,同一个数据包分段和 ACK 确认的 RTT 值并不一样,譬如捕获点分别在数据包发送方和接收方的区别。
HTTP
http.time
http.time
是 HTTP 协议中的时间字段(Time since the request was sent),表示 HTTP 请求到响应的时间间隔。更具体地说,它是 HTTP 请求的时间戳,到 HTTP响应的时间戳之间的时间差。
需要注意的是,默认情况下的 Wireshark 对于 HTTP 请求和响应的解析有着不一样的定义,在上图 HTTP 响应(譬如 200 OK),是在包括响应数据全部传输完后的最后一个数据包中定义,这样 http.time
值会相对偏大。而我们日常理解的 HTTP ,响应一般是紧跟请求之后出现的,这样就需要更改 Wireshark 中 TCP 设置,将 Allow subdissector to reassemble TCP streams
选项去除勾选,这样真正的 http.time
就会如下图所示,更容易理解,而值会相对偏小。
http.time
反映了 HTTP 请求和响应的相对时间以及它们之间的延迟,因此可以找出慢速请求或慢速响应的原因,如下显示过滤大于等于 100ms 间隔的 HTTP 数据包。
c
http.time >= 0.100
在不同的捕获点,同一个 HTTP 请求和响应的时间间隔值并不一样,譬如捕获点分别在 HTTP 请求方和 HTTP 响应方的区别。
DNS
dns.time
dns.time
是DNS 协议数据包中的时间字段(The time between the Query and the Response),表示 DNS 查询请求到响应的时间间隔。具体而言,它是 DNS 查询请求的时间戳,到 DNS 响应的时间戳之间的时间差。
使用 dns.time
可以很方便地分析 DNS 查询和响应的时间延迟,以优化网络性能。如果 dns.time
显示的时间较长,说明 DNS 查询响应的延迟很大。这可能是 DNS 服务器故障、网络不稳定、DNS 缓存问题等,如下显示过滤大于等于 100ms 间隔的 DNS 数据包。
c
dns.time >= 0.100