Full-duplex na Daloy at Backpressure sa Isang SOCKS Relay
Idisenyo ang daloy ng relay sa paligid ng mga malayang byte stream, partial I/O, limitadong buffer, at backpressure sa halip na hinulaang laki ng tugon.
Nagtagumpay ang SOCKS handshake. Ngayon ang relay ay nagbabasa mula sa kliyente, nagsusulat sa destinasyon, naghihintay ng buong tugon, at pagkatapos lamang ay muling nagbabasa mula sa kliyente. Maaaring i-deadlock ng sekwensiyang iyon ang isang ganap na valid na application.
Kapag naitatag na ang TCP tunnel, hindi tinutukoy ng SOCKS ang mga mensahe sa loob nito. Maaaring mauna ang destinasyon. Maaaring magpadala nang malaya ang magkabilang panig. Maaaring magpadala ang isang panig ng maikling record at pagkatapos ay maghintay sa sagot ng kabila.
Ipadala ang mga byte, hindi ang hinulaang transaksyon
Ang isang receive call ay nagbabalik ng mga available na byte ayon sa mga flag at estado ng socket nito. Hindi nito sinasabi sa isang generic na relay na kumpleto na ang tugon ng application. Ang paghihintay na mapuno ang isang arbitraryong malaking buffer ay maaaring pumigil sa pagpapadala ng maliit na mensahe na kailangan ng kapares upang magpatuloy.
Gamitin ang umiiral na concurrency model ng application upang pagsilbihan ang dalawang direksyon: isang event loop, asynchronous na I/O, o ibang sadyang piniling disenyo. Ang mahalagang pag-uugali ay ang pag-usad sa isang direksyon ay hindi nangangailangan ng kathang-isip na hangganan ng mensahe sa kabila.
Panatilihin ang dalawang limitadong naghihintay na buffer
Ang data na binasa mula sa kliyente ay maaaring naghihintay pa ring makarating sa destinasyon, habang ang data mula sa destinasyon ay naghihintay na makarating sa kliyente. Subaybayan ang mga naghihintay na byte na iyon nang hiwalay.
Ang isang send ay maaaring magsulat ng mas kaunting byte kaysa hiniling. Panatilihin ang hindi naisulat na bahagi; huwag itong itapon o i-replay ang buong buffer. Ang pansamantalang hindi maisusulat na socket ay dahilan upang maghintay sa tamang readiness event, hindi upang paikot-ikot nang tuluy-tuloy.
Limitahan ang mga buffer. Kung mabagal ang destinasyon, ang patuloy na pagbasa ng walang limitasyong data ng kliyente ay inililipat lamang ang pila sa memorya ng relay. Ang backpressure ay nangangahulugan ng pag-pause ng pagbasa kapag puno ang kaukulang naghihintay na buffer at pagpapatuloy kapag may nagawang espasyo ang mga pagsulat.
Ang pagtatapos sa isang direksyon ay nangangailangan ng patakaran
Maaaring isara ng TCP ang isang direksyon ng pagpapadala habang may kapaki-pakinabang na data pa ang kabilang direksyon. Magpasya kung paano ipalaganap ang kundisyong iyon pagkatapos maubos ang mga naka-buffer na byte, at ihiwalay ang maayos na pagsasara mula sa error o deadline.
Wala sa mga ito ang nangangailangan na i-decrypt o i-parse ng relay ang payload ng application. Kailangan nito ng tamang stream handling. Ang pagpapalaki lamang ng buffer ay hindi makakapag-ayos ng relay na naghihintay sa maling panig o nag-aakalang ang bawat pagbasa ay tumutugma sa isang buong kahilingan.