カーネルがパケットをドロップするのはなぜですか?


50

tcpdumpCtrl+ Cで中断し、この総括を得ました:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

「カーネルによってドロップされたパケット」とは何ですか?なぜそれが起こるのですか?


私の場合、オプション-s0を使用していましたが、-s1600(MTUのすぐ上)に変更すると解決しました。
LatinSuD

回答:


50

tcpdumpのマニュアルから:

パケットが「カーネルによってドロップ」(これは、OSがアプリケーションにその情報を報告する場合、tcpdumpが実行されているOSのパケットキャプチャメカニズムによって、バッファスペースの不足によりドロップされたパケットの数です。そうでない場合は、0として報告されます。

ちょっとした説明:

tcpdumpネットワークインタフェースを通過キャプチャ生のパケット。パケットは、コマンドラインで指定されたルールに従って解析およびフィルタリングする必要があり、時間がかかるため、着信パケットは処理のためにバッファリング(キュー)する必要があります。パケットが多すぎてバッファに保存されることもありますが、処理よりも速く保存されるため、最終的にバッファの空き容量がなくなるため、カーネルはバッファに空き領域ができるまでパケットをすべて削除します。

次のように-B--buffer-size)オプションを使用して、バッファサイズを増やすことができます。

tcpdump -B 4096 ....

サイズはキロバイト単位で指定されるため、上記の行はバッファーサイズを4MBに設定します。


1
また、意図的にkibi- / mebi-をkilo- / mega-に変更し、人々を混乱させないためにlibpcapについての言葉を省略しました。
ドミトリーヴァシリヤノフ14

4
また、tcpdumpでの「長いオプション」のサポートは比較的新しいことに注意してください。古いバージョン(バッファサイズの設定をサポートしていない古いバージョンを除く)でできますtcpdump -B 4096

また、大きなバッファをセットアップするには時間がかかります。バッファをおかしなものに設定すると、その初期化時にパケットを見逃す可能性があります(tcpdumpはそれらを「カーネルによってドロップされたパケット」として報告します)。
dgreene

27

検討/試行するもう1つのことは、tcpdumpIPをドメイン名に解決するためにDNSクエリを実行するのに多くの時間を費やしている可能性があることです。これらが必要ない場合は、-n(ルックアップなし)フラグをスローしてみてください。例えば:

tcpdump -n port 80

2
これは救世主でした。tcpdumpがファイルへのダンプ時に逆の解決を行ったことに気付かなかった!! を使用-nn -B 4096して取得することができました0 packets dropped by kernel
ブランカ

11

によるとman tcpdump

カーネルによってドロップされたパケット(これは、tcpdumpが実行されているOSのパケットキャプチャメカニズムにより、OSがその情報をアプリケーションに報告する場合、バッファースペースの不足によりドロップされたパケットの数です。そうでない場合は、 0として報告されます。

カーネルは、キャプチャしたパケットを固定サイズのキャプチャバッファに入れます。場合はtcpdump十分にすぐにそのバッファを空にしない、カーネルがバッファ内の古いパケットを上書きし、それに応じてインクリメントを開始しますドロップカウンターを。そのカウンターの値は、「カーネルによるドロップ」として表示されるものです。

ところで、あなたはすることができますキャプチャバッファのサイズを変更:渡しKiBのサイズのオプションを選択します。tcpdump-B


2

マニュアルページの説明に加えて、パケットがカーネルによってドロップされる可能性がある追加の理由があるようです。tcpdumpネットワーク上の唯一のトラフィックが1秒あたりPRBSの512Bパケット1つであった場所から、100%のパケットドロップが発生していました。明らかに、バッファスペースの説明はここでは意味をなしません-カーネルは0.5kiB / sを処理できると思います。

私のディストリビューション(Ubuntu 14.04)に付属していたものは、テストパケットが気に入らなかったリンクレイヤーで何らかのスマートフィルタリングを行っていた可能性があります。私の回避策は、次のように新しいネットワーク名前空間を作成することでした。

sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up

インナーnetnsシェルでは、以前に問題を引き起こしていたOSプロセスtcpdumpはすべて見えなくなり、予想されるすべてのパケットが表示されます。


1

このtcpdump -cオプションを使用すると便利です。この方法では、パケットの数を設定してから停止することができ、バッファを埋めることはできません。

たとえば、これはローカルホストでtcp要求をキャプチャします。

tcpdump -ni lo tcp -c 20
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.