UDP vs TCP, ¿cuánto más rápido es? [cerrado]

194

Para el intercambio de mensajes de protocolo general, que puede tolerar cierta pérdida de paquetes. ¿Cuánto más eficiente es UDP sobre TCP?

Ciudadano Neto
fuente
También puede agregar la etiqueta "tcp" ya que la pregunta también se refiere al TCP.
Cristian Ciupitu
55
¿Qué significa "intercambio de mensajes de protocolo general"? La pregunta debe aclarar de qué se trata la eficiencia. ¿Queremos menos latencia para un mensaje pequeño? ¿O queremos un mayor rendimiento para un flujo continuo de datos?
Johan Boulé
Tcp tiene más funciones mejores que UDP, excepto Speed.
RAJKUMAR NAGARETHINAM
3
La cuestión de la velocidad TCP vs. UDP es discutible. La pregunta en su título en realidad no coincide con el cuerpo de la pregunta. Los paquetes TCP y UDP viajan exactamente a la misma velocidad en el mismo medio.
Ron Maupin

Respuestas:

86

UDP es más rápido que TCP, y la razón simple es porque su paquete de reconocimiento inexistente (ACK) que permite un flujo continuo de paquetes, en lugar de TCP que reconoce un conjunto de paquetes, calculado utilizando el tamaño de la ventana TCP y el tiempo de ida y vuelta (RTT)

Para obtener más información, recomiendo la explicación simple pero muy comprensible de Skullbox (TCP vs. UDP)

Fernando Barrocal
fuente
19
En realidad, hay muchos casos en los que TCP es realmente más rápido que UDP. Vea mi respuesta a continuación.
Robert S. Barnes
2
Lo que es más rápido depende completamente de las características del tráfico.
44
Aunque la respuesta puede ser correcta, no responde la pregunta y repite el conocimiento mencionado en otra parte repetidamente. Tampoco menciona que los métodos UDP confiables con ACK pueden ser notablemente más rápidos que TCP.
Elliot Woods
268

La gente dice que lo más importante que TCP le brinda es la confiabilidad. Pero eso no es realmente cierto. Lo más importante que TCP le brinda es el control de congestión: puede ejecutar 100 conexiones TCP a través de un enlace DSL, todo a una velocidad máxima, y ​​las 100 conexiones serán productivas, porque todas "perciben" el ancho de banda disponible. Pruebe eso con 100 aplicaciones UDP diferentes, todas enviando paquetes lo más rápido posible, y vea qué tan bien funcionan las cosas para usted.

En una escala mayor, este comportamiento TCP es lo que evita que Internet se bloquee en un "colapso de congestión".

Cosas que tienden a empujar las aplicaciones hacia UDP:

  • Semántica de entrega grupal: es posible hacer una entrega confiable a un grupo de personas mucho más eficientemente que el reconocimiento punto a punto de TCP.

  • Entrega fuera de orden: en muchas aplicaciones, siempre que obtenga todos los datos, no le importa en qué orden llegue; puede reducir la latencia a nivel de aplicación aceptando un bloqueo fuera de orden.

  • Antipático: en una fiesta LAN, es posible que no le importe si su navegador web funciona bien siempre que esté enviando actualizaciones a la red lo más rápido posible.

Pero incluso si le importa el rendimiento, probablemente no quiera usar UDP:

  • Ahora está enganchado a la confiabilidad, y muchas de las cosas que puede hacer para implementar la confiabilidad pueden terminar siendo más lentas de lo que TCP ya hace.

  • Ahora no es amigable con la red, lo que puede causar problemas en entornos compartidos.

  • Lo más importante, los firewalls te bloquearán.

Potencialmente, puede superar algunos problemas de latencia y rendimiento de TCP "conectando" múltiples conexiones TCP juntas; iSCSI hace esto para evitar el control de congestión en las redes de área local, pero también puede hacerlo para crear un canal de mensajes "urgentes" de baja latencia (el comportamiento "URGENTE" de TCP está totalmente roto).

