Pilna dupleksa plūsma un pretspiediens SOCKS starpniekā
Veidojiet starpnieka plūsmu, balstoties uz neatkarīgām baitu plūsmām, daļēju I/O, ierobežotiem buferiem un pretspiedienu, nevis minētiem atbildes izmēriem.
SOCKS rokasspiediens izdevās. Tagad starpnieks nolasa no klienta, raksta uz galamērķi, gaida pilnu atbildi un tikai tad atkal nolasa no klienta. Šāda secība var bloķēt pilnīgi derīgu lietojumprogrammu.
Kad TCP tunelis ir izveidots, SOCKS nenosaka tajā esošos ziņojumus. Galamērķis var sūtīt pirmais. Abas puses var sūtīt neatkarīgi. Viena puse var nosūtīt īsu ierakstu un pēc tam gaidīt otras atbildi.
Pārsūtiet baitus, nevis minētus darījumus
Saņemšanas izsaukums atgriež pieejamos baitus atbilstoši karodziņiem un ligzdas stāvoklim. Tas nepasaka vispārējam starpniekam, ka lietojumprogrammas atbilde ir pabeigta. Gaidīšana, līdz piepildās patvaļīgi liels buferis, var liegt pārsūtīt mazo ziņojumu, kas otram galam nepieciešams, lai turpinātu.
Izmantojiet lietojumprogrammas esošo vienlaicības modeli abu virzienu apkalpošanai: notikumu cilpu, asinhrono I/O vai citu apzināti izvēlētu dizainu. Svarīgi, lai progress vienā virzienā neprasītu izdomātu ziņojuma robežu otrā.
Turiet divus ierobežotus gaidošus buferus
No klienta nolasītie dati var joprojām gaidīt, lai sasniegtu galamērķi, kamēr dati no galamērķa gaida, lai sasniegtu klientu. Sekojiet šiem gaidošajiem baitiem atsevišķi.
Sūtīšana var ierakstīt mazāk baitu, nekā pieprasīts. Saglabājiet neierakstīto daļu; neizmetiet to un neatkārtojiet visu buferi. Īslaicīgi nerakstāma ligzda ir iemesls gaidīt pareizo gatavības notikumu, nevis nepārtraukti griezties.
Ierobežojiet buferus. Ja galamērķis ir lēns, neierobežotu klienta datu lasīšana vienkārši pārvieto rindu starpnieka atmiņā. Pretspiediens nozīmē lasīšanas apturēšanu, kad atbilstošais gaidošais buferis ir pilns, un atsākšanu, kad rakstīšana atbrīvo vietu.
Beigas vienā virzienā prasa politiku
TCP var aizvērt sūtīšanas virzienu, kamēr otram virzienam joprojām ir derīgi dati. Izlemiet, kā pārsūtīt šo stāvokli pēc buferēto baitu iztukšošanas, un atšķiriet sakārtotu aizvēršanu no kļūdas vai termiņa.
Neviens no tā neprasa, lai starpnieks atšifrētu vai parsētu lietojumprogrammas datu saturu. Tam nepieciešama pareiza plūsmas apstrāde. Bufera izmēra palielināšana vien nevar salabot starpnieku, kas gaida nepareizo pusi vai pieņem, ka katra lasīšana atbilst vienam veselam pieprasījumam.