
我在 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
一般來說,這是因為電腦太忙而無法處理傳入的資料包,而介面沒有地方放置它。驅動程式可能沒有給介面提供緩衝區,中斷可能被阻塞太久,嚴重缺乏資源等問題。
隨著作業系統實現和硬體效能的提高,這種情況不再發生了,但這在早期是一個真正的問題,例如,磁碟機可能會佔用記憶體匯流排,或者作業系統必須提供介面緩衝區作為接收中斷服務的一部分(硬體設計不良)。