tqbf
fuente
18
Buena respuesta, incluso diría más general, "control de flujo" (a diferencia del control de congestión, que es un subconjunto de control de flujo). No solo varias conexiones TCP pueden compartir un enlace, sino que también evitaría que el emisor desborde el búfer del receptor si pausan el procesamiento de datos entrantes por cualquier motivo.
Alex B
1
@AaronLS: la pérdida de paquetes y el aumento de RTT (tiempo de ida y vuelta) (que puede verse como un proxy para el retraso de la cola ) son / pueden ser (por ejemplo: las redes WiFi pueden perder paquetes sin congestión real, engañando algunos algoritmos de control de congestión TCP para evitar la congestión) Indicadores de congestión.
ninjalj
2
UDP es un bastardo con el que lidiar ... Ya estoy agotado en esto. No importa lo que haga, parece que no puedo encontrar un equilibrio entre rendimiento, latencia, rendimiento y fiabilidad. Ideal para cosas en tiempo real como cosas en temporizadores ... pero estoy trabajando en un reemplazo de TCP usando UDP y corrección de errores de reenvío y esto es mucho más difícil de lo que pensé que sería. Control de congestión. Un sistema universal que funciona en redes de 1 GB y redes inalámbricas de todos modos es una obra de arte. Siento que estoy tratando de volver a armar los paquetes que se cargaron en una escopeta.
Jason Nelson
1
Por cierto, otro a favor de TCP es que está inherentemente orientado a la conexión, lo que simplifica enormemente la lógica de manejo del cliente de la aplicación ( listen-> accept-> el estado del cliente es naturalmente independiente de otros clientes). El manejo de múltiples conexiones de un solo cliente en particular se vuelve complicado con UDP. Y un punto a favor de UDP es que las pilas UDP son realmente fáciles de implementar, lo cual es una gran ventaja en los sistemas integrados (microcontroladores, FPGA, etc.), en particular, una implementación de TCP para un FPGA generalmente es algo que solo desea comprar a otra persona y no pensar en)
Jason C
1
Todo esto solo supone que estamos interesados ​​en la entrega de datos considerables (sin preocuparnos demasiado por la latencia). En bastantes aplicaciones (juegos / VoIP), la situación es drásticamente diferente: tenemos una cantidad muy pequeña de datos, pero nos preocupamos mucho por las latencias MUCHO; Es esta cosa simple la que representa el 99% de los usos legítimos de UDP. Y algunos trucos: (a) la entrega en grupo NO funciona a través de Internet (y es poco probable que lo haga), por lo que es el ámbito exclusivo de la Intranet; (b) según Google, solo el 8-9% de la población de Internet tiene problemas con UDP; (c) la "red hostil" no se aplica a la transmisión de velocidad fija
No-Bugs Hare
93

En algunas aplicaciones, TCP es más rápido (mejor rendimiento) que UDP.

Este es el caso cuando se realizan muchas escrituras pequeñas en relación con el tamaño de MTU. Por ejemplo, leí un experimento en el que se enviaba un flujo de paquetes de 300 bytes a través de Ethernet (MTU de 1500 bytes) y TCP era un 50% más rápido que UDP .

La razón es que TCP intentará almacenar en búfer los datos y completar un segmento de red completo, haciendo así un uso más eficiente del ancho de banda disponible.

UDP, por otro lado, pone el paquete en el cable inmediatamente, lo que congestiona la red con muchos paquetes pequeños.

Probablemente no debería usar UDP a menos que tenga una razón muy específica para hacerlo. Especialmente porque puede darle a TCP el mismo tipo de latencia que UDP deshabilitando el algoritmo de Nagle (por ejemplo, si está transmitiendo datos de sensores en tiempo real y no le preocupa congestionar la red con muchos paquetes pequeños).

