utilizar que puertos protocolo mejor lugar funciona ejemplos como caracteristicas beneficios aplicaciones networking tcp udp

networking - puertos - que es mejor udp o tcp



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

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.

Dado que TCP garantiza la entrega de paquetes y, por lo tanto, puede considerarse "confiable", mientras que UDP no garantiza nada y los paquetes pueden perderse. ¿Cuál sería la ventaja de transmitir datos utilizando UDP en una aplicación en lugar de a través de un flujo 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 eso irrelevante si algunos datos nunca llegan a su destino?


Desea utilizar UDP sobre TCP en los casos en que perder algunos de los datos en el camino no arruinará completamente los datos que se transmiten. Muchos de sus usos son en aplicaciones en tiempo real, como los juegos (es decir, FPS, donde no siempre tienes que saber dónde está cada jugador en un momento dado, y si pierdes algunos paquetes en el camino, nuevos los datos le indicarán correctamente dónde están los reproductores de todos modos, y la transmisión de video en tiempo real (un cuadro corrupto no arruinará la experiencia de visualización).


En algunos casos, como han resaltado otros, 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 querría usar UDP en lugar de TCP es donde está conectando un túnel TCP a través de 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 de la tunelización de TCP en el rendimiento y la latencia de extremo a extremo .


Esta es una de mis preguntas favoritas. UDP es tan mal entendido.

En situaciones en las que 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 de confiabilidad o para reenviarlo. DNS es la descripción perfecta de este caso de uso. Los costos de la configuración de la conexión son demasiado altos (aún así, el DNS también admite el modo TCP).

Otro caso es cuando está entregando datos que pueden perderse porque los nuevos datos que ingresan reemplazarán esos datos / estado anteriores. Los datos del clima, la transmisión de video, un servicio de cotización de acciones (no se usa para transacciones reales), o los datos de juego vienen a la mente.

Otro caso es cuando está administrando una tremenda cantidad de estado 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 pilas TCP de usuario que se pueden usar para que el escritor de la aplicación pueda tener un control más preciso 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 convertir a múltiples hosts mientras que TCP no puede hacer esto en absoluto.


Estoy un poco renuente a sugerir UDP cuando TCP podría funcionar. El problema es que si TCP no funciona por alguna razón, debido a que la conexión está demasiado retrasada o congestionada, es poco probable que el cambio de la aplicación para usar UDP ayude. Una mala conexión es mala para UDP también. TCP ya hace un muy buen trabajo minimizando la congestión.

El único caso que se me ocurre cuando se requiere UDP es para protocolos de transmisión. En los casos en que una aplicación involucre dos hosts conocidos, UDP probablemente solo ofrecerá beneficios de rendimiento marginal para costos de complejidad de código sustancialmente mayores.


La "falta de fiabilidad" de UDP es un formalismo. La transmisión no está absolutamente garantizada. Como 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 el protocolo de enlace de los paquetes TCP es enorme. Realmente enorme No hay una sobrecarga UDP apreciable.

Lo más importante es que puede complementar fácilmente UDP con un apretón de manos de entrega confiable que es menos sobrecarga que TCP. Lee esto: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

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

Cualquier otro tipo de actividad unidireccional de "evento significativo" o "registro" puede manejarse bien con paquetes UDP. Desea enviar una notificación sin construir un socket completo. No esperas ninguna respuesta de los diversos oyentes.

Los mensajes del sistema "latido del corazón" o "Estoy vivo" también son una buena opción. Falta uno no es una crisis. Falta media docena (en una fila) es.


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

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


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

Hay muchas respuestas geniales arriba, pero lo que falta es una evaluación formal y objetiva del impacto de la incertidumbre del transporte en el rendimiento del TCP.

Con el crecimiento masivo de aplicaciones móviles y los paradigmas "ocasionalmente conectados" u "ocasionalmente desconectados" que los acompañan, ciertamente existen situaciones en las que la sobrecarga de los intentos de TCP de mantener una conexión cuando las conexiones son difíciles de lograr conduce a una fuerte Caso de UDP y su naturaleza "orientada al mensaje".

Ahora no tengo las matemáticas / investigación / números en esto, pero he producido aplicaciones que han funcionado de manera más confiable utilizando ACK / NAK y la numeración de mensajes sobre UDP que podría lograrse con TCP cuando la conectividad era generalmente pobre y pobre antigua TCP solo gasté su tiempo y el dinero de mi cliente solo tratando de conectarse. Obtienes esto en áreas regionales y rurales de muchos países occidentales ...


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


Mire la sección 22.4 de la Programación de la Red de 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 dice Steven se puede resumir de la siguiente manera:

  • Use UDP para transmisión y multidifusión ya que es su única opción (use multidifusión para cualquier aplicación nueva)
  • Puede usar UDP para aplicaciones simples de solicitud / respuesta, pero tendrá que crear sus propios acks, tiempos de espera y retransmisiones
  • No utilice UDP para la transferencia de datos a granel.

No siempre es claro. Sin embargo, si necesita una entrega garantizada de paquetes sin pérdida y en la secuencia correcta, probablemente TCP es 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 en secuencia, pero si parte de ellos desaparece, 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) de 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 (p. Ej., Radio por Internet, el orden es importante, pero no todos los paquetes deben pasar).

