如何在 tcpdump 中捕获“丢弃的数据包”

如何在 tcpdump 中捕获“丢弃的数据包”

我的网络性能有问题。我在 VMware Cloud Server 上使用 Ubuntu 16.04,NIC 为 E1000。但我看到 ifconfig 命令的部分内容中丢弃了一些数据包:

root@ubuntu:~# ifconfig ens192
ens192    Link encap:Ethernet  HWaddr 00:50:56:03:25:14  
          inet addr:192.16.1.100  Bcast:192.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:574749 errors:0 dropped:83 overruns:0 frame:0
          TX packets:76478 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:44109471 (44.1 MB)  TX bytes:19484534 (19.4 MB)

虽然只是丢失了一些数据包,但我的服务器正在在线运行实时游戏,所以你知道它会影响连接到它的客户端。

我在 Google 上进行了一些研究和探索,之后我尝试更改缓冲区环、最大窗口大小等的配置文件。但它仍然会丢弃我的数据包。

所以,现在我想捕获丢弃的数据包,以分析它到底是什么类型的数据包。

我也尝试在 wireshark 中捕获以下视图:

sudo tcpdump -i ens192 -n -w /var/www/html/logs.pcap -C 1 -Z root

但我认为我看不到丢弃了哪些数据包!我认为丢弃的数据包在进入 tcpdump 过滤器之前会被忽略。

您能建议我用什么方法来捕获上面的“丢弃的数据包”吗(掉落:83)?

提前致谢!

答案1

问题可能出在 tcpdump 本身上:如果它响应不够快,那么旧数据包将被新数据包覆盖,这意味着它们会被丢弃。

如果您捕获每个数据包的所有字节,则很容易导致内核的数据包捕获缓冲区溢出。这种溢出的症状是您的数据包跟踪程序将报告它丢弃了数据包。

对于 tcpdump,当您停止捕获时,它会打印出捕获、过滤和丢弃的数据包的摘要。例如:

$ sudo tcpdump -i en0 -w trace.pcap
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
94 packets captured
177 packets received by filter
0 packets dropped by kernel

如果dropped计数不为零,则需要通过将选项传递-B给 tcpdump 来增加数据包捕获缓冲区大小。在没有捕获文件的情况下也尝试一下,看看这是否能提高捕获率。

答案2

您的问题似乎与回溯并找出可能导致先前数据包丢失的原因有关,而不是尝试捕获实时数据包以尝试找到丢失的数据包。对于后者,harrymc 的回答最终应该能够捕获您正在寻找的一个。

要回过头来查看该接口上可能发生的情况,您必须了解所看到的那些标题RX packets:574749 errors:0 dropped:83 overruns:0 frame:0只是底层计数器的摘要。

我的评论,我建议使用ethtool来自的命令/包这个答案分析一些计数器,看看是否可以发现一些不合适的地方。
ethtool -S ens192

来自broadcom 驱动程序源文件,我们tp->rx_dropped++;在文件中看到了几个不同的情况。 1 2 3 其中一个或多个(取决于您的具体 NIC 和底层驱动程序)都可能导致数据包丢失。

为了让您放心,根据上面的输出,您的服务器丢弃的数据包不到 0.015%。您的客户端不会注意到任何服务器中断甚至抖动,直到您的丢包率/错误率超过 1%。即使到那时,也很难注意到。TCP 将处理所需的任何重新传输。

相关内容