Asio cần trao đổi SOCKS5 sau khi kết nối tới proxy
Coi SOCKS5 là một máy trạng thái giao thức trên socket Asio: đọc đầy đủ, phản hồi đã kiểm tra và TLS tới đích chỉ sau khi CONNECT thành công.
Kết nối một socket TCP của Asio tới bộ lắng nghe SOCKS5 chỉ hoàn tất một bước: kết nối TCP tới bộ lắng nghe đó. Nó không yêu cầu proxy kết nối tới máy chủ cuối cùng. Với một thử nghiệm công khai được phép, danh sách proxy SOCKS5 cung cấp ứng viên cho điểm cuối TCP đầu tiên đó; bộ kết nối vẫn phải hoàn tất trao đổi bên dưới.
Sau đó bộ kết nối SOCKS5 phải chạy trao đổi giao thức:
- Gửi lời chào phiên bản 5 liệt kê các phương thức xác thực mà máy khách hỗ trợ.
- Đọc phương thức đã chọn và thực hiện trao đổi xác thực của nó khi cần.
- Gửi CONNECT với kiểu địa chỉ đích, địa chỉ và cổng theo thứ tự byte mạng.
- Đọc phản hồi, kiểm tra phiên bản và mã kết quả, rồi tiêu thụ toàn bộ địa chỉ ràng buộc và cổng có độ dài thay đổi.
- Chuyển luồng đã thiết lập cho giao thức của ứng dụng.
Một trợ giúp tên là socks5::async_proxy_connect thuộc về bản triển khai SOCKS cung cấp trợ giúp đó. Việc gọi tên nó bên cạnh boost::asio không biến nó thành một phần của giao diện socket TCP của Asio.
Các lần đọc TCP có thể chỉ trả về một phần phản hồi. Ghép các lần đọc cho số byte cần thiết, rồi chọn độ dài còn lại từ trường kiểu địa chỉ. Đừng cho rằng mọi phản hồi của máy chủ đều có bố cục IPv4 cố định.
Với HTTPS, thực hiện bắt tay TLS với đích sau khi SOCKS CONNECT thành công, giữ nguyên SNI và việc xác minh tên máy chủ của đích. Chỉ một phản hồi proxy thành công không xác thực trang web.
Giữ hủy bỏ và thời hạn trong toàn bộ chuỗi thiết lập. Nếu thời gian thiết lập kết nối TCP hết, các trao đổi lời chào, xác thực và CONNECT sau đó sẽ không còn giới hạn.