¿Qué usa cuando necesita UDP confiable?

92

Si tiene una situación en la que una conexión TCP es potencialmente demasiado lenta y una 'conexión' UDP es potencialmente demasiado poco confiable, ¿qué usa? Existen varios protocolos UDP estándar confiables, ¿qué experiencias tiene con ellos?

Por favor, discuta un protocolo por respuesta y si alguien más ya mencionó el que usted usa, considere votarlo y usar un comentario para explicarlo si es necesario.

Estoy interesado en las diversas opciones aquí, de las cuales TCP está en un extremo de la escala y UDP en el otro. Hay varias opciones UDP confiables disponibles y cada una trae algunos elementos de TCP a UDP.

Sé que, a menudo, TCP es la elección correcta, pero tener una lista de alternativas suele ser útil para llegar a esa conclusión. Cosas como Enet, RUDP, etc.que se basan en UDP tienen varios pros y contras, ¿las ha usado, cuáles son sus experiencias?

Para evitar dudas, no hay más información, esta es una pregunta hipotética y esperaba que obtuviera una lista de respuestas que detallara las diversas opciones y alternativas disponibles para alguien que necesita tomar una decisión.

Len Holgate
fuente
1
Esta pregunta parece estar fuera de tema porque está encuestando tecnologías
Dave Hillier
Aquellos que piensan que TCP es el mejor en todos los casos, por favor lea: en.wikipedia.org/wiki/Bandwidth-delay_product
nullptr
Wikipedia tiene una buena tabla que compara varios aspectos de UDP, UDP Lite, TCP, Multipath TCP, SCTP, DCCP y RUDP . SCTP admite la mayoría de las funciones de esa lista.
Evgeniy Berezovsky
@EugeneBeresovsky Hice una pequeña investigación sobre SCTP, la mayor parte de la información, incluidas las respuestas SO, hasta 2013 y anteriores. La mayoría de la gente escribió en ese entonces que la adopción de SCTP era muy baja. Me pregunto cómo es hoy. Además, vea este hilo. stackoverflow.com/questions/1171555/…
Michael IV
@MichaelIvanov La adopción es baja. Pero si tiene la intención de usarlo dentro de su centro de datos, no le importa la adopción externa, siempre y cuando los conmutadores y enrutadores no causen problemas (que, en un centro de datos, no deberían), y usted tiene un sistema operativo y soporte de la biblioteca, que puede ser un problema, como se describe en una de las respuestas en la pregunta a la que vinculó.
Evgeniy Berezovsky

Respuestas:

25

Es difícil responder a esta pregunta sin alguna información adicional sobre el dominio del problema. Por ejemplo, ¿qué volumen de datos está utilizando? ¿Con qué frecuencia? ¿Cuál es la naturaleza de los datos? (por ejemplo, ¿es único, datos puntuales? ¿O es un flujo de datos de muestra? etc.) ¿Para qué plataforma está desarrollando? (por ejemplo, escritorio / servidor / integrado) Para determinar qué quiere decir con "demasiado lento", ¿qué medio de red está utilizando?

Pero en términos (¡muy!) Generales, creo que tendrás que esforzarte mucho para vencer a tcp en velocidad, a menos que puedas hacer algunas suposiciones sobre los datos que estás tratando de enviar.

Por ejemplo, si los datos que está intentando enviar son tales que puede tolerar la pérdida de un solo paquete (por ejemplo, datos muestreados regularmente donde la frecuencia de muestreo es muchas veces mayor que el ancho de banda de la señal), probablemente pueda sacrifique cierta confiabilidad de la transmisión al asegurarse de que puede detectar la corrupción de datos (por ejemplo, mediante el uso de una buena crc)

Pero si no puede tolerar la pérdida de un solo paquete, entonces tendrá que comenzar a introducir los tipos de técnicas de confiabilidad que ya tiene tcp. Y, sin poner una cantidad razonable de trabajo, es posible que empiece a integrar esos elementos en una solución de espacio de usuario con todos los problemas de velocidad inherentes que la acompañan.

Andrew Edgecombe
fuente
4
Ok, ajustaré la pregunta. Estoy más interesado en los pros y los contras de los diversos protocolos UDP confiables que existen en lugar de una respuesta de 'usar TCP';)
Len Holgate
9
@Andrew: es muy FÁCIL superar a TCP en dos casos: (1) su aplicación tiene requisitos de confiabilidad más livianos que "todos los datos, siempre en orden, sin duplicados, sin colas excesivas". O (2) está utilizando multidifusión. UDP confiable es muy común para entornos de multidifusión.
Tom
4
Además, TCP sufre horriblemente cuando se usa a través de una conexión WAN (problemas de larga distancia). Por qué, simple. TCP utiliza ventanas donde los paquetes en la ventana deben ser reconocidos. Los protocolos ACK sufren debido a la latencia debido a la distancia de la línea. Google: WAN TCP "velocidad de la luz"
Ajaxx
3
@Ajaxx, tiene mucha razón en esto, sin embargo, TCP / IP lo hace a propósito debido al último colapso de Internet. Si está haciendo un protocolo de alta velocidad de bits sin ningún control de congestión, básicamente la culpa es suya. Si eres dueño de la red, entonces vuélvete loco.
Kevin Nisbet
2
"donde la tasa de muestreo es significativamente mayor que la tasa de nyquist", la tasa de muestreo es siempre el doble de la tasa de nyquist, por definición.
Steve
27

