Supposons qu’une réponse HTTP apparaisse dans plusieurs segments TCP capturés après avoir traversé Squid. Cela peut être un comportement TCP ordinaire, et non la preuve que la réponse a été découpée incorrectement.

Un proxy direct possède normalement deux connexions :

client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin

Chaque connexion a son propre état TCP, ses numéros de séquence et sa paquétisation. Le proxy peut lire des données sur une connexion et les écrire sur l’autre sans conserver les tailles de segment d’origine. La mise en tampon, le moment d’envoi, la congestion et les limites de taille du chemin peuvent produire un autre regroupement.

Trois frontières à ne pas confondre

FrontièreCe qui la détermine
Segment TCPLe chemin de transport et de réseau
Résultat d’une lecture de socketLes octets disponibles du flux et le tampon de l’appelant
Message ou trame HTTPLes règles de cadrage du protocole HTTP

Une seule lecture peut contenir une partie d’en-tête, un en-tête entier suivi d’octets de corps, ou des données franchissant plus d’une frontière applicative. TCP ne rattache pas « fin de la réponse HTTP » à la fin d’une lecture réussie.

Un analyseur HTTP/1.1 accumule donc les en-têtes et applique les règles de cadrage du corps applicables, notamment la longueur, le codage de transfert ou la fermeture de connexion autorisée. Une trame HTTP/2 est une structure de protocole qui peut elle-même franchir des segments TCP ; ce n’est pas un autre nom pour un paquet réseau.

Un tunnel CONNECT réussi conserve le flux d’octets tunnellisé tout en utilisant encore deux segments TCP. Ses frontières de segment peuvent différer même lorsque le proxy n’a pas modifié les octets à l’intérieur du tunnel.

Lorsque vous enquêtez sur une corruption, comparez les données applicatives réassemblées. Comparer des nombres de paquets ou attendre des longueurs identiques des deux côtés demande à TCP une garantie de frontières qu’il n’offre pas.

Articles similaires