Plný duplexný tok a spätný tlak v relé SOCKS
Navrhnite tok relé okolo nezávislých bajtových tokov, čiastočného I/O, obmedzených vyrovnávacích pamätí a spätného tlaku namiesto odhadovaných veľkostí odpovede.
Podsanie ruky SOCKS prebehlo úspešne. Teraz relé číta od klienta, zapisuje do cieľa, čaká na úplnú odpoveď a až potom znova číta od klienta. Taká postupnosť môže zablokovať úplne platnú aplikáciu.
Keď je tunel TCP vytvorený, SOCKS nedefinuje správy v jeho vnútri. Cieľ môže poslať prvý. Obe strany môžu posielať nezávisle. Jedna strana môže poslať krátky záznam a potom čakať na odpoveď druhej.
Preposielajte bajty, nie odhadované transakcie
Volanie prijatia vráti dostupné bajty podľa príznakov a stavu socketu. Nehovorí všeobecnému relé, že odpoveď aplikácie je úplná. Čakanie na naplnenie ľubovoľne veľkej vyrovnávacej pamäte môže zabrániť preposlaniu malej správy, ktorú partner potrebuje na pokračovanie.
Použite existujúci model súbežnosti aplikácie na obsluhu oboch smerov: slučku udalostí, asynchrónne I/O alebo iný zámerne zvolený dizajn. Dôležité správanie je, že pokrok v jednom smere nevyžaduje vymyslenú hranicu správy v druhom.
Uchovávajte dve obmedzené čakajúce vyrovnávacie pamäte
Údaje načítané od klienta môžu stále čakať na doručenie do cieľa, zatiaľ čo údaje z cieľa čakajú na doručenie klientovi. Sledujte tie čakajúce bajty oddelene.
Odoslanie môže zapísať menej bajtov, než sa požadovalo. Ponechajte nezapísanú časť; nezahadzujte ju ani neprehrávajte celú vyrovnávaciu pamäť znova. Dočasne nezapisovateľný socket je dôvod čakať na správnu udalosť pripravenosti, nie neustále sa točiť.
Obmedzte vyrovnávacie pamäte. Ak je cieľ pomalý, pokračovanie v čítaní neobmedzených údajov klienta jednoducho presúva front do pamäte relé. Spätný tlak znamená pozastavenie čítania, keď je príslušná čakajúca vyrovnávacia pamäť plná, a obnovenie, keď zápisy uvoľnia miesto.
Ukončenie v jednom smere vyžaduje politiku
TCP môže zatvoriť smer odosielania, zatiaľ čo druhý smer má ešte užitočné údaje. Rozhodnite, ako šíriť tento stav po vyčerpaní vyrovnaných bajtov, a odlíšte riadne zatvorenie od chyby alebo termínu.
Nič z toho nevyžaduje, aby relé dešifrovalo alebo analyzovalo užitočné zaťaženie aplikácie. Potrebuje správne spracovanie toku. Samotné zväčšenie vyrovnávacej pamäte nedokáže opraviť relé, ktoré čaká na nesprávnu stranu alebo predpokladá, že každé čítanie zodpovedá jednej celej požiadavke.