SOCKS-handskakningen lyckades. Nu läser reläet från klienten, skriver till målet, väntar på ett fullständigt svar och läser först därefter från klienten igen. Den sekvensen kan låsa en helt giltig applikation.

När TCP-tunneln är upprättad definierar SOCKS inte meddelandena inuti den. Målet kan skicka först. Båda sidor kan skicka oberoende. En sida kan skicka en kort post och sedan vänta på den andras svar.

Vidarebefordra byte, inte gissade transaktioner

Ett mottagningsanrop returnerar tillgängliga byte enligt dess flaggor och socketens tillstånd. Det talar inte om för en generell relä att ett applikationssvar är komplett. Att vänta på att en godtyckligt stor buffert ska fyllas kan hindra vidarebefordran av det lilla meddelande som motparten behöver för att fortsätta.

Använd applikationens befintliga samtidighetsmodell för att betjäna båda riktningarna: en händelseloop, asynkron I/O eller en annan medvetet vald design. Det viktiga beteendet är att framsteg i en riktning inte kräver en påhittad meddelandegräns i den andra.

Håll två begränsade väntande buffertar

Data som lästs från klienten kan fortfarande vänta på att nå målet, medan data från målet väntar på att nå klienten. Spåra dessa väntande byte separat.

En sändning kan skriva färre byte än begärt. Behåll den oskrivna delen; kasta inte bort den och spela inte upp hela bufferten igen. En tillfälligt oskrivbar socket är en anledning att vänta på rätt beredskapshändelse, inte att snurra kontinuerligt.

Begränsa buffertarna. Om målet är långsamt flyttar fortsatt läsning av obegränsade klientdata bara kön in i reläets minne. Mottryck innebär att pausa läsningen när motsvarande väntande buffert är full och återuppta när skrivningar frigör utrymme.

Ett slut i en riktning kräver en policy

TCP kan stänga en sändningsriktning medan den andra riktningen fortfarande har användbara data. Bestäm hur det tillståndet ska fortplantas efter att buffrade byte tömts, och skilj på ordnad stängning och ett fel eller en tidsfrist.

Inget av detta kräver att reläet dekrypterar eller tolkar applikationens nyttolast. Det behöver korrekt strömhantering. Att bara öka buffertstorleken kan inte reparera en relä som väntar på fel sida eller antar att varje läsning motsvarar en hel förfrågan.

Relaterade artiklar