2016-07-25 14 views
1

Ich analysiere eine Datei mit vielen TCP-Pakete, die ich analysieren muss. Das Problem ist, dass sie segmentiert werden und ich keine Hinweise finde, wann und wo sie dies tun. Keine Flags oder irgendetwas anderes zeigt an, dass die Mitte des aktuellen Pakets den Beginn des nächsten enthalten kann. Das Protokoll über TCP ist FIX (im Online-Handel), aber ich möchte für meinen Code in der Lage sein, mit beliebigen Protokollen zu arbeiten (oder zumindest zu verstehen, welches Protokoll es ist). Ich schreibe Code in C++ und kann keine zusätzlichen Bibliotheken verwenden. Also, wie finde ich heraus, was ist das Protokoll über TCP und wo es segmentiert wird?Reassembly von TCP-Paket

+1

Um TCP-Streams wieder zusammenzusetzen, müssen Sie zuerst lernen, wie Sie IP-Fragmente wieder zusammensetzen. Siehe RFC 815. – Alnitak

+0

Unklar, was Sie fragen. Wie wurden diese Daten erfasst? – EJP

+0

@Alnitak Ich bezweifle, dass er hier Rohdaten erfasst. RFC 815 ist das, was in einem Netzwerkstack passiert, nicht außerhalb auf der Benutzerebene. –

Antwort

3

Sie können nicht. TCP/IP ist konzeptionell ein Stream, keine Folge von Nachrichten (die Tatsache, dass sie letztendlich als eine Sequenz von Paketen implementiert wird, ist irrelevant). Wenn Sie eine Sequenz von Bytes in einen TCP/IP-Stream schreiben, wird diese Sequenz dem Stream hinzugefügt. es wird nicht als eine Botschaft behandelt, die ihre eigene Identität behalten sollte. Unabhängig davon, ob Sie dies in Ihrem eigenen Protokoll tun, wird keine Nachricht über den Beginn/das Ende der Nachricht gesendet. Wenn Sie das kaum glauben, sollten Sie sich überlegen, wie es bei Dateien funktioniert: Wenn Sie eine Sequenz von Bytes in eine Datei schreiben, wird diese Sequenz nicht irgendwie zu einem Datensatz, den Sie später identifizieren und abrufen können. Wenn Sie diese Art von Struktur möchten, müssen Sie sie selbst hinzufügen. Das gleiche gilt für TCP/IP.

Die Transportpakete, die zur Implementierung von TCP/IP verwendet werden, haben keine Beziehung zu den Datenblöcken, die Sie mit Ihren API-Aufrufen angeben. Sie sind lediglich eine Möglichkeit, den TCP/IP-Stream zu implementieren. Für einige Anwendungsfälle mag eine Zuordnung erscheinen, aber das ist zufällig.

Die einzige Möglichkeit, einen TCP/IP-Stream in separate Nachrichten aufzuteilen, besteht darin, das Protokoll über TCP/IP zu verwenden. In Ihrem Fall ist dies FIX. Ich nehme an, Sie wissen, wie das funktioniert. Sie können dieses Wissen verwenden, um die FIX-Daten korrekt in ihre ursprünglichen Nachrichten aufzuteilen. Ein generischer TCP/IP-Nachrichtensplitter kann nicht erstellt werden.

+0

s/Pakete/Nachricht/g, bitte - Pakete sind, was über die Leitung in Schicht 2 und Schicht 3 Protokolle gehen: Protokollnachrichten -> TCP-Stream -> TCP-Segmente -> IP-Pakete -> Ethernet-Pakete – Alnitak

+0

Ich habe Paket geändert zu Nachricht, wo es angebracht ist, aber da die ursprüngliche Frage bereits nach Paketen gefragt wurde, bin ich nicht sicher, dass es dadurch klarer geworden ist. –

+0

danke für eine ausführliche Antwort –

-2

Wie ich sehe, ist Ihr Problem, TCP-Pakete zu trennen. Um es zu lösen, können Sie die Länge der Nutzlast (this answer) und die Prüfsumme weiterleiten. Wenn die Prüfsumme für Daten mit der angegebenen Länge korrekt ist, dann ist Ihr Paket korrekt, wenn nein - Sie müssen im vorherigen Teil nach dem Start des Pakets suchen oder diesen Teil der Daten löschen. Zumindest wird dieser Ansatz Ihnen helfen, einen Punkt zu finden, an dem Dada segmentiert wurde.

Für eine genauere Antwort wird es besser sein, einen kleinen Teil der Daten zu sehen.

Aber Ihr Hauptproblem ist die Segmentierung von Paketen. Für eine bessere Leistung sollten Sie versuchen, dieses Problem auszuschließen (vielleicht Netzwerkkarte zu Intel ändern).

+0

Willkommen bei Stack Overflow! Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren und wenn du einmal [verdienen] (http: //meta.stackoverflow.com/q/146472/169503) ausreichend [Reputation] (http://stackoverflow.com/help/whats-reputation) Sie können [comment] (http://stackoverflow.com/help/privileges/comment) auf jedem Post. Wenn Sie eine verwandte, aber andere Frage haben, [stellen Sie eine neue Frage] (http://stackoverflow.com/questions/ask), die auf diese verweist, wenn es helfen wird, Kontext zur Verfügung zu stellen. – ddb

+1

Die Segmentierung ist Teil des TCP/IP-Protokolls und hat mit der Marke der betreffenden Netzwerkkarte nichts zu tun. –