Accès aux champs d’en-tête TCP (sans API de socket brut)

J’écris une application qui doit accéder aux champs d’en-tête TCP, par exemple un numéro de séquence ou un champ d’horodatage TCP.

Est-il possible d’obtenir des numéros de séquence (ou d’autres champs d’en-tête) en opérant sur l’API de socket sans écouter sur un socket brut? (Je veux éviter de filtrer tous les paquets).

Je regarde le TCP_INFO mais il a une information limitée.

Par exemple, après avoir appelé recvmsg () et obtenu un tampon de données, est-il possible de connaître le numéro de séquence du segment qui a livré le dernier octet dans ce tampon de données reçu?

Merci

Vous pouvez essayer d’utiliser libpcap pour capturer des paquets. Cette bibliothèque permet de spécifier un filtre de paquets en utilisant la même syntaxe que dans Wireshark. Vous pouvez donc limiter les paquets capturés à une seule connexion. Un inconvénient est que vous devez recevoir des paquets de manière normale également, ce qui complique un peu les choses et constitue une surcharge de performances supplémentaire.

Mise à jour: vous pouvez également ouvrir le socket brut et y définir le filtre de paquets Berkeley à l’aide de l’option de socket SO_ATTACH_FILTER . Plus de détails sont ici: https://www.kernel.org/doc/Documentation/networking/filter.txt . Cependant, vous devrez également implémenter la partie TCP de la stack IP dans votre code.