Robert S. Barnes
fuente
3
De hecho, he hecho puntos de referencia a este efecto. Estaba enviando paquetes que eran tan grandes como UDP soportaría sin lanzar excepciones (en Java) y TCP era mucho más rápido. Supongo que muchas optimizaciones de SO, controladores y hardware también son parte de esto.
Charlie
14
@Myforwik: Primero, esto no es una implementación definida, es parte del protocolo TCP. Se llama el algoritmo de Nagle. Ayuda a prevenir lo que comúnmente se conoce como síndrome de la ventana tonta. Busca ambos términos. En segundo lugar, no hay un concepto de paquetes desde el punto de vista de TCP. Por último, el libro "Programación efectiva de TCP / IP" dedica un capítulo entero a este tema y muchos otros capítulos al tema relacionado de saber cuándo usar TCP vs. UDP. Menciono esta situación (que en realidad es bastante común) porque el OP hizo una pregunta general, y esta es una de las muchas respuestas posibles.
Robert S. Barnes
46
@Myforwik. Al sugerir el moronismo en otros, trate de darse cuenta de que todos tenemos lagunas en nuestro conocimiento, incluido usted. SO es, después de todo, un foro para compartir conocimientos. Casi todos los tiradores en primera persona usan UDP, y es raro que envíen paquetes a tamaños casi tan grandes como el MTU. Si desea ir y sugerirle a John Carmack qué idiota fue por haber ideado este enfoque, primero le animo a que se eduque a fondo sobre este tema. 15 años, y el valor de una industria de código de red de alto rendimiento no se acuesta y muere porque crees que es "tonto".
Ingeniero
2
" Leí un experimento en el que se enviaba un flujo de paquetes de 300 bytes a través de Ethernet (MTU de 1500 bytes) y TCP era un 50% más rápido que UDP " . ¿Podría vincular este experimento?
Leviatán
3
@Leviathan Está en el libro Programación efectiva de TCP / IP.
Robert S. Barnes
31

con tolerancia a la pérdida

¿Quieres decir "con tolerancia a la pérdida"?

Básicamente, UDP no es "tolerante a pérdidas". Puede enviar 100 paquetes a alguien, y es posible que solo reciban 95 de esos paquetes, y algunos podrían estar en el orden incorrecto.

Para cosas como la transmisión de video y los juegos multijugador, donde es mejor perder un paquete que retrasar todos los demás paquetes detrás de él, esta es la opción obvia

Sin embargo, para la mayoría de las otras cosas, un paquete faltante o 'reorganizado' es crítico. Tendría que escribir un código adicional para ejecutarlo encima de UDP para volver a intentarlo si las cosas se perdieron, y aplicar el orden correcto. Esto agregaría un poco de sobrecarga en ciertos lugares.

Afortunadamente, algunas personas muy muy inteligentes han hecho esto, y lo llamaron TCP.

Piénselo de esta manera: si un paquete se pierde, preferiría obtener el siguiente paquete lo más rápido posible y continuar (use UDP), o realmente necesita esos datos faltantes (use TCP). La sobrecarga no importará a menos que se encuentre en un escenario realmente marginal.

Orion Edwards
fuente
1
¿5 paquetes de 100? Es bastante Supongo que es solo un ejemplo. Pregunta: en una situación real, ¿cuántos paquetes se pueden perder? Porque si es, por ejemplo, 2 de 10000 (más menos 1), entonces no me preocuparía por eso.
extraño
1
@freakish, sí, fue solo un ejemplo. La cantidad real de pérdida de paquetes depende de su conexión, redes ascendentes, etc. Solía ​​jugar muchos juegos en línea, y encontraría que si solo fuera yo usando la conexión a Internet, no obtendría pérdida de paquetes, pero Tan pronto como inicie una descarga en segundo plano, comenzaré a obtener algunos (tal vez 10% -20%). Sin embargo, esto fue hace aproximadamente 5 años, y las conexiones a Internet más rápidas pueden ayudar.
Orion Edwards
2
Los enrutadores de Internet
colocan
19

