2010-06-02 13 views
5

Wie identifizieren Sie fehlende UDP-Frames in einem benutzerdefinierten Wireshark-Dissector?Wireshark Dissector: Identifizieren fehlender UDP-Frames?

Ich habe einen benutzerdefinierten Dissektor für die CQS feed (reference page) geschrieben. Einer unserer Server lüftet beim Empfang dieses Feeds. Laut Wireshark werden einige UDP-Frames niemals empfangen. Ich weiß, dass die Frames gesendet wurden, weil alle unsere anderen Server lückenlos sind.

Ein CQS-Frame besteht aus mehreren Nachrichten, die jeweils eine eigene Sequenznummer haben. Meine benutzerdefinierte Dissektor bietet die folgenden Daten zu Wireshark:

cqs.frame_gaps   - the number of gaps within a UDP frame (always zero) 
cqs.frame_first_seq  - the first sequence number in a UDP frame 
cqs.frame_expected_seq - the first sequence number expected in the next UDP frame 
cqs.frame_msg_count  - the number of messages in this UDP frame 

Und ich bin jeden dieser Werte in benutzerdefinierten Spalten angezeigt wird, wie in diesem Screenshot gezeigt: wireshark screenshot http://img692.imageshack.us/img692/9484/wiresharkcqs.jpg

Ich habe versucht, den Code zu meinem Dissektor hinzufügen, die einfach spart die zuletzt verarbeitete Sequenznummer (als lokale statische) und kennzeichnet Lücken, wenn der Dissektor ein Frame verarbeitet, in dem current_sequence != (previous_sequence + 1). Dies hat nicht funktioniert, da der Dissektor in zufälliger Reihenfolge aufgerufen werden kann, je nachdem, wo Sie in der GUI klicken. So könnten Sie Frame 10, dann Frame 15, Frame 11 usw. bearbeiten.

Gibt es irgendeine Möglichkeit für meinen Dissektor, zu wissen, ob der Rahmen, der davor (oder den folgenden Rahmen) kam, fehlt?

Dissektor wird in C.

geschrieben (siehe auch companion post on serverfault.com)

Antwort

4

Sie sollten bedenken, dass Wireshark Dissektion mehrmals der Fall ist. Das erste Mal seziert er Pakete in der richtigen Reihenfolge, wenn Sie die Datei laden. Dann ruft es Dissektoren auf, wenn Sie in packet_tree_view blättern oder ein Paket auswählen, um seine Struktur zu erstellen.

können Sie überprüfen, ob ein Dissektor fot ther ersten Mal aufgerufen wird:

if (PINFO_IS_VISITED(pinfo)) { ... }; 

Ihre Dissektor anders für die erste und für die nächsten Dissektionen verhalten soll.

Bei der ersten Dissektion müssen Sie einige Informationen für jedes Paket (in einer Hash-Tabelle zum Beispiel) speichern, da es die Sequenznummer ist und wenn es nicht in Ordnung ist. Sie werden benötigt, um den Paketbaum ordnungsgemäß zu erstellen, wenn Sie zum zweiten Mal aufgerufen werden.

+0

Ich habe das seit langer Zeit nicht berührt, aber ich vermute, dass dies die Antwort ist. Ich habe nicht bemerkt, dass Pakete zweimal seziert wurden. –

0

ich konw nicht, wenn Sie in vorherigen oder folgenden Frames spähen kann, aber wenn ein tcpdump Wireshark wird geladen wird es nennen Ihr Dissektor auf jedem der Frames in Reihenfolge. So könnte ich eine statische lokale Variable hinzufügen, die eine Array- oder Hash-Tabelle ist und einfach Ihre Werte darin speichern. Dann kann Ihr Dissektor dieses Array für vorherige und folgende Frames überprüfen und seine Analyse durchführen.

Sie an diesem pinfo vairable aussehen sollte, ist, dass eine der Funktionsargumente für Informationen über die Rahmennummer, IP-Informationen usw.