Warum würde der Kernel Pakete ablegen?

50

Ich habe tcpdumpmit Ctrl+ unterbrochen Cund diese Gesamtübersicht erhalten:

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

Was sind die "Pakete, die vom Kernel verworfen wurden"? Warum passiert das?

rɑːdʒɑ
quelle
In meinem Fall habe ich die Option -s0 verwendet und sie in -s1600 (direkt über MTU) geändert, um sie für mich zu lösen.
LatinSuD

Antworten:

49

Aus dem tcpdump-Handbuch:

Pakete, die vom Kernel verworfen wurden (dies ist die Anzahl der Pakete, die aufgrund des fehlenden Pufferspeichers vom Paketerfassungsmechanismus im Betriebssystem, auf dem tcpdump ausgeführt wird, verworfen wurden, wenn das Betriebssystem diese Informationen an Anwendungen meldet). wenn nicht, wird es als 0) gemeldet.

Ein bisschen Erklärung:

Das tcpdumpCapture erfasst Rohpakete, die über eine Netzwerkschnittstelle übertragen werden. Die Pakete müssen gemäß den von Ihnen in der Befehlszeile festgelegten Regeln analysiert und gefiltert werden. Dies dauert einige Zeit, sodass eingehende Pakete für die Verarbeitung gepuffert (in die Warteschlange gestellt) werden müssen. Manchmal gibt es zu viele Pakete, sie werden in einem Puffer gespeichert, aber sie werden schneller als verarbeitet gespeichert, so dass der Puffer irgendwann nicht mehr genügend Speicherplatz hat, sodass der Kernel alle weiteren Pakete ablegt, bis im Puffer etwas freier Speicherplatz vorhanden ist.

Sie können die Puffergröße mit der Option -B( --buffer-size) wie folgt erhöhen :

tcpdump -B 4096 ....

Beachten Sie, dass die Größe in Kilobyte angegeben wird. In der obigen Zeile wird die Puffergröße auf 4 MB festgelegt.

Dmitry Vasilyanov
quelle
1
Außerdem habe ich absichtlich kibi- / mebi- in kilo- / mega- geändert und ein Wort über libpcap weggelassen, um die Leute nicht zu verwirren.
Dmitry Vasilyanov
4
Beachten Sie auch, dass die Unterstützung für "lange Optionen" in tcpdump relativ neu ist. In älteren Versionen (mit Ausnahme von viel älteren Versionen, die das Festlegen der Puffergröße nicht unterstützen) können Sie dies tun tcpdump -B 4096.
Ein weiterer Hinweis: Das Einrichten großer Puffer nimmt Zeit in Anspruch. Wenn Sie die Puffer auf etwas Verrücktes setzen, können Sie während dieser Initialisierungszeit Pakete verpassen (tcpdump meldet sie als "Pakete, die vom Kernel fallengelassen wurden").
dgreene
27

Eine weitere Sache, die Sie in Betracht ziehen sollten, ist, dass Sie tcpdumpmöglicherweise viel Zeit mit DNS-Abfragen verbringen, um IPs in Domain-Namen aufzulösen. Wenn Sie diese nicht benötigen, setzen Sie das -nKennzeichen (keine Suche). z.B:

tcpdump -n port 80
KJH
quelle
2
Das war ein Retter. Ich wusste nicht, dass tcpdump die Auflösung beim Speichern in eine Datei umkehrt !! Mit -nn -B 4096erlaubte mir zu bekommen0 packets dropped by kernel
Blanka
11

Nach man tcpdump:

Pakete, die vom Kernel verworfen wurden (dies ist die Anzahl der Pakete, die aufgrund fehlenden Pufferspeichers vom Paketerfassungsmechanismus des Betriebssystems, auf dem tcpdump ausgeführt wird, verworfen wurden, wenn das Betriebssystem diese Informationen an Anwendungen meldet, andernfalls wird gemeldet als 0).

Der Kernel legt erfasste Pakete in einem Erfassungspuffer fester Größe ab . Wenn tcpdumpdieser Puffer nicht schnell genug geleert wird, beginnt der Kernel, alte Pakete im Puffer zu überschreiben und den verworfenen Zähler entsprechend zu erhöhen . Der Wert dieses Zählers wird als "vom Kernel gelöscht" angezeigt.

Übrigens können Sie die Größe des Erfassungspuffers ändern : Übergeben Sie tcpdumpdie -BOption mit einer KiB-Größe.

Anko
quelle
2

Abgesehen von dem, was in der Manpage steht, scheint es einen zusätzlichen Grund zu geben, warum Pakete vom Kernel verworfen werden. Ich habe einen 100% tcpdump-igen Paketverlust festgestellt, bei dem der einzige Datenverkehr im Netzwerk ein 512-Bit-Paket PRBS pro Sekunde war. Die Erklärung des Pufferplatzes ist hier offensichtlich nicht sinnvoll - ich denke, der Kernel kann 0,5 kB / s verarbeiten.

Etwas, das mit meiner Distribution (Ubuntu 14.04) mitgeliefert wurde, hat möglicherweise eine Art intelligente Filterung auf der Verbindungsebene durchgeführt, die meine Testpakete nicht mochte. Meine Problemumgehung bestand darin, einen neuen Netzwerknamespace wie folgt zu erstellen:

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

In der inneren netnsShell sind alle Betriebssystemprozesse, die zuvor Probleme verursacht haben, nicht sichtbar und tcpdumpzeigen mir alle Pakete, die ich erwarten würde.

Lombard
quelle
1

Ich finde es nützlich, die tcpdump -cOption zu verwenden. Auf diese Weise können Sie die Anzahl der Pakete festlegen und dann stoppen und den Puffer nicht ausfüllen.

Zum Beispiel wird dieser die TCP-Anfragen auf localhost erfassen.

tcpdump -ni lo tcp -c 20
prosti
quelle