¿Cuándo es apropiado usar UDP en lugar de TCP?

Desde TCP garantiza la entrega de paquetes y por lo tanto se puede considerar “confiable”, mientras que UDP no garantiza nada y los paquetes se pueden perder. ¿Cuál sería la ventaja de transmitir datos usando UDP en una aplicación en lugar de hacerlo a través de una transmisión TCP? ¿En qué tipo de situaciones sería UDP la mejor opción y por qué?

Supongo que UDP es más rápido ya que no tiene la sobrecarga de crear y mantener una transmisión, pero ¿no sería irrelevante si algunos datos nunca llegan a su destino?

Esta es una de mis preguntas favoritas. UDP es tan incomprendido.

En situaciones donde realmente desea obtener una respuesta simple a otro servidor rápidamente, UDP funciona mejor. En general, desea que la respuesta esté en un paquete de respuesta, y está preparado para implementar su propio protocolo para confiabilidad o reenviar. DNS es la descripción perfecta de este caso de uso. Los costos de las configuraciones de conexión son demasiado altos (aún, DNS también admite un modo TCP).

Otro caso es cuando está entregando datos que pueden perderse debido a que los datos más nuevos que ingresan reemplazarán a los datos / estados anteriores. Me vienen a la mente los datos meteorológicos, la transmisión de video, un servicio de cotización de acciones (no utilizado para la negociación real) o datos de juegos.

Otro caso es cuando está administrando una gran cantidad de estados y desea evitar el uso de TCP porque el sistema operativo no puede manejar tantas sesiones. Este es un caso raro hoy. De hecho, ahora hay stacks TCP de usuario-tierra que se pueden usar para que el escritor de la aplicación pueda tener un control más detallado sobre los recursos necesarios para ese estado de TCP. Antes de 2003, UDP era realmente el único juego en la ciudad.

Otro caso es para el tráfico de multidifusión. UDP se puede multidifundir a varios hosts, mientras que TCP no puede hacer esto en absoluto.

Si se pierde un paquete TCP , se volverá a enviar. Eso no es útil para las aplicaciones que dependen de que los datos se manejen en un orden específico en tiempo real.

Los ejemplos incluyen transmisión de video y especialmente VoIP (por ejemplo, Skype ). En esos casos, sin embargo, un paquete descartado no es tan importante: nuestros sentidos no son perfectos, por lo que puede que ni siquiera lo notemos. Es por eso que estos tipos de aplicaciones usan UDP en lugar de TCP.

La “falta de fiabilidad” de UDP es un formalismo. La transmisión no está absolutamente garantizada. Como una cuestión práctica, casi siempre pasan. Simplemente no son reconocidos y reintentados después de un tiempo de espera.

La sobrecarga en la negociación de un socket TCP y la comunicación de los paquetes TCP es enorme. Realmente enorme No hay una sobrecarga apreciable del UDP.

Lo que es más importante, puede complementar fácilmente a UDP con un reparto de mano de entrega confiable que sea menos costoso que TCP. Lea esto: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

UDP es útil para transmitir información en un tipo de aplicación de suscripción de publicación. IIRC, TIBCO hace uso intensivo de UDP para la notificación de cambio de estado.

Cualquier otro tipo de actividad de “evento significativo” o “registro” unidireccional se puede manejar muy bien con paquetes UDP. Desea enviar notificaciones sin construir un socket completo. No espera ninguna respuesta de los diversos oyentes.

Los mensajes del sistema “heartbeat” o “I’m alive” son una buena opción, también. Perder uno no es una crisis. Falta media docena (en una fila) es.