Ejemplos de dónde se puede usar 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 de DNS 4) Solicitando servicios de LAN, por ejemplo, ¿dónde está? 5) Radio por Internet 6) y muchos otros ...

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


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

  1. Adecuado para procesos que requieren una comunicación simple de solicitud-respuesta.
  2. Adecuado para el proceso que tiene flujo interno, control de errores.
  3. Adecuado para casting amplio y multidifusión.

Ejemplos específicos:

  • utilizado en SNMP
  • Se utiliza para algunos protocolos de actualización de rutas como RIP.

Si se pierde un paquete TCP , será reenviado. Eso no es útil para las aplicaciones que dependen de los datos que se manejan 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 caído no es tan importante: nuestros sentidos no son perfectos, por lo que es posible que ni siquiera nos demos cuenta. Es por eso que este tipo de aplicaciones utilizan UDP lugar de TCP.


Solo usa UDP si realmente sabes lo que estás haciendo. UDP es en casos extremadamente raros hoy en día, pero el número de expertos (incluso muy experimentados) que tratarán de mantenerlo en todas partes parece estar fuera de proporción. Quizás disfruten implementando ellos mismos el código de mantenimiento de conexiones y manejo de errores.

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


Tenemos un servicio web que tiene miles de clientes winforms en tantas PC. Las PC no tienen conexión con el backend DB, todo 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íen un paquete de registro de errores xml (usando el agregador UDP log4net) que se descarga en una tabla de base de datos 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.


Trabajo en un producto que admite la 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. Agregamos soporte TCP / IP hace 3 o 4 años. Supongo que hay un problema: la proporción de códigos UDP a TCP es probablemente 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 por lo tanto deben ser manejados. La ventaja de admitir UDP es que podemos personalizarlo un poco para nuestro propio uso y ajustar un poco más el rendimiento.

Cada red va a ser diferente, pero el protocolo de comunicación UDP es generalmente un poco más rápido para nosotros. El lector escéptico cuestionará correctamente si implementamos todo correctamente. Además, ¿qué puedes esperar de un chico con una reputación de 2 dígitos? Sin embargo, acabo de hacer una prueba por curiosidad. La prueba leyó 1 millón de registros (seleccione * de sometable). Establecí el número de registros para devolver con cada solicitud de cliente individual a 1, 10 y luego a 100 (tres ejecuciones de prueba con cada protocolo). El servidor estaba a solo dos saltos de distancia en una LAN de 100 Mbit. Los números parecían estar de acuerdo con lo que otros han encontrado en el pasado (UDP es aproximadamente un 5% más rápido en la mayoría de las situaciones). Los tiempos totales en milisegundos fueron los siguientes 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 obtiene de forma gratuita con TCP / IP (sumas de comprobación, números de secuencia, etc.). Por ejemplo, Wireshark mostró que una solicitud para el siguiente conjunto de registros fue de 80 bytes con UDP y 84 bytes con TCP.


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 en cuanto a que debe escribir su programa de tal manera que no dependa de la precisión de los paquetes.