El protocolo que funciona mejor (en términos de rendimiento), UDP o TCP, realmente depende de las características de la red y del tráfico de la red. Robert S. Barnes, por ejemplo, señala un escenario en el que TCP funciona mejor (escrituras de pequeño tamaño). Ahora, considere un escenario en el que la red está congestionada y tiene tráfico TCP y UDP. Los remitentes en la red que utilizan TCP detectarán la 'congestión' y reducirán sus tarifas de envío. Sin embargo, UDP no tiene ningún mecanismo para evitar la congestión o el control de congestión, y los remitentes que usan UDP continuarán bombeando datos a la misma velocidad. Gradualmente, los remitentes TCP reducirían sus tasas de envío al mínimo y si los remitentes UDP tienen suficientes datos para ser enviados a través de la red, acumularían la mayor parte del ancho de banda disponible. Entonces, en tal caso, Los remitentes UDP tendrán un mayor rendimiento, ya que obtienen el pastel más grande del ancho de banda de la red. De hecho, este es un tema de investigación activo: cómo mejorar el rendimiento de TCP en presencia de tráfico UDP. Una forma, que yo sepa, usando qué aplicaciones TCP pueden mejorar el rendimiento es abriendo múltiples conexiones TCP. De esa manera, aunque el rendimiento de cada conexión TCP puede ser limitado, la suma total del rendimiento de todas las conexiones TCP puede ser mayor que el rendimiento de una aplicación que utiliza UDP.

gjain
fuente
2
Esto no es correcto, los enrutadores dejarán caer UDP antes que TCP. En un cable compartido, UDP puede ahogarse, pero lo que probablemente suceda en una situación de exceso de oferta depende de la tecnología, pero es bastante fácil que UDP se degrade hasta el punto de que se envíen muy pocas colisiones.
user1496062
Me gusta tu explicación, pero no entiendo nada. Si las conexiones UDP pueden obtener todo el tráfico (si el ancho de banda es bajo o los datos son altos) en ese caso, su aplicación si usa TCP es básicamente rehén de aquellos que usan UDP. Si todas las aplicaciones usan TCP, entonces "juegan bien" entre sí. Entonces, ¿por qué permitir UDP en el rauter en primer lugar?
Igor Čordaš
@PSIXO: Bueno, TCP y UDP cumplen diferentes requisitos de aplicación, por lo que ambas son utilizadas por las aplicaciones. La implicación de su sugerencia es que deberíamos tener una infraestructura de red diferente para el tráfico TCP y UDP, una propuesta costosa, y ciertamente no es algo que podamos hacer ahora, especialmente con toda la inversión ya realizada. Es por eso que los investigadores están ocupados buscando formas alternativas de equilibrar el conflicto en el 'software'.
Jueves
Bueno, esencialmente sí, tener dos infraestructuras sería una solución perfecta, pero desafortunadamente no es plausible. Lo que quería decir con mi comentario es que está exagerando el golpe UDP a TCP porque si fuera un factor tan alto, las personas simplemente deshabilitarían UDP en el enrutador (como a veces hacen en las empresas) si necesitan TCP para funcionar rápidamente. Tenga en cuenta también que los paquetes UDP tienen más posibilidades de caerse que TCP. Sobre el resto de los hechos en su respuesta, estoy totalmente de acuerdo y lo encuentro bastante útil, pero creo que está sobreestimando ciertos efectos.
Igor Čordaš 18/0614
18

Cuando se habla de "lo que es más rápido", existen al menos dos aspectos muy diferentes: rendimiento y latencia.

Si se habla de rendimiento , el control de flujo de TCP (como se menciona en otras respuestas) es extremadamente importante y hacer algo comparable a través de UDP, aunque ciertamente posible, sería un gran dolor de cabeza (tm). Como resultado, usar UDP cuando necesita rendimiento , rara vez califica como una buena idea (a menos que desee obtener una ventaja injusta sobre TCP).

Sin embargo, si hablamos de latencias , todo es completamente diferente. Si bien en ausencia de pérdida de paquetes, TCP y UDP se comportan de manera extremadamente similar (cualquier diferencia, si la hay, es marginal): después de que se pierde el paquete, todo el patrón cambia drásticamente.

