【问题标题】:Plot RTT histogram using wireshark or other tool使用wireshark或其他工具绘制RTT直方图
【发布时间】:2011-10-21 04:28:06
【问题描述】:

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

【问题讨论】:

    标签: histogram wireshark tcpdump roundtrip


    【解决方案1】:

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

    您需要小心这一点,因为您的大部分 ACK 数据包将来自您的办公室机器 ACKing 数据包从互联网接收,因此您将测量路由器之间的 RTT,查看来自的数据包上网并从您的办公室机器上查看 ACK。

    要衡量您的互联网 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 文件合并为一个文件。将此输出转换为直方图应该很容易!

    【讨论】:

      【解决方案2】:

      这是受 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

      【讨论】:

        猜你喜欢
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多