Java DatagramSocket и UDP релей през SOCKS5
Разберете защо на Java UDP сокет е нужна SOCKS5 UDP реализация, дори когато TCP връзките вече използват SOCKS.
Java HTTP заявката ви работи през SOCKS, но UDP функция все още изпраща трафик директно или се проваля. Задаването на SOCKS свойствата на JVM не дава на DatagramSocket SOCKS5 UDP реализация.
DatagramSocket API изпраща и получава дейтаграми, адресирани до мрежови крайни точки. Методът му connect() избира партньор за този сокет. Той не извършва SOCKS преговори с партньора.
SOCKS5 UDP маршрутът изисква допълнителна работа
SOCKS5 дефинира UDP асоциация, установена през TCP управляваща връзка. След това клиентът обменя инкапсулирани дейтаграми с адреса за релей, предоставен от проксито. Всяко инкапсулирано съобщение идентифицира своята дестинация. Клиентската реализация трябва да се справя с това рамкиране и с живота на управляващата връзка.
Насочването на обикновен UDP сокет към TCP порта за слушане на проксито пропуска тези стъпки. Изпращането на суровите дейтаграми на приложението ви към този адрес не замества асоциацията.
Изберете библиотека или функция на приложението, която изрично поддържа SOCKS5 UDP релей, и потвърдете, че сървърът също го поддържа. Библиотека, която рекламира SOCKS поддръжка, може да реализира само TCP CONNECT. Спецификацията на протокола разграничава командите.
UDP релеят също се нуждае от използваем път
Успешна TCP връзка към проксито установява само управляващия път. Защитните стени или поведението на NAT все още могат да пречат на дейтаграмите, изпратени до релея. Съберете върнатата крайна точка на релея и всяка грешка при релей, преди да заключите, че дестинацията на приложението е офлайн.
И накрая, SOCKS транспортната поддръжка не добавя гаранции за доставка към UDP. Собствените таймаути на приложението ви, обработката на загуби и ограниченията за размер на съобщенията все още важат след промяната на маршрута.