Trabajo en un producto que admite comunicación UDP (IP) y TCP / IP entre el cliente y el servidor. Comenzó con IPX hace más de 15 años con soporte de IP agregado hace 13 años. Añadimos soporte TCP / IP hace 3 o 4 años. Se aproxima una conjetura salvaje: la relación de código UDP a TCP probablemente sea de 80/20. El producto es un servidor de base de datos, por lo que la fiabilidad es fundamental. Tenemos que manejar todos los problemas impuestos por UDP (pérdida de paquetes, duplicación de paquetes, orden de paquetes, etc.) ya mencionados en otras respuestas. Rara vez hay problemas, pero a veces ocurren y deben ser manejados. El beneficio de admitir UDP es que podemos personalizarlo un poco para nuestro propio uso y modificar un poco más el rendimiento de él.

Cada red va a ser diferente, pero el protocolo de comunicación UDP generalmente es un poco más rápido para nosotros. El lector escéptico cuestionará correctamente si implementamos todo correctamente. Además, ¿qué se puede esperar de un hombre con un representante de 2 dígitos? Sin embargo, acabo de realizar una prueba por curiosidad. La prueba leyó 1 millón de registros (seleccione * de alguna tabla). Establecí el número de registros a devolver con cada solicitud de cliente individual para que sea 1, 10 y luego 100 (tres ejecuciones de prueba con cada protocolo). El servidor estaba a solo dos pasos de distancia sobre una LAN de 100Mbit. Los números parecían estar de acuerdo con lo que otros han encontrado en el pasado (UDP es aproximadamente 5% más rápido en la mayoría de las situaciones). El tiempo total en milisegundos fue el siguiente para esta prueba en particular:

  1. 1 registro
    • IP: 390,760 ms
    • TCP: 416.903 ms
  2. 10 registros
    • IP: 91,707 ms
    • TCP: 95,662 ms
  3. 100 registros
    • IP: 29,664 ms
    • TCP: 30,968 ms

La cantidad total de datos transmitidos fue aproximadamente la misma para IP y TCP. Tenemos una sobrecarga adicional con las comunicaciones UDP porque tenemos algunas de las mismas cosas que obtienes para “gratis” con TCP / IP (sum de comprobación, números de secuencia, etc.). Por ejemplo, Wireshark mostró que una solicitud para el siguiente conjunto de registros era 80 bytes con UDP y 84 bytes con TCP.

UDP es un protocolo sin conexión y se utiliza en aplicaciones como SNMP (Protocolo simple de administración de redes), DNS (Sistema de nombres de dominio) donde importan los paquetes de datos que llegan fuera de orden, la falta de fiabilidad y el envío inmediato del paquete de datos.

Dado que UDP no implica el establecimiento de la conexión, por lo tanto, las aplicaciones como DNS donde se deben evitar retrasos en el establecimiento de la conexión, se prefiere UDP sobre TCP.

Se utiliza en SNMP ya que la gestión de la red a menudo debe realizarse cuando la red está en tensión, es decir, cuando es difícil lograr la transferencia de datos confiable y controlada por la congestión.

aclamaciones

Ya hay muchas buenas respuestas aquí, pero me gustaría agregar un factor muy importante que además de un resumen. UDP puede lograr un rendimiento mucho mayor con el ajuste correcto porque no emplea control de congestión . El control de la congestión en TCP es muy muy importante. Controla la velocidad y el rendimiento de la conexión para minimizar la congestión de la red al intentar estimar la capacidad actual de la conexión. Incluso cuando los paquetes se envían a través de enlaces muy confiables, como en la red central, los enrutadores tienen búferes de tamaño limitado. Estos búferes se llenan hasta su capacidad y los paquetes se eliminan, y TCP detecta esta caída a través de la falta de un reconocimiento recibido, y acelera la velocidad de la conexión para la estimación de la capacidad. TCP también emplea algo llamado inicio lento , pero el rendimiento (en realidad, la ventana de congestión ) aumenta lentamente hasta que se eliminan los paquetes, y luego se reduce y se vuelve a boost lentamente hasta que se eliminan los paquetes, etc. Esto hace que el rendimiento de TCP fluctúe. Puede ver esto claramente cuando descarga un archivo grande.

