SOCKS-håndtrykket lykkedes. Nu læser relæet fra klienten, skriver til destinationen, venter på et fuldt svar og læser først derefter fra klienten igen. Den sekvens kan låse en helt gyldig applikation fast.

Når TCP-tunnelen er etableret, definerer SOCKS ikke meddelelserne indeni. Destinationen kan sende først. Begge sider kan sende uafhængigt. Den ene side kan sende en kort post og derefter vente på den andens svar.

Videresend bytes, ikke gættede transaktioner

Et modtagelseskald returnerer de tilgængelige bytes efter sine flag og socketens tilstand. Det fortæller ikke et generisk relæ, at applikationens svar er komplet. At vente på, at en vilkårligt stor buffer fyldes, kan forhindre videresendelse af den lille meddelelse, som modparten har brug for at fortsætte.

Brug applikationens eksisterende samtidighedsmodel til at betjene begge retninger: en hændelsesløkke, asynkron I/O eller et andet bevidst valgt design. Den vigtige adfærd er, at fremgang i én retning ikke kræver en opdigtet meddelelsesgrænse i den anden.

Hold to begrænsede ventende buffere

Data læst fra klienten venter måske stadig på at nå destinationen, mens data fra destinationen venter på at nå klienten. Følg de ventende bytes separat.

En afsendelse kan skrive færre bytes end anmodet. Behold den uskrevne del; smid den ikke væk, og genafspil ikke hele bufferen. En midlertidigt uskrivbar socket er grund til at vente på den korrekte parathedshændelse, ikke til at snurre konstant.

Begræns bufferne. Hvis destinationen er langsom, flytter fortsat læsning af ubegrænsede klientdata blot køen ind i relæets hukommelse. Mottryk betyder at pause læsninger, når den tilsvarende ventende buffer er fuld, og genoptage, når skrivninger giver plads.

En afslutning i én retning kræver en politik

TCP kan lukke en sendretning, mens den anden retning stadig har nyttige data. Beslut hvordan den tilstand videreformidles, efter at de buffrede bytes er tømt, og skel mellem ordentlig lukning og en fejl eller frist.

Intet af dette kræver, at relæet dekrypterer eller parser applikationens nyttelast. Det kræver korrekt strømhåndtering. At øge bufferstørrelsen alene kan ikke reparere et relæ, der venter på den forkerte side eller antager, at hver læsning svarer til én hel anmodning.

Relaterede artikler