UDP es perfecto para direcciones VoIP a las que se debe enviar el paquete de datos, menos su confiabilidad ... El chat de video es un ejemplo de UDP (se puede verificar mediante la captura de red de Wirehark durante cualquier chat de video). Además, TCP no funciona DNS y protocolos SNMP. UDP no tiene ninguna sobrecarga, mientras que TCP tiene mucha sobrecarga


UDP es un protocolo sin conexión y se utiliza en aplicaciones como SNMP (Protocolo simple de administración de red), DNS (Sistema de nombres de dominio) donde los paquetes de datos que llegan fuera de orden, no son confiables y no preocupan, y el envío inmediato de los paquetes de datos es importante.

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

Usado en SNMP, la administración de la red a menudo debe realizarse cuando la red está en tensión, es decir, cuando es difícil lograr una transferencia de datos confiable y controlada por congestión.

aclamaciones


UDP se puede usar cuando una aplicación se preocupa más por los datos "en tiempo real" en lugar de la replicación de datos exacta. Por ejemplo, VOIP puede usar UDP y la aplicación se preocupará por reordenar paquetes, pero al final, VOIP no necesita cada paquete, pero lo más importante es que necesita un flujo continuo de muchos de ellos. Tal vez aquí hay un "fallo" en la calidad de la voz, pero el propósito principal es que recibas el mensaje y no que se recrea de manera perfecta en el otro lado. UDP también se utiliza en situaciones en las que el costo de crear una conexión y la sincronización con TCP supera la carga útil. Las consultas de DNS son un ejemplo perfecto. Un paquete de salida, un paquete de vuelta, por consulta. Si usar TCP, esto sería mucho más intensivo. Si no obtiene la respuesta de DNS, simplemente vuelva a intentarlo.


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


UDP tiene una sobrecarga menor, como ya se dijo, es bueno para transmitir cosas como video y audio donde es mejor perder un paquete y luego intentar reenviarlo y ponerse al día.

No hay garantías en la entrega de TCP, se supone que simplemente se le informará si el socket se desconectó o, básicamente, si los datos no van a llegar. De lo contrario, llega allí cuando llega.

Una cosa importante que la gente olvida es que udp se basa en paquetes, y tcp se basa en bytestream, no hay garantía de que el "paquete tcp" que envió es el paquete que aparece en el otro extremo, se puede dividir en tantos paquetes. Como desean los enrutadores y las pilas. Por lo tanto, su software tiene la sobrecarga adicional de analizar los bytes nuevamente en fragmentos de datos utilizables, que pueden tener una gran cantidad de sobrecarga. UDP puede estar fuera de servicio, por lo que debe numerar sus paquetes o usar 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 se fue, sin cambios. Entonces, el término paquete udp tiene sentido, pero el paquete tcp no necesariamente. TCP tiene su propio mecanismo de reintento y orden que está oculto de su aplicación, puede reinventarlo con UDP para adaptarlo a sus necesidades.

UDP es mucho más fácil escribir código en ambos extremos, básicamente porque no tiene que hacer y mantener las conexiones punto a punto. Por lo general, mi pregunta es ¿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 es el paquete completo que se envió, ¿está mejor? (es probable que deseche dos paquetes si se molesta en verificar la longitud / contenido)


Una de las mejores respuestas que conozco para esta pregunta proviene del usuario zAy0LfpBZLC8mAC en Hacker News . Esta respuesta es tan buena que la citaré como está.