Como UDP no usa el control de congestión, puede ser más rápido y experimentar menor retraso porque no intentará maximizar los almacenamientos intermedios hasta el punto de caída, es decir, los paquetes UDP pasan menos tiempo en los almacenamientos intermedios y llegan más rápido con menor retraso. Debido a que UDP no emplea control de congestión, pero lo hace TCP, puede restar capacidad de TCP que rinde a flujos UDP.

Sin embargo, UDP sigue siendo vulnerable a la congestión y las caídas de paquetes, por lo que su aplicación debe estar preparada para manejar estas menos pérdidas de alguna manera, probablemente utilizando códigos de retransmisión o corrección de errores.

El resultado es que UDP puede:

  • Logre un rendimiento mayor que TCP siempre que la tasa de caída de la red esté dentro de los límites que la aplicación puede manejar.
  • Entregar paquetes más rápido que TCP con menos demora.
  • Configure las conexiones más rápido ya que no hay un handshake inicial para configurar la conexión
  • Transmite paquetes de multidifusión, mientras que TCP tiene que usar múltiples conexiones.
  • Transmite paquetes de tamaño fijo, mientras que TCP transmite datos en segmentos. Si transfiere un paquete UDP de 300 bytes, recibirá 300 bytes en el otro extremo. Con TCP, puede alimentar el socket de envío 300 Bytes, pero el receptor solo lee 100 Bytes y tiene que descubrir de alguna manera que hay 200 Bytes más en el camino. Esto es importante si su aplicación transmite mensajes de tamaño fijo, en lugar de una secuencia de bytes.

En resumen, UDP se puede usar para cada tipo de aplicación que TCP puede, siempre que implemente un mecanismo de retransmisión adecuado. El UDP puede ser muy rápido, con un retardo bajo, no se ve afectado por la congestión en una conexión, transmite datagtwigs de tamaño fijo y se puede usar para la multidifusión.

El UDP tiene menos sobrecarga y es bueno para hacer cosas como transmitir datos en tiempo real como audio o video, o en cualquier caso donde está bien si se pierden datos.

Una de las mejores respuestas que conozco para esta pregunta proviene del usuario zAy0LfpBZLC8mAC en Hacker News . Esta respuesta es tan buena que solo voy a citarla tal como está.

TCP tiene locking de cabecera de cola, ya que garantiza la entrega completa y en orden, por lo que cuando un paquete se pierde en tránsito, tiene que esperar una retransmisión del paquete faltante, mientras que UDP entrega paquetes a la aplicación a medida que llegan , incluyendo duplicados y sin ninguna garantía de que un paquete llegue a todo o a qué orden lleguen (en realidad es esencialmente IP con números de puerto y una sum de comprobación de carga útil (opcional)), pero eso está bien para la telefonía, por ejemplo, donde generalmente simplemente no importa cuando faltan unos pocos milisegundos de audio, pero la demora es muy molesta, por lo que no se molesta en retransmitir, simplemente deja caer los duplicados, clasifica los paquetes reordenados en el orden correcto durante unos cientos de milisegundos de buffer de fluctuación de fase , y si los paquetes no se muestran a tiempo o simplemente se omiten, es posible que se interpolen cuando el códec los respalde.

Además, una parte importante de TCP es el control de flujo, para asegurarse de obtener la mayor cantidad posible de tráfico, pero sin sobrecargar la red (que es algo redundante, ya que una red sobrecargada soltará sus paquetes, lo que significa que tendría que hacer retransmite, lo que perjudica el rendimiento), UDP no tiene nada de eso, lo que tiene sentido para aplicaciones como la telefonía, ya que la telefonía con un códec determinado necesita una cierta cantidad de ancho de banda, no se puede “reducir la velocidad” y un ancho de banda adicional. no hace que la llamada sea más rápida.

