Wireshark 提示和技巧 | Time 时间分析那些事

前言

众所周知,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
相关推荐
千天夜1 分钟前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
follycat1 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
earthzhang20212 小时前
《深入浅出HTTPS》读书笔记(5):随机数
网络协议·http·https
xiaoxiongip6662 小时前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
JaneJiazhao2 小时前
HTTPSOK:SSL/TLS证书自动续期工具
服务器·网络协议·ssl
JaneJiazhao2 小时前
HTTPSOK:智能SSL证书管理的新选择
网络·网络协议·ssl
城南vision4 小时前
计算机网络——HTTP篇
网络协议·计算机网络·http
懒大王就是我5 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
星LZX6 小时前
WireShark入门学习笔记
笔记·学习·wireshark
海绵波波1077 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip