是否有可能在不使用 ICMP 协议(ping、fping 等)的情况下以某种方式检测数据包丢失,以避免使用 netstat 等默认实用程序产生额外的网络流量?
答案1
不确定这是否适用于 FreeBSD,但在 Linux 上,您可以检查 TCP 重传,可能是在给定时间范围内看到的总体数据包的百分比。
在 Linux 上,这看起来像这样:
> cat /proc/net/tcp sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0014 00000000:0000 09 00000000:00000000 00:00000000 00000000 0 0 30111 1 0000000000000000 100 0 0 10 0
另请参阅此问题以了解其他想法以及基于 netstat 的答案:https://serverfault.com/questions/318909/how-passively-monitor-for-tcp-packet-loss-linux。
你需要的答案来自乔尔·K:
netstat -s | grep retransmitted
答案2
iwaseatenbyagrue 的答案是一个很好的答案(我赞成),但它有一个简单的缺陷,IE它返回全球的数据包丢失统计,而平(和地铁,合并跟踪路由/ping工具)当地的通信:换句话说,他们将详细说明特定通信的数据包丢失,而不是过去所有通信的平均值。
Wireshark是一款适用于所有操作系统的常见数据包分析工具,可帮助您根据每个连接确定数据包丢失情况。其基础是TCP 数据包(但不是UDP 数据包)携带一个连续的序列号(尽管第一个数据包的序列号是以迂回的方式确定的,以规避某类攻击),这使得在数据包在到达预定目的地之前丢失时可以请求重复发送。
要在 Wireshark 中实现此功能,请转到“统计信息”->“对话统计信息”,然后从“TCP”选项卡中选择要为其建立数据包丢失率的对话(=远程主机)。然后您将获得吞吐量(每秒从远程到本地的数据包数,反之亦然)。如果您想要数据包丢失率,请在选择对话时添加以下过滤器和 tcp.analysis.lost_segment,并通过检查状态栏中有多少数据包与过滤器匹配来查看有多少数据包被丢弃。
我发现网上有无数关于如何做到这一点的资料这个 Youtube 视频简单明了,但真正谷歌wireshark 数据包丢失将显示很多包含良好建议的页面。
答案3
您可以使用港铁程序-u
可选择使用数据报而不是 ICMP ECHO 或-T
使用 TCP SYN 数据包。
如果您不想产生任何额外的流量,而只是想获得过去丢失的数据包的累积统计信息,那么您可以通过err
运行以下命令从标记为的列中获取 FreeBSD OS 的统计信息:
netstat -idb -I <interface_name>
你会得到类似这样的结果:
# netstat -idb -I em0
Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll Drop
em0 1500 <Link#1> 00:11:22:33:44:55 110031161 0 2708056139 176396459 0 366893484 0 0
em0 1500 192.168.24.0 mxmail 107582221 - 1545164761 177078111 - 2870208791 - -