Yêu cầu HTTP Java của bạn hoạt động qua SOCKS, nhưng một tính năng UDP vẫn gửi lưu lượng trực tiếp hoặc thất bại. Việc đặt các thuộc tính SOCKS của JVM không mang lại cho DatagramSocket một bản triển khai SOCKS5 UDP.

API DatagramSocket gửi và nhận các datagram được định địa chỉ tới điểm cuối mạng. Phương thức connect() của nó chọn một đối tác cho socket đó. Nó không thực hiện thương lượng SOCKS với đối tác.

Một tuyến UDP qua SOCKS5 cần thêm công việc

SOCKS5 định nghĩa một liên kết UDP được thiết lập trên một kết nối điều khiển TCP. Sau đó máy khách trao đổi các datagram đã đóng gói với địa chỉ chuyển tiếp do proxy cung cấp. Mỗi thông điệp đã đóng gói xác định đích của nó. Bản triển khai máy khách phải xử lý việc đóng gói đó và thời gian sống của kết nối điều khiển.

Việc trỏ một socket UDP thông thường vào cổng lắng nghe TCP của proxy bỏ qua các bước đó. Gửi các datagram thô của ứng dụng bạn tới địa chỉ đó không thay thế cho liên kết.

Hãy chọn một thư viện hoặc tính năng ứng dụng hỗ trợ rõ ràng việc chuyển tiếp UDP qua SOCKS5, và xác nhận rằng máy chủ cũng hỗ trợ. Một thư viện quảng cáo có hỗ trợ SOCKS có thể chỉ triển khai TCP CONNECT. Đặc tả giao thức phân biệt các lệnh này.

Việc chuyển tiếp UDP cũng cần một đường đi dùng được

Một kết nối TCP thành công tới proxy chỉ thiết lập đường điều khiển. Tường lửa hoặc hành vi NAT vẫn có thể can thiệp vào các datagram gửi tới bộ chuyển tiếp. Hãy thu thập điểm cuối chuyển tiếp được trả về và mọi lỗi chuyển tiếp trước khi kết luận rằng đích của ứng dụng đang ngoại tuyến.

Cuối cùng, hỗ trợ truyền tải SOCKS không thêm bảo đảm phân phối nào cho UDP. Các thời gian chờ, xử lý mất mát và giới hạn kích thước thông điệp của chính ứng dụng bạn vẫn áp dụng sau khi tuyến thay đổi.

Bài viết liên quan