Фронтэнд SOCKS5 можа выкарыстоўваць HTTP-проксі як свой далейшы транспарт. Ён дзейнічае як сервер SOCKS для кліента і як кліент HTTP CONNECT для бацькоўскага сервера. Абодва абмены кіравання завяршаюцца да пачатку патоку праграмы.

Запыт SOCKS CONNECT ужо змяшчае хост або адрас прызначэння і порт. Для ілюстратыўнага абмену HTTP/1.1 з бацькоўскім серверам:

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

Пераўтварыце вынік на мяжы

Адаптар выконвае любую патрэбную аўтэнтыфікацыю на баку бацькоўскага сервера і чакае выніку CONNECT. Паспяховы адказ 2xx усталёўвае бацькоўскі тунэль. Толькі пасля гэтага ён павінен вярнуць адпаведны адказ поспеху SOCKS кліенту ніжэй па плыні.

Калі бацькоўскі сервер адхіляе аперацыю, адпраўце вызначаны адказ памылкі SOCKS і затым неадкладна закрыйце злучэнне з кліентам. SOCKS5 патрабуе такога закрыцця на працягу дзесяці секунд пасля выяўлення збою. Захоўвайце HTTP-статус бацькоўскага сервера як дыягнастычную інфармацыю для адаптара. Перадача гэтага радка стану як даных праграмы змясціла б кіравальнае паведамленне HTTP у паток, кліент якога чакае фарматаванне SOCKS.

Да паспяховага выніку CONNECT бацькоўскі сервер усё яшчэ размаўляе на HTTP, уключаючы фарматаванне любога адказу з патрабаваннем аўтэнтыфікацыі або памылкай. Пасля раздзяляльніка загалоўкаў паспяховага выніку злучэнне становіцца тунэлем; спачатку няма цела адказу HTTP, якое трэба спажыць.

Захавайце байты пасля загалоўкаў

Адно чытанне можа змяшчаць канец загалоўкаў бацькоўскага сервера і байты ад прызначэння разам. Захавайце гэтыя дадатковыя байты для праграмы ніжэй па плыні. Пратаколы, у якіх сервер гаворыць першым, могуць вітаць адразу пасля адкрыцця злучэння.

Пасля адпраўкі адказу поспеху SOCKS перадавайце паток праграмы ў абодвух напрамках. Адаптару не трэба чаргаваць адно паведамленне кліента з адным паведамленнем сервера, і яму не трэба разумець запісы TLS, каб перадаваць іх. Яго працай на ўзроўні пратакола было ўстанаўленне і пераўтварэнне двух тунэльных перамоваў.

Падобныя артыкулы