Handshake-ul SOCKS a reușit. Acum releul citește de la client, scrie către destinație, așteaptă un răspuns complet și abia apoi citește din nou de la client. Această secvență poate bloca o aplicație perfect validă.

Odată ce tunelul TCP este stabilit, SOCKS nu definește mesajele din interiorul lui. Destinația poate trimite prima. Ambele părți pot trimite independent. O parte poate trimite o înregistrare scurtă și apoi poate aștepta răspunsul celeilalte.

Retransmiteți octeți, nu tranzacții ghicite

Un apel de recepție returnează octeții disponibili în funcție de fanioanele și starea socketului. Nu îi spune unui releu generic că răspunsul aplicației este complet. Așteptarea umplerii unui tampon arbitrar de mare poate împiedica transmiterea mesajului mic de care partenerul are nevoie pentru a continua.

Folosiți modelul de concurență existent al aplicației pentru a deservi ambele direcții: o buclă de evenimente, I/O asincron sau alt design ales deliberat. Comportamentul important este că progresul într-o direcție nu necesită o graniță de mesaj inventată în cealaltă.

Păstrați două tampoane în așteptare limitate

Datele citite de la client pot încă aștepta să ajungă la destinație, în timp ce datele de la destinație așteaptă să ajungă la client. Urmăriți separat acei octeți în așteptare.

O trimitere poate scrie mai puțini octeți decât s-a cerut. Păstrați porțiunea nescrisă; nu o aruncați și nu redați din nou întregul tampon. Un socket temporar necrescător este un motiv să așteptați evenimentul de disponibilitate corect, nu să vă învârtiți continuu.

Limitați tampoanele. Dacă destinația este lentă, a continua să citiți date nelimitate de la client mută pur și simplu coada în memoria releului. Backpressure înseamnă să opriți citirile când tamponul în așteptare corespunzător este plin și să le reluați când scrierile fac loc.

Un sfârșit într-o direcție necesită o politică

TCP poate închide o direcție de trimitere în timp ce cealaltă direcție mai are date utile. Decideți cum să propagați această condiție după ce octeții tamponați se golesc și distingeți închiderea ordonată de o eroare sau un termen limită.

Nimic din toate acestea nu cere releului să decripteze sau să analizeze payload-ul aplicației. Are nevoie de gestionarea corectă a fluxului. Doar mărirea dimensiunii tamponului nu poate repara un releu care așteaptă partea greșită sau presupune că fiecare citire corespunde unei cereri întregi.

Articole similare