我在 Windows 7 主机上通过 Virtual Box 使用 Ubuntu 14.04。 NIC 是 USB 转以太网适配器。
这man
对于 tcpdump说明了可能导致“内核丢弃数据包”的原因,但没有说明导致“接口丢弃数据包”的原因。
任何人都可以解释为什么接口可能会丢弃数据包吗?或者我如何找出丢包的原因?
答案1
正如您所指出的,文档中没有任何关于“接口丢弃的数据包”计数器的内容。所以我们需要一些源代码挖掘。
来自tcpdump的源代码,接口丢弃计数器提取自stats.ps_ifdrop
:
if (stats.ps_ifdrop != 0) {
if (!verbose)
fputs(", ", stderr);
else
putc('\n', stderr);
(void)fprintf(stderr, "%u packet%s dropped by interface\n",
stats.ps_ifdrop, PLURAL_SUFFIX(stats.ps_ifdrop));
ps_ifdrop
number of packets dropped by the network interface or its driver.
并从libpcap 源代码:
* "ps_ifdrop" is supported. It will return the number
* of drops the interface reports in /proc/net/dev,
* if that is available.
所以tcpdump“接口丢弃的数据包”计数器对应于捕获/proc/net/dev
期间记录为丢弃的数据包tcpdump
。
字段含义/proc/dev/net
解释这里
为了更好地了解掉落情况,我首先查看以下统计数据:
ethtool -S <interface>
grep '' /sys/class/net/<interface>/statistics/*
答案2
一般来说,这是因为计算机太忙而无法处理传入的数据包,而接口没有地方放置它。驱动程序可能没有给接口提供缓冲区,中断可能被阻塞太久,严重缺乏资源等问题。
随着操作系统实现和硬件性能的提高,这种情况不再发生了,但这在早期是一个真正的问题,例如,磁盘驱动器可能会占用内存总线,或者操作系统必须提供接口缓冲区作为接收中断服务的一部分(硬件设计不佳)。