Dvipusis srautas ir atgalinis slėgis SOCKS rele
Projektuokite relės srautą pagal nepriklausomus baitų srautus, dalinį I/O, ribotus buferius ir atgalinį slėgį, o ne pagal spėjamus atsakymų dydžius.
SOCKS rankos paspaudimas pavyko. Dabar relė skaito iš kliento, rašo į paskirties vietą, laukia viso atsakymo ir tik tada vėl skaito iš kliento. Tokia seka gali užblokuoti visiškai tinkamą programą.
Kai TCP tunelis jau nustatytas, SOCKS neapibrėžia jame esančių pranešimų. Paskirties vieta gali siųsti pirmoji. Abi pusės gali siųsti nepriklausomai. Viena pusė gali išsiųsti trumpą įrašą ir tada laukti kitos atsakymo.
Perduokite baitus, o ne spėliojamus sandorius
Priėmimo iškvietimas grąžina turimus baitus pagal vėliavėles ir lizdo būseną. Jis nepasako bendrai relei, kad programos atsakymas yra baigtas. Laukimas, kol prisipildys savavališkai didelis buferis, gali sutrukdyti persiųsti mažą pranešimą, kurio reikia kitai pusei, kad ji tęstų.
Naudokite esamą programos lygiagretumo modelį abiem kryptims aptarnauti: įvykių ciklą, asinchroninį I/O ar kitą sąmoningai pasirinktą dizainą. Svarbu tai, kad pažanga viena kryptimi nereikalauja išgalvotos pranešimo ribos kitoje.
Laikykite du ribotus laukiančius buferius
Duomenys, perskaityti iš kliento, gali vis dar laukti, kol pasieks paskirties vietą, o duomenys iš paskirties vietos laukia, kol pasieks klientą. Stebėkite tuos laukiančius baitus atskirai.
Siuntimas gali įrašyti mažiau baitų nei prašyta. Išsaugokite neįrašytą dalį; neišmeskite jos ir nekartokite viso buferio. Laikinai nerašomas lizdas yra priežastis laukti tinkamo pasirengimo įvykio, o ne nuolat suktis.
Apribokite buferius. Jei paskirties vieta lėta, neribotų kliento duomenų skaitymas tiesiog perkelia eilę į relės atmintį. Atgalinis slėgis reiškia skaitymo sustabdymą, kai atitinkamas laukiantis buferis pilnas, ir atnaujinimą, kai rašymai atlaisvina vietos.
Pabaiga viena kryptimi reikalauja taisyklės
TCP gali uždaryti siuntimo kryptį, kol kita kryptis dar turi naudingų duomenų. Nuspręskite, kaip perduoti tą būseną po to, kai buferiniai baitai išsisemia, ir atskirkite tvarkingą uždarymą nuo klaidos ar termino.
Niekas iš to nereikalauja, kad relė iššifruotų ar analizuotų programos naudingąją apkrovą. Jai reikia teisingo srauto apdorojimo. Vien buferio dydžio padidinimas negali pataisyti relės, kuri laukia ne tos pusės arba mano, kad kiekvienas skaitymas atitinka vieną visą užklausą.