Además de las aplicaciones en tiempo real / baja latencia, UDP tiene sentido para transacciones realmente pequeñas, como búsquedas de DNS, simplemente porque no tiene el establecimiento de la conexión TCP ni la sobrecarga de cierre, tanto en términos de latencia como en términos de uso de ancho de banda. Si su solicitud es más pequeña que una MTU típica y la repsonse probablemente también lo es, puede hacerlo en una ida y vuelta, sin necesidad de mantener ningún estado en el servidor, y control de flujo, al igual que todo lo que probablemente no sea particularmente útil. para tales usos tampoco.

Y luego, puede usar UDP para construir sus propios reemplazos TCP, por supuesto, pero probablemente no sea una buena idea sin una profunda comprensión de la dinámica de la red, los algoritmos TCP modernos son bastante sofisticados.

Además, supongo que debería mencionarse que hay más que UDP y TCP, como SCTP y DCCP. El único problema actual es que Internet (IPv4) está lleno de puertas de enlace NAT que imposibilitan el uso de protocolos distintos de UDP y TCP en aplicaciones de usuario final.

El UDP tiene una sobrecarga menor, como ya se indicó es bueno para transmitir cosas como video y audio, donde es mejor simplemente perder un paquete y luego intentar volver a enviarlo y ponerlo al día.

No hay garantías sobre la entrega de TCP, se supone que se le debe decir si el socket se desconectó o si los datos no llegarán. De lo contrario, llega allí cuando llega.

Una gran cosa que la gente olvida es que udp está basado en paquetes, y tcp está basado en la prueba de bits, no hay garantía de que el “paquete tcp” que envió sea el paquete que aparece en el otro extremo, puede diseccionarse en tantos paquetes como lo desean los enrutadores y las stacks. Por lo tanto, su software tiene la sobrecarga adicional de analizar los bytes en trozos utilizables de datos, que pueden tomar una cantidad considerable de sobrecarga. UDP puede estar fuera de servicio, por lo que debe numerar sus paquetes o utilizar algún otro mecanismo para reordenarlos si así lo desea. Pero si obtienes ese paquete udp, llega con todos los mismos bytes en el mismo orden en que salió, sin cambios. Entonces, el término paquete udp tiene sentido, pero el paquete tcp no necesariamente. TCP tiene su propio mecanismo de revisión y ordenamiento que está oculto para su aplicación, puede reinventarlo con UDP para adaptarlo a sus necesidades.

UDP es mucho más fácil para escribir código en ambos extremos, básicamente porque no tiene que hacer y mantener las conexiones punto a punto. Mi pregunta es, por lo general, ¿dónde están las situaciones en las que desearía la sobrecarga de TCP? Y si toma accesos directos como asumir que un “paquete” de tcp recibido es el paquete completo que se envió, ¿le va mejor? (Es probable que tire dos paquetes si se molesta en verificar la longitud / contenido)

La transmisión de video es un ejemplo perfecto del uso de UDP.

La comunicación de red para videojuegos casi siempre se realiza a través de UDP.

La velocidad es de sum importancia y en realidad no importa si las actualizaciones se pierden ya que cada actualización contiene el estado actual completo de lo que el jugador puede ver.

En algunos casos, que otros han resaltado, la llegada garantizada de paquetes no es importante, y por lo tanto, el uso de UDP está bien. Hay otros casos en los que UDP es preferible a TCP.

Un caso único en el que desearía usar UDP en lugar de TCP es cuando está tunelizando TCP sobre otro protocolo (por ejemplo, túneles, redes virtuales, etc.). Si canaliza TCP sobre TCP, los controles de congestión de cada uno interferirán entre sí. Por lo tanto, uno generalmente prefiere canalizar TCP sobre UDP (o algún otro protocolo sin estado). Consulte el artículo de TechRepublic: Descripción de TCP sobre TCP: efectos del túnel TCP sobre el rendimiento y la latencia de extremo a extremo .

