socket - I/O UDP sin bloqueo frente a I/O UDP bloqueado en Java
sockets en java pdf (3)
Los SocketChannels y Selector TCP / IP sin bloqueo en NIO me ayudan a manejar muchas conexiones TCP / IP con un número pequeño de subprocesos. Pero ¿qué hay de UDP DatagramChannels? (Debo admitir que no estoy muy familiarizado con UDP).
Las operaciones de envío UDP no parecen bloquearse incluso si el DatagramChannel no está operando en modo de bloqueo. ¿Hay realmente un caso donde DatagramSocket.send (DatagramPacket) bloquea debido a la congestión o algo similar? Tengo mucha curiosidad si existe un caso así y cuáles son los posibles casos en un entorno de producción.
Si DatagramSocket.send (DatagramPacket) en realidad no bloquea y no voy a usar un DatagramSocket conectado y enlazar a un solo puerto, ¿no hay ninguna ventaja de usar modo no bloqueante con DatagramChannel y Selector?
Ha pasado un tiempo desde que utilicé DatagramSockets de Java, canales y similares, pero aún puedo darte algo de ayuda.
El protocolo UDP no establece una conexión como TCP. Por el contrario, simplemente envía los datos y se olvida de ellos. Si es importante asegurarse de que los datos realmente lleguen allí, esa es la responsabilidad del cliente. Por lo tanto, incluso si se encuentra en el modo de bloqueo, su operación de envío solo se bloqueará durante el tiempo que sea necesario para eliminar el búfer. Como UDP no sabe nada de la red, la escribirá a la mayor brevedad posible sin verificar la velocidad de la red o si realmente llega a donde se supone que va. Por lo tanto, para usted, parece que el canal está listo de inmediato para enviar más.
UDP no bloquea (solo bloquea mientras está transfiriendo los datos al sistema operativo). Esto significa que si en algún momento el siguiente salto / conmutador / máquina no puede almacenar el paquete UDP, lo descarta. Esto puede ser un comportamiento deseable en algunas situaciones. Pero es algo de lo que debes estar consciente.
UDP tampoco garantiza a
- paquetes de entrega en el orden en que se envían.
- no para romper paquetes grandes
- reenviar paquetes a través de los switches. A menudo, el reenvío UDP entre conmutadores está desactivado.
Sin embargo, UDP admite multidifusión, por lo que el mismo paquete se puede entregar a uno o más hosts. Sin embargo, el remitente no tiene idea de si alguien recibe los paquetes.
Algo complicado sobre el UDP es que funciona la mayor parte del tiempo, pero a veces falla mal en formas que son muy difíciles de reproducir. Por esta razón, no debe asumir la fiabilidad incluso si realiza algunas pruebas y parece que funciona.
El no bloqueo de UDP es principalmente útil en el lado de recepción. El envío de paquetes solo se puede retrasar debido a circunstancias locales: las herramientas de configuración de tráfico local como "tarjetas de red de juegos" que priorizan el tráfico de juegos sobre otras fuentes de tráfico o una tarjeta de red sobrecargada (que probablemente no ocurra) pueden retrasar el envío de un paquete. Una vez fuera del sistema. Una vez que el paquete sale de la interfaz local, ya no es la preocupación de la aplicación.