Full-duplex flyt og mottrykk i et SOCKS-relé
Design reléflyten rundt uavhengige bytestrømmer, delvis I/O, begrensede buffere og mottrykk i stedet for gjettede responsstørrelser.
SOCKS-håndtrykket lyktes. Nå leser reléet fra klienten, skriver til målet, venter på et fullstendig svar og leser først deretter fra klienten igjen. Den sekvensen kan låse en helt gyldig applikasjon.
Når TCP-tunnelen er etablert, definerer ikke SOCKS meldingene inne i den. Målet kan sende først. Begge sider kan sende uavhengig. Én side kan sende en kort post og deretter vente på den andres svar.
Videresend bytes, ikke gjettede transaksjoner
Et mottakskall returnerer tilgjengelige bytes i henhold til flaggene og socket-tilstanden. Det forteller ikke et generelt relé at et applikasjonssvar er komplett. Å vente på at en vilkårlig stor buffer skal fylles kan hindre videresending av den lille meldingen motparten trenger for å fortsette.
Bruk applikasjonens eksisterende samtidighetsmodell til å betjene begge retninger: en hendelsesløkke, asynkron I/O eller en annen bevisst valgt design. Den viktige oppførselen er at fremgang i én retning ikke krever en oppfunnet meldingsgrense i den andre.
Hold to begrensede ventende buffere
Data lest fra klienten kan fortsatt vente på å nå målet, mens data fra målet venter på å nå klienten. Spor disse ventende bytene separat.
En sending kan skrive færre bytes enn forespurt. Behold den uskrevne delen; ikke slipp den eller spill av hele bufferen på nytt. En midlertidig uskrivbar socket er en grunn til å vente på riktig beredskapshendelse, ikke å spinne kontinuerlig.
Begrens bufferne. Hvis målet er tregt, flytter det å fortsette å lese ubegrensede klientdata bare køen inn i reléets minne. Mottrykk betyr å pause lesingen når den tilsvarende ventende bufferen er full og gjenoppta når skriving frigjør plass.
En slutt i én retning krever en policy
TCP kan lukke en senderetning mens den andre retningen fortsatt har nyttige data. Bestem 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.