Lire huit octets, puis céder le tunnel SOCKS4
Évitez d'avaler le message d'accueil de la destination ou d'attendre des octets inexistants en analysant la frontière fixe de la réponse SOCKS4.
La demande de connexion SOCKS4 réussit, mais l'application ne voit jamais le message d'accueil initial du serveur. Un endroit à examiner est la première lecture du connecteur. Une lecture de seize octets est trop grande pour une réponse SOCKS4 de huit octets.
| Champ de la réponse | Octets |
|---|---|
| Champ de version de la réponse | 1 |
| Code de résultat | 1 |
| Champ de port | 2 |
| Champ d'adresse | 4 |
Le code de résultat 0x5a indique que la demande a été accordée. SOCKS4a change la façon dont la demande transporte un nom d'hôte ; il ne transforme pas la réponse en seize octets.
Après la réponse, le même flux TCP transporte le protocole de destination. Un serveur de messagerie peut envoyer son message d'accueil immédiatement. Une lecture qui consomme seize octets disponibles peut donc emporter la réponse complète du proxy plus les huit premiers octets de ce message. Si rien ne suit encore, une lecture bloquante trop grande peut au contraire ajouter une attente inutile.
La longueur exacte relève de la responsabilité de l'analyseur
Demander huit octets une seule fois ne prouve pas suffisamment que huit octets sont arrivés. Les lectures de flux peuvent en renvoyer moins. Collectez exactement la longueur de la réponse dans un délai imparti, arrêtez-vous sur un flux fermé ou en échec, inspectez la réponse et laissez les octets suivants à l'application.
Si le connecteur utilise une lecture tamponnée plus grande, conservez tout ce qui suit la frontière et transmettez-le au consommateur suivant. Jeter le surplus revient à la même perte de données avec une taille de lecture différente.
SOCKS5 a besoin de son propre analyseur. L'adresse de sa réponse peut avoir des longueurs différentes selon le type d'adresse. Remplacer chaque lecture de proxy par une lecture fixe de huit octets corrigerait un protocole tout en en cassant un autre.