Dorështrëngimi SOCKS përfundoi me sukses. Tani relay lexon nga klienti, shkruan te destinacioni, pret një përgjigje të plotë dhe vetëm pastaj lexon përsëri nga klienti. Kjo sekuencë mund të bllokojë një aplikacion plotësisht të vlefshëm.

Pasi tuneli TCP është vendosur, SOCKS nuk i përcakton mesazhet brenda tij. Destinacioni mund të dërgojë i pari. Të dyja palët mund të dërgojnë në mënyrë të pavarur. Njëra palë mund të dërgojë një regjistrim të shkurtër dhe pastaj të presë përgjigjen e tjetrës.

Përcillni bajte, jo transaksione të hamendësuara

Një thirrje marrjeje kthen bajtet e disponueshme sipas flamujve dhe gjendjes së socket-it. Ajo nuk i thotë një relay-i të përgjithshëm se përgjigja e aplikacionit është e plotë. Pritja që një buffer arbitrarisht i madh të mbushet mund të pengojë përcjelljen e mesazhit të vogël që pala tjetër ka nevojë për të vazhduar.

Përdorni modelin ekzistues të konkurrencës së aplikacionit për të shërbyer të dy drejtimet: një event loop, I/O asinkrone ose një dizajn tjetër i zgjedhur me qëllim. Sjellja e rëndësishme është që përparimi në një drejtim nuk kërkon një kufi mesazhi të sajuar në tjetrin.

Mbani dy buffer-a në pritje të kufizuar

Të dhënat e lexuara nga klienti mund të jenë ende në pritje për të arritur destinacionin, ndërsa të dhënat nga destinacioni presin të arrijnë klientin. Ndjekni ato bajte në pritje veçmas.

Një dërgim mund të shkruajë më pak bajte sesa kërkohet. Mbani pjesën e pashkruar; mos e hidhni dhe mos e riprodho buffer-in e plotë. Një socket përkohësisht i pashkrueshëm është arsye për të pritur ngjarjen e duhur të gatishmërisë, jo për të rrotulluar vazhdimisht.

Kufizoni buffer-at. Nëse destinacioni është i ngadaltë, vazhdimi i leximit të të dhënave të pakufizuara të klientit thjesht e zhvendos radhën në memorien e relay-t. Backpressure do të thotë të ndaloni leximet kur buffer-i përkatës në pritje është plot dhe t'i rinisni kur shkrimet lirojnë vend.

Një fund në një drejtim kërkon një politikë

TCP mund të mbyllë një drejtim dërgimi ndërsa drejtimi tjetër ka ende të dhëna të dobishme. Vendosni se si të përhapet kjo gjendje pasi bajtet e buffer-uara të zbrazen, dhe dalloni mbylljen e rregullt nga një gabim ose afat.

Asnjë nga këto nuk kërkon që relay-i të deshifrojë ose të analizojë payload-in e aplikacionit. Ai kërkon trajtim të saktë të rrjedhës. Vetëm rritja e madhësisë së buffer-it nuk mund të rregullojë një relay që pret palën e gabuar ose supozon se çdo lexim korrespondon me një kërkesë të plotë.

Artikuj të ngjashëm