Wie funktionieren Capture-Filter in Wireshark intern?

1092
Chuu

Ich frage mich, was genau in TShark intern passiert, wenn ich einen Capture-Filter verwende. Angenommen, ich habe den folgenden Filter zum Erfassen von Multicast-Daten:

host 224.0.26.3 && port 12345 

Wireshark:

  1. Bitten Sie das Betriebssystem, alle Pakete der Schnittstelle in den lokalen Puffer zu kopieren
  2. Wenden Sie den Capture-Filter an
  3. Zeichnen Sie die Daten auf

oder

  1. Bitten Sie das Betriebssystem nur, alle Pakete auf der Schnittstelle von Host 224.0.26.1 und Port 12345 in den lokalen Puffer zu kopieren. . .
  2. Zeichnen Sie die Daten auf

oder etwas ganz anderes?

1

2 Antworten auf die Frage

2
Horn OK Please

Wireshark verfügt über zwei Arten von Filtern: Anzeigefilter und Erfassungsfilter.

Anzeigefilter sind flexibler als Erfassungsfilter (einige Erfassungsfilter können dies nicht tun), da Anzeigefilter die Daten prüfen, nachdem sie bereits in das Paketprotokoll von wireshark kopiert wurden.

Aufnahmefilter können für die Leistung von großem Nutzen sein, wenn viele separate Datenströme über Ihre Netzwerkschnittstelle laufen, Sie jedoch nur eine kleine Menge davon erfassen möchten. Die Daten werden niemals in Wireshark kopiert, wenn sie nicht mit den Erfassungsfiltern übereinstimmen.

Sie können dies tatsächlich ausprobieren und den Leistungsunterschied in der Benutzeroberfläche spüren (und den Leistungsunterschied bei der CPU-Nutzung beobachten), indem Sie Folgendes tun:

  1. Starten Sie einen schnellen Webserver auf Localhost.
  2. Starten Sie einen enormen HTTP-Dateidownload (Gigabyte an Daten).
  3. Erfassen Sie auf der Localhost-Netzwerkschnittstelle mit einem Erfassungsfilter, der den Port ignoriert, an dem der riesige Download stattfindet.
  4. Löschen Sie den Erfassungsfilter vollständig, und vergleichen Sie in Schritt 3 die Leistung und die CPU-Auslastung, um dieselbe Art von Filter auf der Anzeigefilterseite festzulegen.

Bei IIRC speichert Wireshark die Paketkappen auf die Festplatte (damit es nicht in OOM geht). Der Engpass, der bei "zu breiten" Capture-Filtern auftritt, besteht wahrscheinlich darin, dass Ihr Festplattensubsystem alle Vorgänge auf Ihrer Netzwerkschnittstelle protokollieren muss.

Aus diesem Grunde, wenn Sie einen sehr ausgelasteten Server sind wiresharking nur einen bestimmten Fluss oder Prozess zu beobachten, ist es wesentlich sinnvoll Capture Filter einzustellen. Andernfalls führt wireshark zu erheblicher CPU-Last und E / A-Durchsatz.

Unter Windows wird die Paketerfassung meistens auf der Kernel-Seite implementiert. Wireshark verwendet ein Tool namens WinPcap, ein Kernel-Modul, das Ihre Capture-Filter zur Laufzeit in nativen Code kompiliert, um einen extrem optimierten Test zu erstellen, ob der Capture-Filter übereinstimmt oder nicht. Wenn der Filter nicht übereinstimmt, wird das Paket niemals in den Prozessraum von wireshark kopiert.

Die Implementierung des pcap-Kernelseiten-Backends kann von Plattform zu Plattform und somit auch in Bezug auf Leistung und Effizienz variieren.

Dies bezieht sich nicht speziell auf meine Frage. Was ich versuche herauszufinden, ist genau das, was Wireshark (in diesem Fall TShark) auf Betriebssystemebene tut, um herauszufinden, wie mehrere Captures auf derselben Box-Skala erfasst werden. Chuu vor 9 Jahren 0
Unmöglich zu wissen, ohne das genaue Betriebssystem und die Wireshark- / Hai-Version anzugeben. Siehe meine Bearbeitung. Grundsätzlich kann ich mit Sicherheit sagen, dass * keine Daten vom Kernel in den Userspace * kopiert werden (also kein Kontextwechsel), wenn ein Paket nicht mit einem Capture-Filter übereinstimmt, im Fall des WinPcap-Backends von Windows. Keine Ahnung, wie es unter Linux, BSD usw. funktioniert. Sie müssen sich den Kernel-Quellcode für die entsprechenden Capture-Treiber ansehen. Horn OK Please vor 9 Jahren 0
Beachten Sie, dass mit "keine Daten" ich meine, dass die Nutzdaten des Pakets nicht erfasst werden. Aus verschiedenen technischen Gründen kann es erforderlich sein, den Paket-Header in den Userspace zu kopieren oder dem Kernel mitzuteilen, dass er ein Paket übersprungen hat. Dies ist jedoch eine Kommunikations- / Koordinationsnachricht und nicht die eigentliche Datennutzlast. Die Datennutzlast wird nur bei einer positiven Übereinstimmung kopiert. Horn OK Please vor 9 Jahren 0
2

Bei den meisten Betriebssystemen ist es so

  1. Bitten Sie das Betriebssystem nur, alle Pakete auf der Schnittstelle von Host 224.0.26.1 und Port 12345 in den lokalen Puffer zu kopieren. . .

  2. Zeichnen Sie die Daten auf

obwohl das, was Wireshark und TShark tun, ist dumpcap (Teil von Wireshark) mit der Schnittstelle (en) ausführen, auf die und den Filter zu erfassen als Befehlszeilenargumente zu verwenden, und dumpcap fragt libpcap das Betriebssystem zu fragen (oder auf Windows, die WinPcap-Treiber), um alle Pakete, die mit dem Filter übereinstimmen, in den lokalen Puffer zu kopieren.

Bei einigen Betriebssystemen (z. B. Solaris vor Solaris 11, HP-UX und IRIX) kann das Betriebssystem die Filterung im Kernel nicht durchführen. Daher fordert libpcap das Betriebssystem dazu auf, ihm alle Pakete zur Verfügung zu stellen (libpcap) ) führt den Filter selbst aus und liefert nur Pakete, die dem Filter entsprechen, an seine caller - dumpcap, im Falle von Wireshark und TShark.

Es ist informativ zu wissen, dass bestimmte Betriebssysteme die Kernelfilterung nicht unterstützen. Ich * vermutete *, dass dies der Fall sein würde, aber ich hatte keine Beweise, um es zu unterstützen, also ließ ich es in meiner Antwort offen. Horn OK Please vor 9 Jahren 0