為什麼 tcpdump 封包會被介面丟棄?

為什麼 tcpdump 封包會被介面丟棄?

我在 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));

人 pcap_stats:

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

一般來說,這是因為電腦太忙而無法處理傳入的資料包,而介面沒有地方放置它。驅動程式可能沒有給介面提供緩衝區,中斷可能被阻塞太久,嚴重缺乏資源等問題。

隨著作業系統實現和硬體效能的提高,這種情況不再發生了,但這在早期是一個真正的問題,例如,磁碟機可能會佔用記憶體匯流排,或者作業系統必須提供介面緩衝區作為接收中斷服務的一部分(硬體設計不良)。

相關內容