Ich habe tcpdump
mit 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?
Ich habe tcpdump
mit 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?
Antworten:
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 tcpdump
Capture 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.
tcpdump -B 4096
.
Eine weitere Sache, die Sie in Betracht ziehen sollten, ist, dass Sie tcpdump
möglicherweise viel Zeit mit DNS-Abfragen verbringen, um IPs in Domain-Namen aufzulösen. Wenn Sie diese nicht benötigen, setzen Sie das -n
Kennzeichen (keine Suche). z.B:
tcpdump -n port 80
-nn -B 4096
erlaubte mir zu bekommen0 packets dropped by kernel
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 tcpdump
dieser 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 tcpdump
die -B
Option mit einer KiB-Größe.
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 netns
Shell sind alle Betriebssystemprozesse, die zuvor Probleme verursacht haben, nicht sichtbar und tcpdump
zeigen mir alle Pakete, die ich erwarten würde.