Después de cualquier pérdida de paquetes, TCP esperará la retransmisión durante al menos 200 ms (1 segundo por el párrafo 2.4 del RFC6298, pero las implementaciones modernas prácticas tienden a reducirlo a 200 ms). Además, con TCP, incluso aquellos paquetes que llegaron al host de destino no se entregarán a su aplicación hasta que se reciba el paquete faltante (es decir, toda la comunicación se retrasa ~ 200 ms) - BTW, este efecto, conocido como Head-of -El bloqueo de línea es inherente a todas las secuencias ordenadas confiables, ya sea TCP o confiable + UDP ordenado. Para empeorar las cosas, si el paquete retransmitido también se pierde, entonces hablaremos de un retraso de ~ 600 ms (debido al llamado retroceso exponencial, la primera retransmisión es de 200 ms y la segunda es de 200 * 2 = 400 ms). Si nuestro canal tiene un 1% de pérdida de paquetes (lo cual no es malo para los estándares actuales), y tenemos un juego con 20 actualizaciones por segundo: tales demoras de 600 ms se producirán en promedio cada 8 minutos. Y como 600 ms es más que suficiente para que te maten en un juego de ritmo rápido, bueno, es bastante malo para el juego. Estos efectos son exactamente por qué los gamedevs a menudo prefieren UDP sobre TCP.

Sin embargo, cuando se usa UDP para reducir las latencias, es importante darse cuenta de que simplemente "usar UDP" no es suficiente para obtener una mejora sustancial de la latencia, se trata de CÓMO está usando UDP. En particular, si bien las bibliotecas RUDP generalmente evitan ese "retroceso exponencial" y usan tiempos de retransmisión más cortos; si se usan como una secuencia "confiable ordenada", todavía tienen que sufrir Bloqueo de cabecera de línea (por lo tanto, en caso de un doble pérdida de paquetes, en lugar de esos 600 ms obtendremos aproximadamente 1.5 * 2 * RTT, o para un RTT de 80 ms bastante bueno, es un retraso de ~ 250 ms, lo cual es una mejora, pero aún es posible hacerlo mejor). Por otro lado, si usa técnicas discutidas en http://gafferongames.com/networked-physics/snapshot-compression/ y / o http: // ithare. , ES posible eliminar por completo el bloqueo de Head-of-Line (por lo que para una pérdida de doble paquete para un juego con 20 actualizaciones / segundo, el retraso será de 100 ms independientemente de RTT).

Y como nota al margen: si tiene acceso solo a TCP pero no a UDP (como en el navegador, o si su cliente está detrás de uno de 6-9% de firewalls feos que bloquean UDP), parece que hay una manera de implemente UDP-sobre-TCP sin incurrir en demasiadas latencias, consulte aquí: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (asegúrese de leer los comentarios también (!)).

Liebre sin bichos
fuente
13

Cada conexión TCP requiere un protocolo de enlace inicial antes de transmitir los datos. Además, el encabezado TCP contiene muchos gastos generales destinados a diferentes señales y detección de entrega de mensajes. Para un intercambio de mensajes, UDP probablemente será suficiente si una pequeña posibilidad de falla es aceptable. Si se debe verificar el recibo, TCP es su mejor opción.

Kyle Cronin
fuente
Pequeña posibilidad de falla y un límite en el tamaño del paquete.
11

@Andrés , le ruego que difiera. UDP es la opción en algunos tipos de aplicaciones debido a los requisitos de rendimiento. Un ejemplo clásico es la videoconferencia. Este tipo de aplicación no responde bien al control TCP.

Otro aspecto a tener en cuenta es si vas a necesitar multidifusión. Si es así, use UDP.

Marcio Aguiar
fuente
8
UDP también se usa porque si pierde uno o dos paquetes, probablemente sea demasiado tarde de todos modos, y probablemente sea mejor simplemente omitirlo y seguir adelante para que pueda seguir viendo. Un pequeño error en el video debido a algunos paquetes descartados es mucho mejor que tener toneladas de congestión.
Kibbee
1
Correcto: la transmisión múltiple de red es bastante rara, la mayoría de los enrutadores la bloquean.
user1496062
8

Si necesita enviar rápidamente un mensaje a través de la red entre dos IP que aún no han hablado, entonces un UDP llegará al menos 3 veces más rápido, generalmente 5 veces más rápido.

Myforwik
fuente
1
¿Alguna referencia?
Gerard
8

