Java DatagramSocket a relay UDP přes SOCKS5
Pochopte, proč Java UDP socket potřebuje implementaci SOCKS5 UDP, i když TCP spojení už SOCKS používají.
Váš Java HTTP požadavek funguje přes SOCKS, ale funkce UDP přesto posílá provoz přímo nebo selhává. Nastavení vlastností SOCKS v JVM nedá DatagramSocket implementaci SOCKS5 UDP.
API DatagramSocket odesílá a přijímá datagramy adresované síťovým koncovým bodům. Jeho metoda connect() volí protějšek pro tento socket. Nevede s protějškem žádné vyjednávání SOCKS.
Trasa UDP přes SOCKS5 vyžaduje práci navíc
SOCKS5 definuje asociaci UDP vytvořenou přes řídicí spojení TCP. Klient pak vyměňuje zapouzdřené datagramy s adresou relay, kterou poskytuje proxy. Každá zapouzdřená zpráva identifikuje svůj cíl. Implementace klienta musí zvládnout toto rámování i životnost řídicího spojení.
Nasměrování běžného UDP socketu na TCP port proxy, kde naslouchá, tyto kroky přeskakuje. Odesílání syrových datagramů vaší aplikace na tuto adresu asociaci nenahradí.
Zvolte knihovnu nebo funkci aplikace, která výslovně podporuje relay UDP přes SOCKS5, a ověřte, že ji podporuje i server. Knihovna, která inzeruje podporu SOCKS, může implementovat jen TCP CONNECT. Specifikace protokolu tyto příkazy rozlišuje.
Relay UDP také potřebuje použitelnou cestu
Úspěšné TCP spojení s proxy vytvoří jen řídicí cestu. Firewally nebo chování NAT mohou stále narušovat datagramy odesílané na relay. Než usoudíte, že cíl aplikace je offline, shromážděte vrácený koncový bod relay a případnou chybu relay.
Konečně, podpora transportu SOCKS nepřidává UDP žádné záruky doručení. Vlastní časové limity vaší aplikace, zpracování ztrát a omezení velikosti zpráv platí i po změně trasy.