tcpdump パケットがインターフェースによってドロップされるのはなぜですか?

tcpdump パケットがインターフェースによってドロップされるのはなぜですか?

私は Windows 7 ホスト上の Virtual Box 経由で Ubuntu 14.04 を使用しています。NIC は USB から Ethernet へのアダプタです。

mantcpdump用「カーネルによってドロップされたパケット」の原因は述べられていますが、「インターフェースによってドロップされたパケット」の原因は述べられていません。

インターフェースがパケットをドロップする理由について、誰か説明してくれませんか? または、パケットがドロップされる理由をどうやって見つければいいのでしょうか?

答え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

一般的に、これはコンピュータがビジー状態のため着信パケットを処理できず、インターフェイスにパケットを配置する場所がないために発生します。ドライバーがインターフェイスにバッファを提供していない可能性があり、割り込みが長時間ブロックされている可能性があり、そのような深刻なリソース不足の問題があります。

OS の実装とハードウェアのパフォーマンスが向上したため、このようなことはあまり起こらなくなりましたが、初期の頃は、たとえばディスク ドライブがメモリ バスを占有したり、OS が受信割り込みの処理の一環としてインターフェイスにバッファーを提供しなければならなかったり (ハードウェア設計が不十分) するなど、大きな問題でした。

関連情報