web-dev-qa-db-fra.com

Qu'utilisez-vous lorsque vous avez besoin d'un UDP fiable?

Si vous avez une situation où une connexion TCP est potentiellement trop lente et une "connexion" UDP potentiellement trop peu fiable, qu'utilisez-vous? Il existe différents protocoles UDP standard fiables, quelles expériences font vous avez avec eux?

Veuillez discuter d'un protocole par réponse et si quelqu'un d'autre a déjà mentionné celui que vous utilisez, envisagez de le voter et d'utiliser un commentaire pour élaborer si nécessaire.

Je suis intéressé par les différentes options ici, dont TCP est à une extrémité de l'échelle et UDP est à l'autre. Diverses options UDP fiables sont disponibles et chacune apporte quelques éléments de TCP vers UDP.

Je sais que souvent TCP est le bon choix mais avoir une liste des alternatives est souvent utile pour aider à arriver à cette conclusion. Des choses comme Enet, RUDP, etc. qui sont construites sur UDP ont divers avantages et inconvénients, les avez-vous utilisés, quelles sont vos expériences?

Pour éviter tout doute, il n'y a plus d'informations, c'est une question hypothétique et j'espérais qu'elle susciterait une liste de réponses détaillant les différentes options et alternatives disponibles pour quelqu'un qui a besoin de prendre une décision.

89
Len Holgate

Il est difficile de répondre à cette question sans quelques informations supplémentaires sur le domaine du problème. Par exemple, quel volume de données utilisez-vous? À quelle fréquence? Quelle est la nature des données? (par exemple, est-ce unique, des données ponctuelles? Ou s'agit-il d'un flux d'échantillons de données? etc.) Pour quelle plateforme développez-vous? (par exemple, ordinateur de bureau/serveur/intégré) Pour déterminer ce que vous entendez par "trop lent", quel support réseau utilisez-vous?

Mais en termes (très!) Généraux, je pense que vous allez devoir essayer très fort de battre tcp pour la vitesse, à moins que vous ne puissiez faire de dures hypothèses sur les données que vous essayez d'envoyer.

Par exemple, si les données que vous essayez d'envoyer sont telles que vous pouvez tolérer la perte d'un seul paquet (par exemple, des données régulièrement échantillonnées où le taux d'échantillonnage est plusieurs fois supérieur à la bande passante du signal), vous pouvez probablement sacrifiez une certaine fiabilité de la transmission en vous assurant que vous pouvez détecter la corruption des données (par exemple en utilisant un bon crc)

Mais si vous ne pouvez pas tolérer la perte d'un seul paquet, alors vous devrez commencer à introduire les types de techniques de fiabilité que TCP a déjà. Et, sans mettre une quantité raisonnable de travail, vous pouvez constater que vous commencez à intégrer ces éléments dans une solution d'espace utilisateur avec tous les problèmes de vitesse inhérents qui vont avec.

25
Andrew Edgecombe

Qu'en est-il de SCTP . C'est un protocole standard de l'IETF (RFC 4960)

Il a une capacité de segmentation qui pourrait aider à la vitesse.

Mise à jour: un comparaison entre TCP et SCTP montre que les performances sont comparables à moins que deux interfaces puissent être utilisées.

Mise à jour: un Nice article d'introduction .

27
philant

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

J'ai travaillé avec ENET en tant que protocole UDP fiable et écrit une version conviviale pour les sockets asynchrones pour un de mes clients qui l'utilise dans leurs serveurs. Cela fonctionne très bien mais je n'aime pas la surcharge que le ping d'égal à égal ajoute aux connexions autrement inactives; lorsque vous avez beaucoup de connexions, cingler tous régulièrement est un travail très chargé.

ENET vous donne la possibilité d'envoyer plusieurs "canaux" de données et que les données envoyées ne soient pas fiables, fiables ou séquencées. Il comprend également le ping pair à pair susmentionné qui agit comme un maintien en vie.

20
Len Holgate

Nous avons des clients de l'industrie de la défense qui utilisent UDT (UDP-based Data Transfer) (voir http://udt.sourceforge.net/ ) et nous en sommes très satisfaits. Je vois qu'il a également une licence BSD conviviale.

14
Chris Markle

RUDP - Reliable User Datagram Protocol

Cela fournit:

  • Accusé de réception des paquets reçus
  • Fenêtre et contrôle de congestion
  • Retransmission des paquets perdus
  • Overbuffering (plus rapide que le streaming en temps réel)

Il semble légèrement plus configurable pour conserver Alives que ENet, mais il ne vous donne pas autant d'options (c'est-à-dire que toutes les données sont fiables et séquencées, pas seulement les bits que vous décidez de faire). Il semble assez simple à mettre en œuvre.

10
Len Holgate

Comme d'autres l'ont souligné, votre question est très générale, et si quelque chose est "plus rapide" que TCP dépend beaucoup du type d'application.

TCP est généralement aussi rapide que possible pour une diffusion fiable des données d'un hôte à un autre. Cependant, si votre application fait beaucoup de petites rafales de trafic et attend des réponses, UDP peut être plus approprié pour minimiser la latence.

Il existe un terrain d'entente facile. algorithme de Nagle est la partie de TCP qui aide à garantir que l'expéditeur ne submerge pas le récepteur d'un grand flux de données, entraînant une congestion et une perte de paquets.

Si vous avez besoin de la livraison fiable et en ordre de TCP, ainsi que de la réponse rapide d'UDP, et que vous n'avez pas à vous soucier de l'encombrement de l'envoi de gros flux de données, vous pouvez désactiver l'algorithme de Nagle:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");
9
smo

Quiconque décide que la liste ci-dessus n'est pas suffisante et qu'il souhaite développer son propre UDP fiable devrait certainement jeter un œil à la spécification Google QUIC car elle couvre de nombreux cas d'angle complexes et des attaques potentielles de déni de service. Je n'ai pas encore joué avec une implémentation de ceci, et vous pouvez ne pas vouloir ou avoir besoin de tout ce qu'il fournit, mais le document mérite d'être lu avant de se lancer dans une nouvelle conception UDP "fiable".

Un bon point de départ pour QUIC est ici , sur le blog Chromium.

Le document de conception QUIC actuel peut être trouvé ici .

7
Len Holgate

Le protocole DCCP, normalisé dans RFC 434 , "Datagram Congestion Control Protocol" peut être ce que vous recherchez.

Il semble implémenté sous Linux .

4
bortzmeyer

Si vous avez une situation où une connexion TCP est potentiellement trop lente et une "connexion" UDP potentiellement trop peu fiable, qu'utilisez-vous? Il existe différents protocoles UDP standard fiables, quelles expériences font vous avez avec eux?

Le mot clé de votre phrase est "potentiellement". Je pense que vous devez vraiment vous prouver que TCP est, en fait, trop lent pour vos besoins si vous avez besoin de fiabilité dans votre protocole.

Si vous voulez obtenir la fiabilité de UDP, vous allez essentiellement réimplémenter certaines fonctionnalités de TCP au-dessus de UDP, ce qui rendra probablement les choses plus lentes que de simplement utiliser TCP dans le premier endroit.

4
17 of 26

Peut être RFC 5405 , "Unicast UDP Usage Guidelines for Application Designers" vous sera utile.

3
bortzmeyer

Avez-vous pensé à compresser vos données?

Comme indiqué ci-dessus, nous manquons d'informations sur la nature exacte de votre problème, mais la compression des données pour les transporter pourrait vous aider.

2
philant

RUDP . De nombreux serveurs de socket pour les jeux implémentent quelque chose de similaire.

2
Engineer