如何被动监控 TCP 数据包丢失?(Linux)

如何被动监控 TCP 数据包丢失?(Linux)

我如何才能被动地监控往返于我的机器的 TCP 连接的数据包丢失情况?

基本上,我想要一个在后台运行的工具,它监视 TCP ack/nak/重新传输,以生成一份报告,说明哪些对等 IP 地址“似乎”正在遭受严重损失。

我发现 SF 的大多数此类问题都建议使用 iperf 之类的工具。但我需要监控我机器上与真实应用程序之间的连接。

这些数据只是存在于 Linux TCP 堆栈中吗?

答案1

从总体上看,问题的规模netstat -s将跟踪您的总重传次数。

# netstat -s | grep retransmitted
     368644 segments retransmitted

您还可以使用 grep 来segments获取更详细的视图:

# netstat -s | grep segments
         149840 segments received
         150373 segments sent out
         161 segments retransmitted
         13 bad segments received

为了更深入地了解,您可能需要启动 Wireshark。

在 Wireshark 中设置过滤器以tcp.analysis.retransmission查看按流重新传输。

这是我能想到的最佳选择。

探索的其他死胡同:

  • netfilter/conntrack 工具似乎不保留重传
  • stracingnetstat -s显示它只是打印/proc/net/netstat
  • /proc/net/tcp 中的第 9 列看起来很有希望,但不幸的是它似乎未被使用。

答案2

这些统计数据位于 /proc/net/netstat 中,并且collectl将以交互方式为您监视它们或将其写入磁盘以供以后播放:

[root@poker ~]# collectl -st
waiting for 1 second sample...
#<------------TCP------------->
#PureAcks HPAcks   Loss FTrans
        3      0      0      0
        1      0      0      0

当然,如果您想并排查看网络流量,只需n包含-s

[root@poker ~]# collectl -stn
waiting for 1 second sample...
#<----------Network----------><------------TCP------------->
#  KBIn  PktIn  KBOut  PktOut PureAcks HPAcks   Loss FTrans
      0      1      0       1        1      0      0      0
      0      1      0       1        1      0      0      0

答案3

您可以使用该ss工具获取详细的 TCP 统计信息:

$ ss --tcp --info

在 Debian 下,使用apt-get install iproute获取二进制文件。

答案4

你可能想看看dropwatch公用事业。

相关内容