Asio wymaga wymiany SOCKS5 po połączeniu z proxy
Traktuj SOCKS5 jak maszynę stanów protokołu nad gniazdem Asio: pełne odczyty, zweryfikowane odpowiedzi i TLS do celu dopiero po udanym CONNECT.
Połączenie gniazda TCP Asio z nasłuchiwaczem SOCKS5 kończy tylko jeden krok: połączenie TCP z tym nasłuchiwaczem. Nie prosi proxy o połączenie z serwerem końcowym. Do dozwolonego testu publicznego celu lista proxy SOCKS5 oferuje kandydatów dla tego pierwszego punktu końcowego TCP; łącznik nadal musi wykonać poniższą wymianę.
Łącznik SOCKS5 musi następnie przeprowadzić wymianę protokołu:
- Wyślij powitanie w wersji 5 z listą metod uwierzytelniania obsługiwanych przez klienta.
- Odczytaj wybraną metodę i w razie potrzeby wykonaj jej wymianę uwierzytelniania.
- Wyślij CONNECT z typem adresu celu, adresem i portem w kolejności bajtów sieciowych.
- Odczytaj odpowiedź, sprawdź jej wersję i kod wyniku, a następnie zużyj pełny powiązany adres i port o zmiennej długości.
- Przekaż ustanowiony strumień protokołowi aplikacji.
Pomocnik o nazwie socks5::async_proxy_connect należy do implementacji SOCKS, która go dostarcza. Wymienienie go obok boost::asio nie czyni go częścią interfejsu gniazda TCP Asio.
Odczyty TCP mogą zwrócić tylko część odpowiedzi. Złóż odczyty dla wymaganych liczby bajtów, a następnie wybierz pozostałą długość z pola typu adresu. Nie zakładaj, że każda odpowiedź serwera ma stały układ IPv4.
Dla HTTPS wykonaj uścisk dłoni TLS z celem po udanym SOCKS CONNECT, zachowując SNI i weryfikację nazwy hosta celu. Sama udana odpowiedź proxy nie uwierzytelnia witryny.
Utrzymuj anulowanie i terminy przez całą sekwencję konfiguracji. Jeśli upłynie czas nawiązania połączenia TCP, późniejsze wymiany powitania, uwierzytelniania i CONNECT pozostaną bez ograniczeń.