7

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

4

2 回答 2

12

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

您需要注意这一点,因为您的大多数 ACK 数据包将来自您的办公室机器 ACKing 从互联网接收的数据包,因此您将测量路由器从互联网看到数据包和从办公室机器看到 ACK 之间的 RTT .

要测量您的互联网 RTT,您需要查找来自互联网的 ACKS(确认从您的网络发送的数据)。假设你的办公室机器有像 192.168.1.x 这样的 IP 地址,并且你已经在路由器的 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 文件合并为一个文件。将此输出转换为直方图应该很容易!

于 2011-08-06T23:24:08.040 回答
1

这是受 rupello 回答启发的 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

于 2012-03-28T20:01:01.360 回答