使用wireshark或其他工具绘制RTT直方图

时间:2011-08-05 20:18:25

标签: histogram wireshark tcpdump roundtrip

我有一个小办公室网络,我遇到了巨大的互联网链接延迟。我们有一个简单的网络拓扑:配置为运行ubuntu服务器10.10的路由器的计算机,2个网卡(一个连接到互联网链接,另一个连接到办公网络)和一个连接20台计算机的交换机。我在路由器上收集了一个巨大的tcpdump日志,我想用所有 TCP流的RTT时间绘制直方图,以试图找出解决此延迟问题的最佳方案。那么,有人可以告诉我如何使用wireshark或其他工具吗?

3 个答案:

答案 0 :(得分:11)

Wireshark或tshark可以使用 tcp.analysis.ack_rtt 为每个收到的ACK数据包提供TCP RTT,它可以测量捕获TCP数据包与该数据包的ACK之间的时间差。

你需要小心这一点,因为你的办公室机器上的大部分ACK数据包都是来确认从互联网收到的数据包,所以你将测量路由器之间的RTT互联网,并从您的办公室机器看到ACK。

要测量您的互联网RTT,您需要从互联网上查找ACKS(确认从您的网络发送的数据)。假设你的办公室机器有IP地址,如192.168.1.x,你已经记录了路由器LAN端口上的所有数据,你可以使用如下的显示过滤器:

tcp.analysis.ack_rtt and ip.dst==192.168.1.255/24

要将RTT转储到.csv进行分析,您可以像这样使用tshark命令;

tshark -r router.pcap -Y "tcp.analysis.ack_rtt and ip.dst==192.168.1.255/24" -e tcp.analysis.ack_rtt -T fields -E separator=, -E quote=d > rtt.csv

  • -r选项告诉tshark从.pcap文件中读取
  • -Y选项指定要使用的显示过滤器(不含-2的-R)
  • -e选项指定要输出的字段
  • -T选项指定输出格式

在运行此命令之前,您可以使用mergecap实用程序将所有pcap文件合并为一个文件。将此输出转换为直方图应该很容易!

答案 1 :(得分:1)

这是受卢佩罗回答启发的5分钟perlscript:

#!/usr/bin/perl

# For a live histogram of rtt latencies, save this file as /tmp/hist.pl and chmod +x /tmp/hist.pl, then run:
# tshark -i wlp2s0 -Y "tcp.analysis.ack_rtt and ip.dst==192.168.0.0/16" -e tcp.analysis.ack_rtt -T fields -E separator=, -E quote=d  | /tmp/hist.pl 
# Don't forget to update the interface "wlp2s0" and "and ip.dst==..." bits as appropriate, type "ip addr" to get those.

@t[$m=0]=20;
@t[++$m]=10;
@t[++$m]=5;
@t[++$m]=2;
@t[++$m]=1;
@t[++$m]=0.9;
@t[++$m]=0.8;
@t[++$m]=0.7;
@t[++$m]=0.6;
@t[++$m]=0.5;
@t[++$m]=0.4;
@t[++$m]=0.3;
@t[++$m]=0.2;
@t[++$m]=0.1;
@t[++$m]=0.05;
@t[++$m]=0.04;
@t[++$m]=0.03;
@t[++$m]=0.02;
@t[++$m]=0.01;
@t[++$m]=0.005;
@t[++$m]=0.001;
@t[++$m]=0;

@h[0]=0;

while (<>) {
 s/\"//g; $n=$_; chomp($n); $o++;
 for ($i=$m;$i>=0;$i--) { if ($n<=$t[$i]) { $h[$i]++; $i=-1; }; };
 if ($i==-1) { $h[0]++; };
 print "\033c"; 
 for (0..$m) { printf "%6s %6s %8s\n",$t[$_],sprintf("%3.2f",$h[$_]/$o*100),$h[$_]; };
}

较新版本的tshark似乎在“tshark”前面使用“stdbuf -i0 -o0 -e0”效果更好。

PS有没有人知道wireshark是否内置了DNS和ICMP rtt统计数据或者如何轻松获取这些数据?

2018年更新:见https://github.com/dagelf/pping

答案 2 :(得分:-1)

You can use tshark statistics to create a table of all tcp conversations:
$ tshark -r test.pcap -q -z conv,tcp
================================================================================
TCP Conversations
Filter:
                                               |             | |     Total     |
                                               | Frames  Bytes | | Frames  Bytes | | Frames  Bytes |
192.168.108.2:2720      147.234.1.253:21          28      2306      18      1047      46      3353
147.234.1.253:58999     192.168.108.2:2721         3       170       2       122       5       292
192.168.108.2:2718      147.137.21.94:139          0         0       3       186       3       186
192.168.108.2:2717      147.137.21.94:445          0         0       3       186       3       186
================================================================================

Or use this little script:

for file in `ls -1 *.pcap`
do
   tshark -r $file -q -z conv,tcp > $file.txt
done