Java DatagramSocket a preposielanie UDP cez SOCKS5
Pochopte, prečo Java UDP socket potrebuje implementáciu SOCKS5 UDP, aj keď TCP spojenia už používajú SOCKS.
Váš Java HTTP dotaz funguje cez SOCKS, ale funkcia UDP stále odosiela prevádzku priamo alebo zlyháva. Nastavenie vlastností SOCKS v JVM nedá DatagramSocket implementáciu SOCKS5 UDP.
API DatagramSocket odosiela a prijíma datagramy adresované sieťovým koncovým bodom. Jeho metóda connect() vyberá partnera pre tento socket. Nevykonáva s partnerom žiadne rokovanie SOCKS.
Trasa UDP cez SOCKS5 vyžaduje prácu navyše
SOCKS5 definuje asociáciu UDP vytvorenú cez riadiace spojenie TCP. Klient potom vymieňa zapuzdrené datagramy s adresou preposielania, ktorú poskytuje proxy. Každá zapuzdrená správa určuje svoj cieľ. Implementácia klienta musí zvládnuť toto rámcovanie aj životnosť riadiaceho spojenia.
Nasmerovanie bežného UDP socketu na TCP port, na ktorom proxy načúva, tieto kroky preskočí. Odosielanie surových datagramov vašej aplikácie na túto adresu asociáciu nenahrádza.
Vyberte knižnicu alebo funkciu aplikácie, ktorá výslovne podporuje preposielanie UDP cez SOCKS5, a potvrďte, že ju podporuje aj server. Knižnica, ktorá inzeruje podporu SOCKS, môže implementovať iba TCP CONNECT. Špecifikácia protokolu tieto príkazy rozlišuje.
Preposielanie UDP tiež potrebuje použiteľnú cestu
Úspešné TCP spojenie s proxy vytvorí iba riadiacu cestu. Firewally alebo správanie NAT môžu stále narušať datagramy odosielané na preposielanie. Zhromaždite vrátený koncový bod preposielania a akúkoľvek chybu preposielania, skôr než usúdite, že cieľ aplikácie je offline.
Napokon, podpora transportu SOCKS nepridáva UDP žiadne záruky doručenia. Vlastné časové limity vašej aplikácie, spracovanie strát a obmedzenia veľkosti správ platia aj po zmene trasy.