¿Qué pasa con SCTP ? Es un protocolo estándar del IETF (RFC 4960)

Tiene capacidad de fragmentación que podría ayudar a aumentar la velocidad.

Actualización: una comparación entre TCP y SCTP muestra que los rendimientos son comparables a menos que se puedan usar dos interfaces.

Actualización: un buen artículo introductorio .

filántropo
fuente
Eso es bueno, estoy más interesado en cosas que se pueden construir sobre UDP que sobre IP, pero ciertamente es algo que encaja en el espacio de la solución.
Len Holgate
SCTP tiene muchas características excelentes (como multihoming) y con la extensión de confiabilidad parcial (RFC 3758) es una opción increíblemente flexible. Está incluido en las últimas versiones del kernel de Linux, pero para Windows tendrá que instalar su propia pila SCTP.
Andrew Johnson
6
SCTP se puede tunelizar sobre UDP. tools.ietf.org/id/draft-ietf-sigtran-sctptunnel-00.txt
Miles
Gracias Miles, ¡es un enlace útil!
Len Holgate
1
Sí ... Pero algo que se construye sobre UDP en lugar de al mismo nivel que UDP probablemente sea más fácil de implementar en el espacio del usuario, al menos en Windows ...
Len Holgate
21

ENET - http://enet.bespin.org/

Trabajé con ENET como un protocolo UDP confiable y escribí una versión compatible con sockets asíncronos para un cliente mío que lo está usando en sus servidores. Funciona bastante bien, pero no me gusta la sobrecarga que el ping peer to peer agrega a las conexiones inactivas; cuando tienes muchas conexiones, hacer ping a todas ellas regularmente es un trabajo muy intenso.

ENET le brinda la opción de enviar múltiples 'canales' de datos y que los datos enviados no sean confiables, confiables o estén secuenciados. También incluye el ping peer to peer mencionado anteriormente que actúa como un mantener vivo.

Len Holgate
fuente
14

