SOCKS-håndtrykket var vellykket. Nå leser reléet fra klienten, skriver til destinasjonen, venter på et fullstendig svar og leser først etterpå fra klienten igjen. Denne sekvensen kan låse en fullstendig gyldig applikasjon.

Når TCP-tunnelen er etablert, definerer ikke SOCKS meldingene inne i den. Destinasjonen kan sende først. Begge sider kan sende uavhengig av hverandre. Den ene siden kan sende en kort post og deretter vente på den andres svar.

Videresend bytes, ikke gjettede transaksjoner

Et mottakskall returnerer tilgjengelige bytes avhengig av flaggene og socket-tilstanden. Det forteller ikke et generelt relé at et applikasjonssvar er fullstendig. Å vente på at en vilkårlig stor buffer skal fylles kan hindre videresending av den lille meldingen motparten trenger for å komme videre.

Benytt applikasjonens eksisterende samtidighetsmodell for å betjene begge retninger: en hendelsesløkke, asynkron I/O eller en annen bevisst valgt utforming. Den viktige egenskapen er at fremdrift i én retning ikke krever en oppfunnet meldingsgrense i den andre.

Hold to avgrensede ventende buffere

Data som er lest fra klienten, kan fortsatt vente på å nå destinasjonen, mens data fra destinasjonen venter på å nå klienten. Følg disse ventende bytene hver for seg.

En sending kan skrive færre bytes enn det som ble bedt om. Ta vare på den uskrevne delen; ikke forkast den eller spill av hele bufferen på nytt. En midlertidig uskrivbar socket er grunn til å vente på riktig beredskapshendelse, ikke til å spinne kontinuerlig.

Avgrens bufferne. Hvis destinasjonen er treg, flytter det å fortsette å lese ubegrensede klientdata bare køen inn i reléets minne. Mottrykk betyr å stanse lesingen når den tilsvarende ventende bufferen er full, og gjenoppta når skriving gjør plass.

En avslutning i én retning krever en policy

TCP kan lukke en senderetning mens den andre retningen fortsatt har nyttige data. Avgjør hvordan den tilstanden skal forplantes etter at bufrede bytes er tømt, og skill ordnet lukking fra en feil eller frist.

Ingenting av dette krever at reléet dekrypterer eller parser applikasjonens nyttelast. Det trenger korrekt strømhåndtering. Å øke bufferstørrelsen alene kan ikke reparere et relé som venter på feil side eller antar at hver lesing tilsvarer én hel forespørsel.

Relaterte artikler