La pregunta clave estaba relacionada con “qué tipo de situaciones sería UDP la mejor opción [sobre tcp]”

Existen muchas respuestas excelentes, pero lo que falta es una evaluación formal y objetiva del impacto de la incertidumbre del transporte sobre el rendimiento del TCP.

Con el crecimiento masivo de aplicaciones móviles y los paradigmas “ocasionalmente conectados” u “ocasionalmente desconectados” que los acompañan, hay ciertamente situaciones donde la sobrecarga de los bashs de TCP de mantener una conexión cuando las conexiones son difíciles de obtener conduce a una fuerte caso para UDP y su naturaleza “orientada a mensajes”.

Ahora no tengo las matemáticas / investigación / números sobre esto, pero he producido aplicaciones que han funcionado de manera más confiable y ACK / NAK y la numeración de mensajes a través de UDP de lo que se podía lograr con TCP cuando la conectividad era generalmente pobre y pobre viejo TCP Acabo de pasar el tiempo y el dinero de mi cliente solo intenta conectarse. Obtienes esto en áreas regionales y rurales de muchos países occidentales …

UDP se puede usar cuando una aplicación se preocupa más por los datos de “tiempo real” en lugar de la replicación de datos exacta. Por ejemplo, VOIP puede usar UDP y la aplicación se preocupará por volver a pedir paquetes, pero al final VOIP no necesita todos los paquetes, pero más importante aún necesita un flujo continuo de muchos de ellos. Tal vez tengas un “error” en la calidad de la voz, pero el objective principal es que recibas el mensaje y no que sea recreado perfectamente del otro lado. UDP también se usa en situaciones donde el gasto de crear una conexión y sincronizar con TCP supera la carga útil. Las consultas DNS son un ejemplo perfecto. Un paquete fuera, un paquete atrás, por consulta. Si usa TCP esto sería mucho más intensivo. Si no recupera la respuesta DNS, simplemente vuelva a intentarlo.

UDP cuando la velocidad es necesaria y la precisión si los paquetes no lo son, y TCP cuando se necesita precisión.

UDP es a menudo más difícil ya que debe escribir su progtwig de tal forma que no dependa de la precisión de los paquetes.

No siempre es claro. Sin embargo, si necesita entrega garantizada de paquetes sin pérdida y en la secuencia correcta, entonces TCP es probablemente lo que desea.

Por otro lado UDP es apropiado para transmitir paquetes cortos de información donde la secuencia de la información es menos importante o donde los datos pueden caber en un solo paquete.

También es apropiado cuando desea transmitir la misma información a muchos usuarios.

Otras veces, es apropiado cuando está enviando datos secuenciados, pero si algo falta, no está demasiado preocupado (por ejemplo, una aplicación VOIP).

Algunos protocolos son más complejos porque lo que se necesita son algunas (pero no todas) las características de TCP, pero más de lo que proporciona UDP. Ahí es donde la capa de aplicación tiene que implementar la funcionalidad adicional. En esos casos, UDP también es apropiado (por ejemplo, radio por Internet, el orden es importante, pero no todos los paquetes deben cumplirse).

Ejemplos de dónde es / podría usarse 1) Un servidor de tiempo que transmite la hora correcta a un grupo de máquinas en una LAN. 2) protocolos VOIP 3) búsquedas DNS 4) Solicitud de servicios LAN, por ejemplo, ¿dónde estás? 5) Radio por Internet 6) y muchos otros …

En Unix puede escribir grep udp / etc / services para obtener una lista de protocolos UDP implementados hoy … hay cientos.

Consulte la sección 22.4 de la Progtwigción de red Unix de Steven, “Cuándo usar UDP en lugar de TCP”.

Además, vea esta otra respuesta SO sobre la idea errónea de que UDP siempre es más rápido que TCP .