Solo dejaré las cosas claras. TCP / UDP son dos autos que se manejan en la carretera. supongamos que las señales de tráfico y los obstáculos son errores TCP se preocupa por las señales de tráfico, respeta todo a su alrededor. Conduzca despacio porque algo le puede pasar al automóvil. Si bien UDP simplemente se aleja, la velocidad máxima no respeta las señales de tráfico. Nada, un conductor loco. UDP no tiene recuperación de errores, si hay un obstáculo, simplemente chocará con él y luego continuará. Si bien TCP se asegura de que todos los paquetes se envíen y reciban perfectamente, no hay errores, por lo tanto, el automóvil simplemente pasa obstáculos sin chocar. Espero que este sea un buen ejemplo para que entiendas, ¿Por qué TCP? UDP es preferido en los juegos. El juego necesita velocidad. se prefiere en descargas, o los archivos descargados pueden estar dañados.

Ahmed I. Elsayed
fuente
7

UDP es un poco más rápido en mi experiencia, pero no por mucho. No se debe elegir el rendimiento sino el contenido del mensaje y las técnicas de compresión.

Si se trata de un protocolo con intercambio de mensajes , sugeriría que el muy leve impacto en el rendimiento que recibe con TCP vale más que la pena. Te dan una conexión entre dos puntos finales que te dará todo lo que necesitas. No intente fabricar su propio protocolo bidireccional confiable sobre UDP a menos que esté realmente seguro de lo que está haciendo.

Andrés
fuente
5

Tenga en cuenta que TCP generalmente mantiene múltiples mensajes en el cable. Si desea implementar esto en UDP, tendrá mucho trabajo si desea hacerlo de manera confiable. Su solución será menos confiable, menos rápida o una cantidad increíble de trabajo. Hay aplicaciones válidas de UDP, pero si hace esta pregunta, probablemente la suya no lo sea.

Leon Timmermans
fuente
5

Se han realizado algunos trabajos para permitir que el programador tenga los beneficios de ambos mundos.

SCTP

Es un protolol de capa de transporte independiente, pero se puede usar como una biblioteca que proporciona una capa adicional sobre UDP. La unidad básica de comunicación es un mensaje (asignado a uno o más paquetes UDP). Hay control de congestión incorporado. El protocolo tiene botones y twiddles para encender

  • en orden de entrega de mensajes
  • retransmisión automática de mensajes perdidos, con parámetros definidos por el usuario

si se necesita algo de esto para su aplicación particular.

Un problema con esto es que el establecimiento de la conexión es un proceso complicado (y por lo tanto lento)

Otras cosas similares

Una cosa experimental propietaria más similar

Esto también trata de mejorar el protocolo de enlace triple de TCP y cambiar el control de congestión para tratar mejor las líneas rápidas.

user7610
fuente
3

No tiene sentido hablar de TCP o UDP sin tener en cuenta la condición de la red. Si la red entre los dos puntos tiene una calidad muy alta, UDP es absolutamente más rápido que TCP, pero en algún otro caso, como la red GPRS, TCP puede ser más rápido y más confiable que UDP.

zhanglongpan
fuente
1

La configuración de la red es crucial para cualquier medición. Hace una gran diferencia, si se está comunicando a través de enchufes en su máquina local o con el otro extremo del mundo.

Tres cosas que quiero agregar a la discusión:

  1. Puedes encontrar aqui un muy buen artículo sobre TCP vs. UDP en el contexto del desarrollo del juego.
  2. Además, iperf ( jperf mejorar iperf con una GUI) es una herramienta muy buena para responder tu pregunta midiendo.
  3. Implementé un punto de referencia en Python (ver esta pregunta SO ). En promedio de 10 ^ 6 iteraciones, la diferencia para enviar 8 bytes es de aproximadamente 1-2 microsegundos para UDP.
Michael Dorner
fuente
1
Para que el punto de referencia sea relevante para el mundo real de Internet, debe volver a ejecutarlo con un simulador de pérdida de paquetes como netem. Si lo hace bien (y con una RTT simulada de, digamos, 100 ms y una pérdida de paquetes simulada del 1%), los resultados serán drásticamente diferentes. En resumen, aunque las latencias TCP y UDP son iguales para una pérdida de paquetes cero, comienzan a diferir MUCHO para cada paquete perdido.
No-Bugs Hare