SOCKS5 sąsaja gali naudoti HTTP tarpinį serverį kaip tolesnį perdavimo kelią. Ji veikia kaip SOCKS serveris kliento atžvilgiu ir kaip HTTP CONNECT klientas tėvo atžvilgiu. Abu valdymo mainai pasibaigia prieš prasidedant programos srautui.

SOCKS CONNECT užklausa jau pateikia paskirties hostą arba adresą ir prievadą. Iliustraciniam HTTP/1.1 mainui su tėvu:

client → adapter: SOCKS5 CONNECT service.example.net:443
adapter → parent:
    CONNECT service.example.net:443 HTTP/1.1
    Host: service.example.net:443

parent → adapter: HTTP/1.1 200 Connection Established
                 [end of headers]
adapter → client: SOCKS5 success reply

client ↔ adapter ↔ parent ↔ service: application bytes

Išverskite rezultatą ties riba

Adapteris atlieka bet kokią tėvo reikalaujamą autentifikaciją ir laukia CONNECT rezultato. Sėkmingas 2xx atsakymas nustato tėvo tunelį. Tik tada jis turėtų grąžinti atitinkamą SOCKS sėkmės atsakymą žemesniam klientui.

Jei tėvas atmeta operaciją, siųskite apibrėžtą SOCKS nesėkmės atsakymą, tada nedelsdami nutraukite kliento ryšį. SOCKS5 reikalauja šio uždarymo per dešimt sekundžių nuo gedimo aptikimo. Išsaugokite tėvo HTTP būseną kaip diagnostinę informaciją adapteriui. Tos būsenos eilutės perdavimas kaip programos duomenų įterptų HTTP valdymo pranešimą į srautą, kurio klientas tikisi SOCKS rėminimo.

Prieš sėkmingą CONNECT rezultatą tėvas vis dar kalba HTTP, įskaitant bet kokio iššūkio ar klaidos atsakymo rėminimą. Po sėkmingo rezultato antraščių skyriklio ryšys tampa tuneliu; iš pradžių nėra jokio HTTP atsakymo turinio, kurį reikėtų suvartoti.

Išsaugokite baitus po antraščių

Vienas skaitymas gali turėti tėvo antraščių pabaigą ir baitus iš paskirties vietos kartu. Išsaugokite tuos papildomus baitus žemesnei programai. Protokolai, kuriuose serveris kalba pirmas, gali pasisveikinti iškart po ryšio atidarymo.

Kai SOCKS sėkmės atsakymas išsiųstas, perduokite programos srautą abiem kryptimis. Adapteriui nereikia kaitalioti vieno kliento pranešimo su vienu serverio pranešimu, ir jam nereikia suprasti TLS įrašų, kad juos perduotų. Jo protokolo darbas buvo nustatyti ir išversti dvi tunelio derybas.

Susiję straipsniai