Lo que Steven dice puede resumirse de la siguiente manera:

  • Use UDP para broadcast y multicast ya que esa es su única opción (use multicast para cualquier aplicación nueva)
  • Puede usar UDP para aplicaciones simples de solicitud / respuesta, pero necesitará construir sus propios acks, timeouts y retransmisiones
  • No use UDP para la transferencia masiva de datos.

Sabemos que el UDP es un protocolo sin conexión, por lo que es

  1. adecuado para procesos que requieren comunicación simple de solicitud-respuesta.
  2. adecuado para procesos que tienen flujo interno, control de errores
  3. adecuado para amplio casting y multicasting

Ejemplos específicos:

  • utilizado en SNMP
  • utilizado para algunos protocolos de actualización de ruta como RIP

Desea usar UDP sobre TCP en los casos en que la pérdida de algunos de los datos en el camino no arruine por completo los datos que se transmiten. Muchos de sus usos se encuentran en aplicaciones en tiempo real, como los juegos (es decir, FPS, donde no siempre es necesario saber dónde está cada jugador en un momento dado, y si pierde algunos paquetes en el camino, nuevos los datos le indicarán correctamente dónde están los jugadores de todos modos) y la transmisión de video en tiempo real (un marco corrupto no arruinará la experiencia de visualización).

Tenemos un servicio web que tiene miles de clientes de winforms en tantas PC. Las computadoras no tienen conexión con el backend DB, todo el acceso es a través del servicio web. Así que decidimos desarrollar un servidor de registro central que escuche en un puerto UDP y todos los clientes envían un paquete de registro de errores xml (usando el apéndice log4net UDP) que se descarga a una tabla DB cuando se recibe. Ya que realmente no nos importa si se pierden algunos registros de errores y con miles de clientes es rápido con un servicio de registro dedicado que no carga el servicio web principal.

Al comparar TCP con UDP, los protocolos sin conexión como UDP aseguran la velocidad, pero no la confiabilidad de la transmisión de paquetes. Por ejemplo, en los videojuegos normalmente no se necesita una red confiable, pero la velocidad es la más importante y el uso de UDP para juegos tiene la ventaja de reducir el retraso de la red.

enter image description here

Soy un poco reacio a sugerir UDP cuando TCP podría funcionar. El problema es que si TCP no funciona por algún motivo, porque la conexión es demasiado lenta o está congestionada, es poco probable que cambiar la aplicación para usar UDP sea útil. Una mala conexión también es mala para UDP. TCP ya hace un muy buen trabajo al minimizar la congestión.

El único caso en el que puedo pensar cuando se requiere UDP es para los protocolos de difusión. En los casos en que una aplicación involucre dos hosts conocidos, UDP probablemente solo ofrezca beneficios marginales de rendimiento para los costos sustancialmente incrementados de la complejidad del código.

Solo use UDP si realmente sabe lo que está haciendo. Hoy en día, el UDP es extremadamente raro, pero la cantidad de expertos (incluso muy experimentados) que tratarían de quedarse en todas partes parece ser desproporcionada. Tal vez ellos mismos disfrutan implementando el código de manejo de errores y mantenimiento de conexión.

Se debería esperar que TCP sea mucho más rápido con las tarjetas de interfaz de red modernas debido a lo que se conoce como impresión de sum de comprobación . Sorprendentemente, a velocidades de conexión rápidas (como 1 Gbps), el cálculo de una sum de comprobación sería una gran carga para una CPU, por lo que se descarga al hardware NIC que reconoce los paquetes TCP para impresión, y no le ofrecerá el mismo servicio.

UDP es perfecto para VoIP dirigido donde se debe enviar el paquete de datos con respecto a menos su fiabilidad … El video chat es un ejemplo de UDP (puede verificarlo mediante la captura de red wireshark durante cualquier chat de video). También TCP no funciona con DNS y protocolos SNMP. UDP no tiene ninguna sobrecarga, mientras que TCP tiene muchos gastos generales