TCP tiene bloqueo de cabecera de cola, ya que garantiza la entrega completa y en orden, por lo que cuando un paquete se pierde en el tránsito, tiene que esperar a que se vuelva a transmitir el paquete faltante, mientras que UDP entrega paquetes a la aplicación a medida que llegan , incluidos los duplicados y sin ninguna garantía de que llegue un paquete o a qué orden llegan (realmente es esencialmente IP con números de puerto y una suma de control de carga útil (opcional) agregada), pero eso está bien para la telefonía, por ejemplo, donde generalmente simplemente no importa cuando faltan unos pocos milisegundos de audio, pero el retraso es muy molesto, por lo que no se molesta en retransmitir, simplemente suelte cualquier duplicado, ordene los paquetes reordenados en el orden correcto para unos cientos de milisegundos de búfer de jitter , y si los paquetes no se muestran a tiempo o en absoluto, simplemente se omiten, posiblemente se interpolan donde el códec los admite.

Además, una parte importante de TCP es el control de flujo, para asegurarse de obtener la mayor cantidad posible de recursos, pero sin sobrecargar la red (lo cual es algo redundante, ya que una red sobrecargada eliminará sus paquetes, lo que significa que tendrá que hacerlo). retransmites, 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 puede "reducir la velocidad", y también un ancho de banda adicional no hace que la llamada vaya más rápido.

Además de las aplicaciones de tiempo real / baja latencia, UDP tiene sentido para transacciones realmente pequeñas, como las búsquedas de DNS, simplemente porque no tiene el establecimiento de la conexión TCP y la sobrecarga de eliminación, 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 es probable que la respuesta también lo sea, también puede hacerlo en un viaje de ida y vuelta, sin necesidad de mantener ningún estado en el servidor, y el control de flujo también es un pedido y todo lo que probablemente no sea particularmente útil para tales usos tampoco.

Y luego, puedes usar UDP para construir tus propios reemplazos de TCP, por supuesto, pero probablemente no sea una buena idea sin un conocimiento profundo de la dinámica de la red, los algoritmos modernos de TCP son bastante sofisticados.

Además, creo que debería mencionarse que hay más de UDP y TCP, como SCTP y DCCP. El único problema actualmente es que Internet (IPv4) está lleno de puertas de enlace NAT que hacen que sea imposible utilizar otros protocolos que no sean UDP y TCP en las aplicaciones de usuario final.


Ya hay muchas respuestas buenas aquí, pero me gustaría agregar un factor muy importante, así como un resumen. UDP puede lograr un rendimiento mucho mayor con la sintonización correcta 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 tratar de 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 buffers de tamaño limitado. Estos búferes se llenan hasta su capacidad y los paquetes se eliminan, y TCP se da cuenta de la falta de un acuse de recibo, y limita la velocidad de la conexión para estimar la capacidad. TCP también emplea algo llamado inicio lento , pero el rendimiento (en realidad la ventana de congestión ) se incrementa lentamente hasta que se eliminan los paquetes, y luego se reduce y aumenta de nuevo lentamente hasta que se eliminan los paquetes, etc. Esto hace que el rendimiento de TCP fluctúe. Puedes ver esto claramente cuando descargas un archivo grande.

Debido a que UDP no está utilizando el control de congestión, puede ser más rápido y experimentar un retraso menor porque no buscará maximizar los búferes hasta el punto de caída, es decir, los paquetes UDP pasan menos tiempo en búferes y llegan más rápido con menor retardo. Debido a que UDP no emplea el control de congestión, pero TCP lo hace, puede quitar la capacidad de TCP que cede a los 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 de corrección de errores.

El resultado es que UDP puede:

  • Logre un rendimiento más alto 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 retraso.
  • Configure las conexiones más rápido, ya que no hay un protocolo de enlace inicial para configurar la conexión
  • Transmitir paquetes de multidifusión, mientras que TCP tiene que usar conexiones múltiples.
  • Transmitir 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 de 300 bytes, pero el receptor solo lee 100 bytes y debe averiguar de alguna manera que hay 200 bytes más en camino. Esto es importante si su aplicación transmite mensajes de tamaño fijo, en lugar de un flujo de bytes.

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