Mucha gente hace esta pregunta y piensa en estos términos, pero aquí hay un punto de vista diferente.
TCP y UDP no están en el mismo nivel de abstracción y no son realmente competidores.
Comencemos en un lugar diferente. En términos generales, el trabajo de Internet es obtener paquetes IP (formalmente, datagramas de Protocolo de Internet) de una computadora a otra. IP proporciona lo que llamamos un ” servicio de datagrama de mejor esfuerzo ” a una computadora.
- Suponga que existen máquinas del tiempo. Viajas a 1977 a Stanford, California. ¿Qué mejora de TCP / IP le propondría a su grupo de investigación de redes para mejorar el futuro despliegue y rendimiento de TCP / IP?
- ¿Cuáles son los problemas más comunes en el programa Socket / Network en Linux?
- ¿Cómo se decide entre TCP y UDP? ¿Qué tipos de aplicaciones son más apropiadas para una sobre la otra?
- ¿Qué es el DHCP? ¿Cuáles son los beneficios y las desventajas de usarlo?
- ¿Cómo funcionan los codificadores IP?
Por “servicio de datagrama de mejor esfuerzo” queremos decir que no hay garantía de que ningún datagrama particular llegue a la computadora de destino. Y no hay garantía de que un par de datagramas no se voltee y se entregue fuera de servicio. Y no hay garantía de que no se voltee un poco dentro del datagrama (aunque esto es raro).
Y por “a una computadora”, quiero decir que IP entrega el datagrama a la puerta de la computadora y eso es todo. No hay indicación de qué aplicación en la computadora estará interesada en el datagrama.
Por lo general, las aplicaciones quieren más que el “mejor servicio de datagramas”. Por lo tanto, otros protocolos se basan en la abstracción de datagramas para proporcionar otros tipos de servicios.
La forma más popular de hacerlo es usar TCP, el Protocolo de Control de Transmisión. TCP se ejecuta sobre el “servicio de datagrama de mejor esfuerzo” y lo convierte en un
” flujo de bytes ordenado confiable bidireccional ” entre aplicaciones.
Una aplicación proporciona a TCP una secuencia de bytes, y TCP garantiza que los entregará a la computadora remota con precisión y en orden, si es que llegan allí. TCP proporciona esto no “a una computadora” sino “entre aplicaciones”, lo que significa que TCP tiene otro nivel de direccionamiento que realiza un seguimiento de a qué aplicación pertenece la secuencia (es decir, un número de puerto).
TCP también trata de ser “justo” para otros usuarios de la red, en un sentido muy especializado de “justo”. Hay varios tipos de TCP (por ejemplo, TCP NewReno, TCP Vegas, TCP Cubic) que tienen diferentes tipos de rendimiento y diferentes nociones de “equidad”. Cada sabor puede comunicarse con todos los demás, eso es lo que los hace a todos TCP, pero un sabor no necesariamente compartirá los recursos de red de manera equitativa con otros sabores de TCP. (Por ejemplo, Cubic puede ser injusto para NewReno, y NewReno puede ser injusto para Vegas, etc.)
Muchas aplicaciones usan TCP porque esta es la abstracción que desean. Los protocolos HTTP y SPDY de la Web se ejecutan sobre TCP, al igual que SSH, y SMTP e IMAP para correo electrónico, y YouTube y Netflix y muchos otros protocolos y aplicaciones. A estas aplicaciones no les importa exactamente cuáles son las características de rendimiento; solo quieren un flujo de bytes confiable.
Debido a que TCP es tan popular, el sistema operativo generalmente proporciona un poco de TCP de forma predeterminada como un servicio de SO para todas las aplicaciones. Cualquier aplicación puede abrir un socket de flujo, y boom, pueden insertar bytes en el socket y serán entregados por TCP sobre esos datagramas IP de mejor esfuerzo a la aplicación en el otro lado. Los diferentes sistemas operativos proporcionan diferentes sabores de TCP con diferentes características de rendimiento (por ejemplo, Linux por defecto es TCP Cubic, algunos Windows a TCP Compound) como este valor predeterminado.
Pero algunas aplicaciones no quieren usar el TCP predeterminado. Estas aplicaciones pueden desear un control más preciso sobre las características de rendimiento o la confiabilidad de sus comunicaciones. Para esto, el sistema operativo expone los “datagramas de mejor esfuerzo” de IP a la aplicación para que haga lo que quiera con ellos.
Para hacer esto, el sistema operativo proporciona UDP, el protocolo de datagramas de “usuario”. Es igual que IP , ya que el servicio es datagramas de mejor esfuerzo, pero en lugar de entregar esos datagramas “a una computadora”, hay una capa adicional de direccionamiento que dice qué aplicación está interesada en ellos (y como TCP, UDP hace esto con un número de puerto).
(UDP, UDP “lite” y UDPv6 también incluyen varios grados de protección contra un bit invertido dentro del datagrama, pero en la práctica estos son raros, y las aplicaciones que se preocupan por la integridad aplican una verificación más fuerte).
Las aplicaciones pueden ejecutar lo que quieran sobre UDP, cualquier cosa que se ejecute en datagramas de mejor esfuerzo.
En algunos casos, lo que la aplicación quiere ejecutar es TCP, solo un sabor diferente al que proporciona el sistema operativo de forma predeterminada. Por ejemplo, el programa MixApp (lamentado) utilizó un sabor de TCP (TCP Vegas) que no aumenta los retrasos dentro del hardware de la red (es decir, no exacerba el problema del “bloqueo del búfer”), a diferencia de la mayoría de los sabores TCP proporcionados por el funcionamiento sistemas de hoy. Diríamos que MixApp estaba usando TCP-over-UDP en lugar del típico TCP-over-IP.
A veces, la aplicación quiere ejecutar un “protocolo de transmisión de bytes bidireccional confiable”, pero uno que no sea TCP. Por ejemplo, BitTorrent ahora intenta ejecutar un protocolo llamado LEDBAT (Transporte de fondo de retardo extra bajo) sobre UDP. Sigue siendo confiable, sigue siendo un flujo de bytes bidireccional, pero no es TCP.
Google está trabajando en QUIC para transportar tráfico web, también a través de UDP.
A veces, la aplicación quiere ejecutar un protocolo “bidireccional confiable”, pero no un flujo de bytes. Por ejemplo, Mosh atropella algo llamado el Protocolo de sincronización de estado (SSP). Se asegura de que el usuario pueda ver de manera confiable el contenido actual de la pantalla proporcionada por la aplicación de terminal remota. Si el usuario se desconecta y Mosh pierde algunas actualizaciones intermedias en la pantalla, está bien siempre que pueda obtener el contenido actual lo más rápido posible. Todavía es confiable y bidireccional y está en orden, pero no es un flujo de bytes.
A veces, la aplicación quiere un servicio que no sea “confiable en orden”. Por ejemplo, Skype envía grabaciones cortas de audio comprimido a un oyente remoto. Cada datagrama contiene quizás 1/30 de segundo de audio. Si se pierde un datagrama, Skype puede preferir simplemente hacer un “clic” audible y seguir enviando nuevos datagramas con nuevos fragmentos de audio de 30 segundos por segundo. Por el contrario, un protocolo “confiable en orden” puede seguir intentándolo nuevamente y nuevamente para entregar una vieja porción de audio de lo que dijiste hace diez segundos, reteniendo todo lo demás hasta que llegue esa vieja grabación.
Lo mismo ocurre con NTP (el protocolo de tiempo de la red): utiliza UDP porque el cliente desea sincronizarse con el reloj de un servidor de tiempo con la mayor precisión posible. El cliente solo quiere escuchar una actualización de tiempo que llegue directamente al primer intento. ¡Una actualización de tiempo que se perdió y luego se retransmitió una cierta cantidad de tiempo más tarde no es útil!
A veces, la aplicación quiere un servicio que no sea “bidireccional”. Por ejemplo, el protocolo DNS de multidifusión de Apple (también conocido como Bonjour / Rendezvous) permite que las computadoras y las impresoras se anuncien en una red local enviando un datagrama que va a todas las computadoras. mDNS también está construido sobre UDP.
Por lo tanto, el resultado final, IP y UDP proporcionan el “mejor servicio de datagramas de esfuerzo”. Hay muchos protocolos que puede ejecutar además de esa abstracción.
TCP es uno de esos protocolos, y puede ejecutarse sobre datagramas IP (como se hace normalmente) o datagramas UDP, en el caso de aplicaciones como MixApp que no desean utilizar la implementación “predeterminada” del sistema operativo de TCP.
Además de TCP, hay muchos otros protocolos que se ejecutan sobre el “servicio de datagrama de mejor esfuerzo”, por ejemplo, Skype, BitTorrent (LEDBAT), la Web (QUIC y WebRTC), Mosh (SSP), Bonjour (mDNS), y NTP. Todos estos se ejecutan sobre UDP porque desean proporcionar diferentes tipos de abstracciones o características de rendimiento diferentes que TCP.