it-swarm.com.de

Warum sollte der Kernel Pakete verwerfen?

Ich habe tcpdump mit unterbrochen Ctrl+C und bekam diese Gesamtzusammenfassung:

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

Was sind die "vom Kernel verworfenen Pakete"? Warum passiert das?

51
rɑːdʒɑ

Aus dem Handbuch von tcpdump:

pakete "vom Kernel verworfen" (dies ist die Anzahl der Pakete, die aufgrund eines Mangels an Pufferplatz durch den Paketerfassungsmechanismus in dem Betriebssystem verworfen wurden, auf dem tcpdump ausgeführt wird, wenn das Betriebssystem diese Informationen an Anwendungen meldet; Wenn nicht, wird es als 0) gemeldet.

Ein bisschen Erklärung:

Das tcpdump 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, sodass dem Puffer schließlich der Speicherplatz ausgeht, sodass der Kernel alle weiteren Pakete löscht, bis etwas freier Speicherplatz im Puffer vorhanden ist.

Sie können die Puffergröße mit der folgenden Option -B (--buffer-size) 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.

51

Eine weitere zu berücksichtigende Sache ist, dass tcpdump möglicherweise viel Zeit mit DNS-Abfragen verbringt, um IPs in Domainnamen aufzulösen. Wenn Sie diese nicht benötigen, werfen Sie das -n (keine Suche) Flag. z.B.:

tcpdump -n port 80
28
KJH

Gemäß man tcpdump:

pakete , die vom Kernel verworfen wurden (dies ist die Anzahl der Pakete, die aufgrund eines Mangels an Pufferplatz durch den Paketerfassungsmechanismus im Betriebssystem verworfen wurden Welcher tcpdump wird ausgeführt, wenn das Betriebssystem diese Informationen an Anwendungen meldet? Wenn nicht, werden sie als 0 gemeldet.

Der Kernel legt erfasste Pakete in einem Erfassungspuffer fester Größe ab . Wenn tcpdump diesen Puffer nicht schnell genug leert, beginnt der Kernel, alte Pakete im Puffer zu überschreiben und den abgelegten Zähler entsprechend zu erhöhen . Der Wert dieses Zählers ist das, was Sie als "vom Kernel gelöscht" sehen.

Übrigens können Sie Größe des Erfassungspuffers ändern : Übergeben Sie tcpdump das -B Option mit einer KiB-Größe.

12
Anko

Neben den Angaben auf der Manpage scheint es einen weiteren Grund zu geben, warum Pakete vom Kernel verworfen werden können. Ich habe einen 100% igen Paketverlust von tcpdump festgestellt, bei dem der einzige Datenverkehr im Netzwerk ein 512B-Paket PRBS pro Sekunde war. Natürlich macht die Erklärung des Pufferraums hier keinen Sinn - ich denke, der Kernel kann 0,5 kB/s verarbeiten.

Etwas, das mit meiner Distribution (Ubuntu 14.04) einherging, hat möglicherweise eine Art intelligentes Filtern auf der Link-Ebene durchgeführt, das meine Testpakete nicht mochte. Meine Problemumgehung bestand darin, einen neuen Netzwerk-Namespace 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 netns Shell sind alle Betriebssystemprozesse, die zuvor Probleme verursacht haben, nicht im Bild und tcpdump zeigt mir alle Pakete, die ich erwarte.

2
Lombard

Ich finde es nützlich, das tcpdump -c Möglichkeit. Auf diese Weise können Sie die Anzahl der Pakete festlegen und dann anhalten und den Puffer nicht ausfüllen.

Zum Beispiel erfasst dieser die TCP-Anforderungen auf localhost.

tcpdump -ni lo tcp -c 20
2
prosti

Ich fand heraus, dass ich alle drei Dinge verwenden musste, die andere oben empfohlen haben, um nicht vom Kernel fallen gelassen zu werden:

tcpdump -c 10000 -n -B 10240
0
Wayne Walker