Punodupleksni tok i povratni pritisak u SOCKS releju
Dizajnirajte tok releja oko nezavisnih bajtovskih tokova, djelimičnog I/O, ograničenih bafera i povratnog pritiska umjesto pretpostavljenih veličina odgovora.
SOCKS rukovanje je uspjelo. Sada relej čita od klijenta, piše na odredište, čeka potpun odgovor i tek onda ponovo čita od klijenta. Taj slijed može zaključati potpuno ispravnu aplikaciju.
Nakon uspostavljanja TCP tunela, SOCKS ne definira poruke unutar njega. Odredište može poslati prvo. Obje strane mogu slati nezavisno. Jedna strana može poslati kratak zapis i zatim čekati odgovor druge.
Prenosite bajtove, ne pretpostavljene transakcije
Poziv prijema vraća dostupne bajtove prema svojim zastavicama i stanju soketa. On ne govori općem releju da je odgovor aplikacije potpun. Čekanje da se proizvoljno velik bafer napuni može spriječiti prosljeđivanje male poruke koja je partneru potrebna za nastavak.
Koristite postojeći model konkurentnosti aplikacije za opsluživanje oba smjera: petlju događaja, asinhroni I/O ili drugi namjerno odabran dizajn. Važno ponašanje je da napredak u jednom smjeru ne zahtijeva izmišljenu granicu poruke u drugom.
Držite dva ograničena bafa na čekanju
Podaci pročitani od klijenta mogu još čekati da stignu do odredišta, dok podaci s odredišta čekaju da stignu do klijenta. Pratite te bajtove na čekanju odvojeno.
Slanje može zapisati manje bajtova od zatraženog. Zadržite nezapisani dio; ne odbacujte ga i ne reprodukujte cijeli bafer. Privremeno nezapisiv soket razlog je za čekanje ispravnog događaja spremnosti, a ne za neprestano vrtnje.
Ograničite bafere. Ako je odredište sporo, nastavak čitanja neograničenih klijentskih podataka samo premješta red u memoriju releja. Povratni pritisak znači pauziranje čitanja kada je odgovarajući bafer pun i nastavljanje kada pisanje oslobodi prostor.
Kraj u jednom smjeru zahtijeva politiku
TCP može zatvoriti smjer slanja dok drugi smjer još ima korisne podatke. Odlučite kako prenijeti to stanje nakon što se baferirani bajtovi isprazne, i razlikujte uredno zatvaranje od greške ili roka.
Ništa od ovoga ne zahtijeva da relej dešifrira ili raščlanjuje korisni teret aplikacije. Potrebno mu je ispravno rukovanje tokom. Povećanje samo veličine bafera ne može popraviti relej koji čeka pogrešnu stranu ili pretpostavlja da svako čitanje odgovara jednom cijelom zahtjevu.