L'apretada de mans SOCKS ha anat bé. Ara el relé llegeix del client, escriu a la destinació, espera una resposta completa i només després torna a llegir del client. Aquesta seqüència pot bloquejar una aplicació perfectament vàlida.

Un cop establert el túnel TCP, SOCKS no defineix els missatges que hi ha a dins. La destinació pot enviar primer. Els dos costats poden enviar independentment. Un costat pot enviar un registre curt i després esperar la resposta de l'altre.

Retransmeteu bytes, no transaccions suposades

Una crida de recepció retorna els bytes disponibles segons els seus indicadors i l'estat del sòcol. No diu a un relé genèric que la resposta de l'aplicació és completa. Esperar que s'ompli un buffer gran arbitrari pot impedir reenviar el missatge petit que el parell necessita per continuar.

Utilitzeu el model de concurrència existent de l'aplicació per atendre les dues direccions: un bucle d'esdeveniments, E/S asíncrona o un altre disseny triat deliberadament. El comportament important és que el progrés en una direcció no requereixi una frontera de missatge inventada en l'altra.

Mantingueu dos buffers pendents limitats

Les dades llegides del client poden estar encara esperant arribar a la destinació, mentre que les dades de la destinació esperen arribar al client. Seguiu aquests bytes pendents per separat.

Un enviament pot escriure menys bytes dels sol·licitats. Conserveu la part no escrita; no la descarteu ni reproduïu tot el buffer. Un sòcol temporalment no escribible és motiu per esperar l'esdeveniment de disponibilitat correcte, no per girar contínuament.

Limiteu els buffers. Si la destinació és lenta, continuar llegint dades de client il·limitades només mou la cua a la memòria del relé. La contrapressió significa aturar les lectures quan el buffer pendent corresponent és ple i reprendre-les quan les escriptures fan lloc.

Un final en una direcció necessita una política

TCP pot tancar una direcció d'enviament mentre l'altra direcció encara té dades útils. Decidiu com propagar aquesta condició després d'esgotar els bytes emmagatzemats, i distingiu el tancament ordenat d'un error o d'una data límit.

Res d'això no requereix que el relé desxifri o analitzi la càrrega útil de l'aplicació. Necessita un maneig correcte del flux. Augmentar només la mida del buffer no pot reparar un relé que espera el costat equivocat o suposa que cada lectura correspon a una sol·licitud sencera.

Articles relacionats