Domanda

non bloccante SocketChannels TCP / IP e Selector in NIO mi aiuta a gestire molte connessioni TCP / IP con piccolo numero di thread. Ma come circa UDP DatagramChannels? (Devo ammettere che io non sono molto familiare con UDP.)

UDP inviare operazioni non sembrano bloccare anche se il DatagramChannel non sta funzionando in modalità di blocco. Esiste davvero un caso in cui i blocchi DatagramSocket.send(DatagramPacket) a causa di una congestione o qualcosa di simile? Sono davvero curioso di sapere se c'è un caso del genere e quali i possibili casi esistono in un ambiente di produzione.

Se DatagramSocket.send(DatagramPacket) realtà non bloccare e non ho intenzione di usare una DatagramSocket collegata e legarsi a una sola porta, non c'è vantaggio di utilizzare la modalità non-blocking con DatagramChannel e Selector?

È stato utile?

Soluzione

E 'stato un po' che ho usato DatagramSockets di Java, canali e simili, ma posso ancora dare qualche aiuto.

Il protocollo UDP non stabilisce una connessione TCP come fa. Piuttosto, solo invia i dati e si dimentica a questo proposito. Se è importante fare in modo che i dati effettivamente arriva, che è a carico del cliente. Così, anche se si è in modalità di blocco, l'operazione di invio bloccherà solo per il tempo necessario per svuotare il buffer fuori. Dal momento che UDP non sa nulla sulla rete, si scriverà fuori alla prima occasione senza controllare la velocità della rete o se si arriva in realtà a dove si suppone che sia in corso. Così, per voi, sembra come se il canale è in realtà subito pronto per l'invio di più.

Altri suggerimenti

UDP non blocca (E 'solo blocchi durante il trasferimento dei dati al sistema operativo) Ciò significa che se in qualsiasi punto del salto successivo / interruttore / macchina non può tamponare il pacchetto UDP si lascia cadere. Questo può essere un comportamento auspicabile in alcune situazioni. Ma è qualcosa che dovete essere a conoscenza.

UDP anche non garantisce a

  • pacchetti di consegna nell'ordine in cui vengono inviati.
  • non rompere pacchetti di grandi dimensioni.
  • inoltra i pacchetti attraverso interruttori. Spesso inoltro UDP tra switch è spento.

Tuttavia UDP supporta multicast così lo stesso pacchetto può essere consegnato a uno o più host. Il mittente non ha alcuna idea se qualcuno riceve i pacchetti però.

Una cosa difficile di UDP è che funziona la maggior parte del tempo, ma non riesce male a volte in modi che sono molto difficili da riprodurre. Per questo motivo, non si dovrebbe assumere affidabilità anche se si fa un paio di test e sembra funzionare.

Non blocco UDP è utile soprattutto sul lato ricevente. Packet invio può essere ritardata solo a causa di circostanze locali: strumenti di traffic shaping locali come "carte da gioco di rete" che le priorità del traffico di gioco rispetto ad altre fonti di traffico, o scheda di rete sovraccarica (che non è probabile che accada) possono ritardare l'invio di un pacchetto. Una volta fuori dal sistema. Una volta che il pacchetto lascia l'interfaccia locale, non è più la preoccupazione dell'applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top