Tenemos algunos clientes de la industria de defensa que utilizan UDT (transferencia de datos basada en UDP) (consulte http://udt.sourceforge.net/ ) y están muy contentos con él. Veo que también tiene una licencia BSD amigable.

Chris Markle
fuente
2
¿Puede dar más detalles sobre sus clientes y sus casos de uso, particularmente en el sector de defensa? Probablemente no, pero vale la pena intentarlo. De hecho, les conté la idea a mis superiores sobre UDT en una aplicación de transferencia de archivos, pero todavía no ha ido a ninguna parte.
Thomas Owens
10

RUDP - Protocolo de datagramas de usuario confiable

Esto proporciona:

  • Reconocimiento de paquetes recibidos
  • Control de ventanas y congestión
  • Retransmisión de paquetes perdidos
  • Overbuffering (más rápido que la transmisión en tiempo real)

Parece un poco más configurable con respecto a mantener vivo que ENet, pero no le brinda tantas opciones (es decir, todos los datos son confiables y están secuenciados, no solo los bits que usted decide que deben ser). Parece bastante sencillo de implementar.

Len Holgate
fuente
Estaba viendo esto, pero no parece haber muchas implementaciones. ¿Tienes una recomendación?
Nicholas
No lo siento. No terminé usándolo al final y siempre iba a hacer una implementación desde cero.
Len Holgate
9

Como han señalado otros, su pregunta es muy general, y si algo es 'más rápido' que TCP depende mucho del tipo de aplicación.

TCP es generalmente lo más rápido posible para la transmisión confiable de datos de un host a otro. Sin embargo, si su aplicación realiza una gran cantidad de pequeñas ráfagas de tráfico y espera respuestas, UDP puede ser más apropiado para minimizar la latencia.

Hay un término medio fácil. El algoritmo de Nagle es la parte de TCP que ayuda a garantizar que el remitente no abrume al receptor de un gran flujo de datos, lo que resulta en congestión y pérdida de paquetes.

Si necesita la entrega confiable y en orden de TCP, y también la respuesta rápida de UDP, y no necesita preocuparse por la congestión al enviar grandes flujos de datos, puede deshabilitar el algoritmo de Nagle:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");
smo
fuente
Como dije, asumiendo que TCP está en un extremo de la escala y UDP en el otro, ¿qué más hay?
Len Holgate
Si quiere ser pedante, la mayoría de los protocolos discutidos se basan en UDP.
smo
La suposición de que TCP está en un extremo y UDP en el otro es falsa. Por ejemplo, UDP no tiene control de flujo, puede enviar fácilmente paquetes demasiado rápido, haciendo que un enrutador intermedio los descarte todos. Qué harás despues ? ¿Ignorar los paquetes perdidos o reenviarlos? Reenvíelos y acabará reimplementando TCP más o menos. Otra opción para una comunicación confiable es SCTP.
nos
1
Una respuesta rápida no necesariamente equivale a un alto rendimiento.
Matt
1
Estoy en desacuerdo. Cuando se utiliza nagle en protocolos basados ​​en TCP con muchos paquetes más pequeños, los fusionará y creará paquetes más grandes. Provoca un ligero retraso en el envío, por lo que la demora puede aumentar muy ligeramente. Sin embargo, el rendimiento puede ser menor con nagle desactivado porque más paquetes = más encabezados de paquetes = mayor sobrecarga. Los paquetes que se caen en una LAN suelen tener más que ver con el llenado de búferes de entrada. Si tiene muchos clientes que envían datos al mismo host, es posible que no haya ninguna diferencia. No creo que apagar y encender Nagle vaya a afectarlo en la práctica.
Matt
8

Cualquiera que decida que la lista anterior no es suficiente y que quiere desarrollar su PROPIO UDP confiable definitivamente debería echar un vistazo a la especificación QUIC de Google, ya que cubre muchos casos complicados y posibles ataques de denegación de servicio. No he jugado con una implementación de esto todavía, y es posible que no desee o necesite todo lo que proporciona, pero vale la pena leer el documento antes de embarcarse en un nuevo diseño UDP "confiable".

Un buen punto de partida para QUIC está aquí , en el Blog de Chromium.

El documento de diseño QUIC actual se puede encontrar aquí .

Len Holgate
fuente
4

Si tiene una situación en la que una conexión TCP es potencialmente demasiado lenta y una 'conexión' UDP es potencialmente demasiado poco confiable, ¿qué usa? Existen varios protocolos UDP estándar confiables, ¿qué experiencias tiene con ellos?

La palabra clave en su oración es "potencialmente". Creo que realmente necesita demostrarse a sí mismo que TCP es, de hecho, demasiado lento para sus necesidades si necesita confiabilidad en su protocolo.

Si desea obtener confiabilidad de UDP, entonces básicamente volverá a implementar algunas de las características de TCP además de UDP, lo que probablemente hará que las cosas sean más lentas que simplemente usar TCP en primer lugar.

17 de 26
fuente
Sí, lo dijo Andrew Edgecombe, pero, como dije, me interesan los pros y los contras de QUÉ alternativas existen. Sin esa lista de alternativas y sus pros y contras, es difícil decidir qué es lo mejor.
Len Holgate
Dada una función de confiabilidad conocida, a veces un flujo UDP se puede ajustar manualmente para superar al flujo TCP en el sistema operativo. Aunque es raro.
Joshua
1
@ 17 de 26, estoy de acuerdo con Len Holgate, TCP será más lento que UDP confiable en algunas circunstancias. Al igual que una red de alta BDP, suponga que tiene una conexión a Internet de 1 Gbps desde China a Nueva York, estoy seguro de que TCP no usará casi toda la velocidad de 1 Gbps. TCP es mejor para la mayoría de las conexiones en la tierra, pero no para la red con producto de alto retardo de ancho de banda.
nullptr
4

El protocolo DCCP, estandarizado en RFC 4340 , "Protocolo de control de congestión de datagramas" puede ser lo que está buscando.

Parece implementado en Linux .

Bortzmeyer
fuente
3

Puede que RFC 5405 , "Pautas de uso de Unicast UDP para diseñadores de aplicaciones", le resulte útil.

Bortzmeyer
fuente
2

¿Consideró comprimir sus datos?

Como se indicó anteriormente, carecemos de información sobre la naturaleza exacta de su problema, pero comprimir los datos para transportarlos podría ayudar.

filántropo
fuente
1
Especialmente con las bibliotecas de compresión modernas. Algunos son tan rápidos como una memoria. por ejemplo, lz4.
Matt
2

RUDP . Muchos servidores de socket para juegos implementan algo similar.

Ingeniero
fuente
-3

La mejor manera de lograr confiabilidad usando UDP es construir la confiabilidad en el programa de aplicación en sí (por ejemplo, agregando mecanismos de reconocimiento y retransmisión)

kushan singh
fuente