2016-06-15 6 views
1

Ich schreibe eine Anwendung, die Zugriff auf TCP-Header-Felder benötigen, z. B. eine Sequenznummer oder ein TCP-Timestamp-Feld.Zugriff auf TCP-Header-Felder (ohne Raw-Socket-API)

Ist es möglich, Sequenznummern (oder andere Header-Felder) zu erhalten, indem Sie an der Socket-API arbeiten, ohne auf einen Raw-Socket zu hören? (Ich möchte vermeiden, alle Pakete herauszufiltern).

Ich schaue auf die TCP_INFO, aber es hat eine begrenzte Information.

Zum Beispiel, nach dem Aufrufen eines Recvmsg() und Abrufen eines Datenpuffers, ist es möglich, die Sequenznummer des Segments zu kennen, das das letzte Byte in diesem empfangenen Datenpuffer lieferte?

Danke

Antwort

2

Sie können versuchen, libpcap zu verwenden, um Pakete zu erfassen. Diese Bibliothek ermöglicht die Angabe von Paketfiltern mit derselben Syntax wie in Wireshark, sodass Sie erfasste Pakete auf nur eine Verbindung beschränken können. Ein Nachteil ist, dass Sie Pakete auch auf normale Weise empfangen müssen, was die Dinge ein bisschen kompliziert macht und einen zusätzlichen Leistungs-Overhead darstellt.

Update: Sie können auch Raw Socket öffnen und Berkeley Packet Filter mit der Socket-Option darauf setzen. Weitere Details finden Sie hier: https://www.kernel.org/doc/Documentation/networking/filter.txt. Allerdings müssten Sie TCP-Teil des IP-Stacks auch in Ihrem Code implementieren.