Asio는 프록시에 연결한 뒤 SOCKS5 교환이 필요하다
SOCKS5를 Asio 소켓 위의 프로토콜 상태 기계로 다루고, 읽기를 완결하며, 응답을 검증하고, 대상 TLS는 CONNECT가 성공한 뒤에만 수행합니다.
Asio TCP 소켓을 SOCKS5 수신기에 연결하는 것은 한 단계만 완료합니다: 그 수신기로의 TCP 연결입니다. 프록시에 최종 서버로 연결하라고 요청하는 것이 아닙니다. 허용된 공개 대상 시험에서는 SOCKS5 프록시 목록이 그 첫 TCP 종단점의 후보를 제공하지만, 커넥터는 아래 교환을 여전히 완료해야 합니다.
그런 다음 SOCKS5 커넥터는 프로토콜 교환을 수행해야 합니다:
- 클라이언트가 지원하는 인증 방식을 나열한 버전 5 인사말을 보냅니다.
- 선택된 방식을 읽고 필요할 때 그 인증 교환을 수행합니다.
- 대상의 주소 유형, 주소, 네트워크 바이트 순서 포트를 담아 CONNECT를 보냅니다.
- 응답을 읽고 버전과 결과 코드를 확인한 뒤, 가변 길이의 바인딩 주소와 포트를 끝까지 소비합니다.
- 설립된 스트림을 애플리케이션 프로토콜에 넘깁니다.
socks5::async_proxy_connect라는 도우미는 그 도우미를 제공하는 SOCKS 구현에 속합니다. boost::asio 옆에 이름을 올린다고 해서 Asio의 TCP 소켓 인터페이스 일부가 되지는 않습니다.
TCP 읽기는 응답의 일부만 돌려줄 수 있습니다. 필요한 바이트 수만큼 읽기를 조합한 다음, 남은 길이는 주소 유형 필드에서 정합니다. 모든 서버 응답이 고정된 IPv4 배치를 가진다고 가정하지 마십시오.
HTTPS의 경우 SOCKS CONNECT가 성공한 뒤 대상 TLS 핸드셰이크를 수행하고, 대상의 SNI와 호스트 이름 검증을 유지합니다. 프록시 응답이 성공했다는 것만으로는 웹사이트가 인증되지 않습니다.
설정 순서 전체에 걸쳐 취소와 기한을 유지하십시오. TCP 연결 수립이 시간 초과되면 이후 인사말, 인증, CONNECT 교환은 제한 없이 남습니다.