web-dev-qa-db-fra.com

Quand est-il approprié d'utiliser UDP au lieu de TCP?

Puisque TCP garantit la livraison des paquets et peut donc être considéré comme "fiable", alors qu'UDP ne garantit rien et que les paquets peuvent être perdus. Quel serait l'avantage de transmettre des données en utilisant UDP dans une application plutôt que via un flux TCP? Dans quel type de situation UDP serait-il le meilleur choix et pourquoi?

Je suppose que UDP est plus rapide car il n'a pas la surcharge de créer et de maintenir un flux, mais cela ne serait-il pas sans importance si certaines données n'atteignent jamais leur destination?

283
Jeff L

C'est l'une de mes questions préférées. UDP est tellement mal compris.

Dans les situations où vous souhaitez obtenir rapidement une réponse simple à un autre serveur, le protocole UDP fonctionne mieux. En général, vous voulez que la réponse soit dans un paquet de réponse et vous êtes prêt à implémenter votre propre protocole de fiabilité ou à renvoyer. DNS est la description parfaite de ce cas d'utilisation. Les coûts de configuration de la connexion sont beaucoup trop élevés (pour le moment, DNS prend également en charge le mode TCP).

Un autre cas est celui où vous transmettez des données qui peuvent être perdues car de nouvelles données entrant remplaceront ces données/états précédents. On pense aux données météorologiques, au streaming vidéo, à un service de cotation boursière (non utilisé pour les transactions réelles) ou aux données de jeu.

Vous pouvez également gérer un nombre considérable d’états et éviter d’utiliser TCP, car le système d’exploitation ne peut gérer autant de sessions. C'est un cas rare aujourd'hui. En fait, il existe désormais des piles user-land TCP pouvant être utilisées de sorte que le rédacteur de l'application dispose d'un contrôle plus fin des ressources nécessaires pour cet état TCP. Avant 2003, UDP était vraiment le seul jeu en ville.

Un autre cas concerne le trafic multidiffusion. UDP peut être multidiffusé sur plusieurs hôtes alors que TCP ne peut pas le faire du tout.

331
drudru

Si un paquet TCP est perdu, il sera renvoyé. Cela n’est pas pratique pour les applications qui reposent sur le traitement des données dans un ordre spécifique en temps réel.

Les exemples incluent le streaming vidéo et en particulier VoIP (par exemple Skype ). Dans ces cas, cependant, un paquet abandonné n'est pas si grave: nos sens ne sont pas parfaits, alors nous ne le remarquerons peut-être pas. C'est pourquoi ces types d'applications utilisent UDP au lieu de TCP.

62
Stephan202

Le "manque de fiabilité" d'UDP est un formalisme. La transmission n'est pas absolument garantie. En pratique, ils passent presque toujours. Ils ne sont tout simplement pas accusés réception et réessayés après un délai d'attente.

Le temps système nécessaire à la négociation d'un socket TCP et à l'établissement de la connexion des paquets TCP est énorme. Vraiment énorme. Il n'y a pas de surcharge UDP appréciable.

Plus important encore, vous pouvez facilement compléter le protocole UDP avec un système de transmission fiable qui génère moins de frais généraux que TCP. Lisez ceci: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

UDP est utile pour la diffusion d'informations dans une application de type publication/abonnement. IIRC, TIBCO utilise beaucoup le protocole UDP pour notifier le changement d’état.

Tout autre type d'activité "d'événement significatif" ou de "journalisation" à sens unique peut être géré de manière agréable avec les paquets UDP. Vous voulez envoyer une notification sans construire un socket entier. Vous n'attendez aucune réponse des différents auditeurs.

Les messages système "battement de coeur" ou "je suis en vie" sont également un bon choix. Manquer un n'est pas une crise. Il manque une demi-douzaine (à la suite).

56
S.Lott

Je travaille sur un produit prenant en charge les communications UDP (IP) et TCP/IP entre le client et le serveur. Cela a commencé avec IPX il y a plus de 15 ans avec le support IP ajouté il y a 13 ans. Nous avons ajouté la prise en charge TCP/IP il y a 3 ou 4 ans. Devinette sauvage à venir: Le rapport de code UDP à TCP est probablement d'environ 80/20. Le produit est un serveur de base de données, la fiabilité est donc essentielle. Nous devons traiter tous les problèmes imposés par UDP (perte de paquets, doublage de paquets, ordre des paquets, etc.) déjà mentionnés dans d'autres réponses. Il y a rarement des problèmes, mais ils se produisent parfois et doivent donc être traités. L'avantage de prendre en charge UDP est que nous sommes en mesure de l'adapter un peu à notre propre utilisation et à Tweak d'en tirer un peu plus de performances.

Chaque réseau sera différent, mais le protocole de communication UDP est généralement un peu plus rapide pour nous. Le lecteur sceptique se demandera à juste titre si nous avons tout mis en œuvre correctement. De plus, que pouvez-vous attendre d'un gars avec un représentant à 2 chiffres? Néanmoins, je viens tout juste de faire un test par curiosité. Le test a lu 1 million d’enregistrements (sélectionnez * dans sometable). J'ai défini le nombre d'enregistrements à renvoyer avec chaque demande client individuelle à 1, 10, puis 100 (trois cycles de test avec chaque protocole). Le serveur n'était qu'à deux pas d'un réseau local à 100 Mbits. Les chiffres semblaient être en accord avec ce que d’autres avaient trouvé dans le passé (le PDU est environ 5% plus rapide dans la plupart des situations). Les temps totaux en millisecondes étaient les suivants pour cet essai particulier:

  1. 1 enregistrement
    • IP: 390,760 ms
    • TCP: 416 903 ms
  2. 10 enregistrements
    • IP: 91 707 ms
    • TCP: 95 662 ms
  3. 100 enregistrements
    • IP: 29 664 ms
    • TCP: 30 968 ms

La quantité totale de données transmise était à peu près la même pour IP et TCP. Nous avons des frais supplémentaires avec les communications UDP car nous avons certains des mêmes éléments que vous obtenez "gratuitement" avec TCP/IP (sommes de contrôle, numéros de séquence, etc.). Par exemple, Wireshark a montré qu'une demande pour le prochain jeu d'enregistrements était de 80 octets avec UDP et de 84 octets avec TCP.

29
Mark Wilkins

Il y a déjà beaucoup de bonnes réponses ici, mais je voudrais ajouter un facteur très important ainsi qu'un résumé. UDP peut atteindre un débit beaucoup plus élevé avec le réglage correct car il n'utilise pas de contrôle de congestion . Le contrôle de congestion dans TCP est très très important. Il contrôle le débit et le débit de la connexion afin de minimiser l'encombrement du réseau en essayant d'estimer la capacité actuelle de la connexion. Même lorsque les paquets sont envoyés sur des liaisons très fiables, comme dans le réseau principal, les routeurs ont des tampons de taille limitée. Ces mémoires tampons se remplissent à leur capacité maximale et les paquets sont alors rejetés. TCP constate cette perte en raison de l'absence d'accusé de réception et limite la vitesse de la connexion afin d'estimer la capacité. TCP utilise également quelque chose appelé démarrage lent , mais le débit (en fait, la fenêtre d'encombrement ) augmente lentement jusqu'à ce que les paquets soient rejetés, puis à nouveau lentement et lentement jusqu'à ce que les paquets soient abandonnés, etc. Cela provoque une fluctuation du débit TCP. Vous pouvez le voir clairement lorsque vous téléchargez un fichier volumineux.

Etant donné que UDP n’utilise pas le contrôle de congestion, il peut être à la fois plus rapide et plus lent, car il ne cherchera pas à maximiser les tampons jusqu’au point de chute, c’est-à-dire que les paquets UDP passent moins de temps dans les tampons et s’y rendent plus rapidement avec un délai plus court. Dans la mesure où UDP n'utilise pas de contrôle de congestion, mais TCP, il peut enlever de la capacité à TCP qui cède la place aux flux UDP.

UDP est toujours vulnérable aux encombrements et aux pertes de paquets, votre application doit donc être prête à gérer ces pertes moins importantes, en utilisant probablement des codes de retransmission ou de correction d'erreur.

Le résultat est que UDP peut:

  • Obtenez un débit supérieur à TCP tant que le taux de chute du réseau respecte les limites que l'application peut gérer.
  • Livrer des paquets plus rapidement que TCP avec moins de retard.
  • Configurez les connexions plus rapidement car il n’ya pas de négociation initiale pour établir la connexion.
  • Transmettez les paquets de multidiffusion, alors que TCP doit utiliser plusieurs connexions.
  • Transmettez des paquets de taille fixe, alors que TCP transmet les données par segments. Si vous transférez un paquet UDP de 300 octets, vous recevrez 300 octets à l’autre extrémité. Avec TCP, vous pouvez alimenter le socket d’envoi sur 300 octets, mais le destinataire ne lit que 100 octets et vous devez savoir qu’il reste 200 octets supplémentaires. Cela est important si votre application transmet des messages de taille fixe plutôt qu'un flux d'octets.

En résumé, le protocole UDP peut être utilisé pour chaque type d'application que TCP peut utiliser, à condition que vous mettiez également en place un mécanisme de retransmission approprié. Le protocole UDP peut être très rapide, avec un faible délai, ne pas être encombré par une connexion, transmettre des datagrammes de taille fixe et peut être utilisé pour la multidiffusion.

15
Andy

UDP est un protocole sans connexion et utilisé dans des applications telles que SNMP (protocole de gestion de réseau simple), DNS (système de noms de domaine) où les paquets de données arrivant en panne, peu fiables et qui ne posent pas de problème et que l'envoi immédiat du paquet de données est important.

Étant donné que UDP n'implique pas d'établissement de connexion, il est préférable d'utiliser UDP plutôt que TCP pour les applications telles que DNS où les délais d'établissement de connexion doivent être évités.

Utilisé dans SNMP en tant que réseau, la gestion doit souvent être effectuée lorsque le réseau est en difficulté, c’est-à-dire quand un transfert de données fiable et contrôlé par encombrement est difficile à obtenir.

à votre santé

15
Arnkrishn

UDP génère moins de temps système et convient parfaitement pour la diffusion en continu de données en temps réel telles que l'audio ou la vidéo, ou dans les cas où cela est acceptable en cas de perte de données.

13
Dana Holt

Une des meilleures réponses que je connaisse à cette question provient de tilisateur zAy0LfpBZLC8mAC sur Hacker News . Cette réponse est tellement bonne que je vais simplement la citer telle quelle.

TCP est bloqué en tête de file d'attente, car il garantit une livraison complète et en ordre. Ainsi, lorsqu'un paquet est perdu en transit, il doit attendre la retransmission du paquet manquant, tandis qu'UDP livre les paquets à l'application à leur arrivée. , y compris les doublons et sans aucune garantie de réception d’un paquet ou de son ordre (il s’agit essentiellement d’IP, de numéros de port et d’une somme de contrôle de charge utile (facultative)), mais cela convient très bien pour la téléphonie, par exemple, où Peu importe quand il manque quelques millisecondes d'audio, mais le retard est très gênant. Par conséquent, vous ne vous souciez pas des retransmissions, il vous suffit de supprimer les doublons, de trier les paquets réorganisés dans le bon ordre pendant quelques centaines de millisecondes de tampon de gigue. , et si les paquets n’apparaissent pas dans le temps ou du tout, ils sont simplement ignorés, éventuellement interpolés là où ils sont pris en charge par le codec.

En outre, une partie importante de TCP est le contrôle de flux, afin de vous assurer que vous obtenez le plus de trafic possible, mais sans surcharger le réseau (ce qui est un peu redondant, puisqu'un réseau surchargé perdra vos paquets, ce qui signifie vous devez faire des retransmissions qui gênent le débit), UDP n’a rien de tout cela - ce qui est logique pour des applications comme la téléphonie, car la téléphonie avec un codec donné nécessite une certaine bande passante, vous ne pouvez pas le ralentir ", et la bande passante supplémentaire ne rend pas l'appel plus rapide.

Outre les applications temps réel/à faible temps de latence, UDP convient parfaitement pour les très petites transactions, telles que les recherches DNS, tout simplement parce qu’il n’a pas le TCP établissement de la connexion et la charge de démontage nécessaires, à la fois en termes de temps de latence et de temps de latence. termes d'utilisation de la bande passante. Si votre demande est inférieure à une MTU typique et que la réponse le est probablement aussi, vous pouvez effectuer votre transaction en un aller-retour, sans qu'il soit nécessaire de conserver aucun état sur le serveur, ni de contrôler le flux, ni de commander cela, ce qui n'est probablement pas particulièrement utile. pour de telles utilisations non plus.

Et puis, vous pouvez utiliser UDP pour construire vos propres TCP remplacements, bien sûr, mais ce n’est probablement pas une bonne idée sans une compréhension approfondie de la dynamique du réseau. Les algorithmes modernes TCP sont plutôt sophistiqués. .

De plus, je suppose qu’il faut mentionner qu’il existe plus que des protocoles UDP et TCP, tels que SCTP et DCCP. Le seul problème actuellement est que l'Internet (IPv4) regorge de passerelles NAT qui rendent impossible l'utilisation de protocoles autres que UDP et TCP dans les applications des utilisateurs finaux.

12
Shital Shah

UDP a un temps système moins élevé, comme indiqué précédemment, il est bon pour le streaming d'éléments tels que la vidéo et l'audio où il est préférable de perdre un paquet, puis d'essayer de le renvoyer et de le rattraper.

Il n'y a aucune garantie sur la livraison TCP, vous êtes simplement censé être informé si le socket est déconnecté ou si les données ne vont pas arriver. Sinon, ça arrive quand ça arrive.

Une grande chose que les gens oublient est que udp est basé sur des paquets, et tcp est basé sur Bytestream, il n'y a aucune garantie que le "paquet TCP" que vous avez envoyé soit le paquet qui apparaît à l'autre bout, il peut être disséqué en autant de paquets comme le désirent les routeurs et les piles. Ainsi, votre logiciel a la charge supplémentaire liée à la réanalyse des octets en blocs de données utilisables, ce qui peut prendre une certaine quantité de temps système. UDP peut être en panne, vous devez donc numéroter vos paquets ou utiliser un autre mécanisme pour les réorganiser si vous le souhaitez. Mais si vous obtenez ce paquet udp, il arrive avec tous les mêmes octets dans le même ordre qu’il est parti, sans changement. Donc, le terme paquet UDP a un sens mais le paquet TCP ne fonctionne pas nécessairement. TCP a son propre mécanisme de réessai et de commande qui est caché de votre application. Vous pouvez réinventer cela avec UDP pour l'adapter à vos besoins.

UDP est beaucoup plus facile à écrire du code pour les deux extrémités, essentiellement parce que vous n'avez pas à faire et à maintenir les connexions point à point. Ma question est généralement quelle est la situation dans laquelle vous souhaiteriez un temps système supplémentaire TCP? Et si vous prenez des raccourcis comme en supposant qu'un "paquet" TCP reçu est le paquet complet qui a été envoyé, est-ce que vous êtes mieux loti? (vous risquez de jeter deux paquets si vous prenez la peine de vérifier la longueur/le contenu)

8
old_timer

Le streaming vidéo est un exemple parfait d'utilisation d'UDP.

7
Daniel A. White

La communication réseau pour les jeux vidéo se fait presque toujours via UDP.

La vitesse est d'une importance capitale et peu importe si les mises à jour sont manquantes, car chaque mise à jour contient l'état actuel complet de ce que le joueur peut voir.

5
17 of 26

Dans certains cas, que d'autres ont soulignés, la garantie de l'arrivée des paquets n'est pas importante et, par conséquent, utiliser UDP convient parfaitement. Il existe d'autres cas où UDP est préférable à TCP.

Un cas unique où vous voudriez utiliser UDP au lieu de TCP est l'endroit où vous tunnelisez TCP sur un autre protocole (tunnels, réseaux virtuels, etc.). Si vous tunnelisez TCP sur TCP, les contrôles d'encombrement de chacun interféreront les uns avec les autres. Par conséquent, on préfère généralement utiliser le tunnel TCP par rapport au protocole UDP (ou à un autre protocole sans état). Voir l'article TechRepublic: Présentation de TCP sur TCP: effets de TCP sur le tunneling sur le débit et la latence de bout en bout .

3
Brian M. Hunt

La question clé était liée à "quel type de situations UDP serait le meilleur choix [sur tcp]"

Les réponses ci-dessus sont nombreuses, mais ce qui manque, c’est une évaluation formelle et objective de l’impact de l’incertitude des transports sur la performance deTCP.

Avec la croissance massive des applications mobiles et les paradigmes "occasionnellement connectés" ou "occasionnellement déconnectés", il y a certainement des situations où la surcharge des efforts de TCP pour maintenir une connexion lorsque les connexions sont difficiles à obtenir conduit à une forte cas pour UDP et sa nature "orientée message".

Maintenant, je n'ai pas les calculs/recherches/chiffres à ce sujet, mais j'ai produit des applications qui fonctionnaient de manière plus fiable en utilisant ACK/NAK et la numérotation des messages via UDP qu'il n'était possible d'obtenir avec TCP lorsque la connectivité était établie. généralement pauvre et vieux TCP vient de passer son temps et l'argent de mon client essayait juste de se connecter. Vous l'obtenez dans les régions et les zones rurales de nombreux pays occidentaux ...

3
Rob Von Nesselrode

Ce n'est pas toujours clair. Cependant, si vous avez besoin de la livraison garantie des paquets sans perte et dans le bon ordre, alors TCP est probablement ce que vous voulez.

D'autre part, le protocole UDP est approprié pour la transmission de paquets d'informations courts où la séquence d'informations est moins importante ou lorsque les données peuvent s'intégrer dans un seul paquet.

Cela convient également lorsque vous souhaitez diffuser la même information à de nombreux utilisateurs.

D'autres fois, cela convient lorsque vous envoyez des données séquencées, mais si certaines d'entre elles disparaissent, vous n'êtes pas trop inquiet (par exemple, une application VOIP).

Certains protocoles sont plus complexes car certaines fonctionnalités (mais pas toutes) de TCP sont nécessaires, mais plus que ce que fournit UDP. C'est là que la couche d'application doit implémenter la fonctionnalité supplémentaire. Dans ces cas, le protocole UDP convient également (par exemple, la radio Internet, l’ordre est important mais tous les paquets ne doivent pas nécessairement passer).

Exemples d'utilisation/d'utilisation possible 1) Un serveur de temps transmettant l'heure correcte à un groupe de machines sur un réseau local. 2) Protocoles VOIP 3) Recherches DNS 4) Demande de services de réseau local, par exemple. Où es-tu? 5) radio Internet 6) et beaucoup d'autres ...

Sous unix, vous pouvez taper grep udp/etc/services pour obtenir une liste des protocoles UDP mis en œuvre aujourd'hui. Il y en a des centaines.

2
Matt

UDP lorsque la vitesse est nécessaire et la précision si les paquets ne le sont pas, et TCP lorsque vous avez besoin de précision.

UDP est souvent plus difficile dans la mesure où vous devez écrire votre programme de telle sorte qu'il ne dépende pas de la précision des paquets.

2
bgw

UDP peut être utilisé lorsqu'une application se préoccupe davantage des données "en temps réel" que de la réplication exacte des données. Par exemple, la voix sur IP peut utiliser le protocole UDP et l'application s'inquiète de la nécessité de réorganiser les paquets, mais au final, la voix sur IP n'a pas besoin de chaque paquet, mais a surtout besoin d'un flux continu de plusieurs d'entre eux. Peut-être que vous avez ici un "petit problème" dans la qualité de la voix, mais l'objectif principal est que vous receviez le message et non qu'il soit recréé de manière parfaite de l'autre côté. Le protocole UDP est également utilisé dans les cas où le coût de la création d'une connexion et de la synchronisation avec TCP est supérieur à la charge utile. Les requêtes DNS en sont un exemple parfait. Un paquet sur, un paquet de retour, par requête. Si vous utilisez TCP, cela serait beaucoup plus intensif. Si vous ne récupérez pas la réponse DNS, il vous suffit de réessayer.

2
RC.

Nous savons que le protocole UDP est un protocole sans connexion, il est donc

  1. adapté aux processus nécessitant une simple communication demande-réponse.
  2. adapté aux processus qui ont un flux interne, contrôle des erreurs
  3. adapté à la diffusion et à la multidiffusion

Exemples spécifiques:

  • utilisé dans SNMP
  • utilisé pour certains protocoles de mise à jour de route tels que RIP
2
vikki

Regardez la section 22.4 de la programmation de réseau Unix de Steven , "Quand utiliser UDP au lieu de TCP".

Voir aussi cette autre SO réponse concernant l'idée fausse selon laquelle UDP est toujours plus rapide que TCP .

Ce que dit Steven peut se résumer comme suit:

  • Utilisez UDP pour la diffusion et la multidiffusion car c'est votre seule option (utilisez la multidiffusion pour toute nouvelle application).
  • Vous pouvez utiliser UDP pour de simples applications de demande/réponse, mais vous devrez intégrer vos propres accusés de réception, délais d'attente et retransmissions.
  • N'utilisez pas UDP pour le transfert de données en masse.
2
Robert S. Barnes

En comparant TCP avec UDP, les protocoles sans connexion tels que UDP garantissent la rapidité, mais pas la fiabilité de la transmission de paquets. Par exemple, dans les jeux vidéo, un réseau fiable n’est généralement pas nécessaire, mais la vitesse est le plus important et l’utilisation du protocole UDP pour les jeux présente l’avantage de réduire les délais réseau.

enter image description here

2
Jorgesys

Nous avons un service Web qui compte des milliers de clients Winforms sur autant de PC. Les PC n’ont pas de connexion avec le backend de la base de données, tous les accès se font via le service Web. Nous avons donc décidé de développer un serveur de journalisation central qui écoute sur un port UDP et que tous les clients envoient un paquet de journal des erreurs xml (à l’aide de log4net UDP appender) qui est transféré dans une table de base de données à la réception. Dans la mesure où nous ne nous soucions pas vraiment si quelques journaux d'erreur sont manqués et avec des milliers de clients, c'est rapide avec un service de journalisation dédié qui ne charge pas le service Web principal.

1
softveda

Vous souhaitez utiliser UDP sur TCP dans les cas où la perte de certaines données en cours de route ne ruinerait pas complètement les données en cours de transmission. Une grande partie de ses utilisations sont dans les applications en temps réel, telles que les jeux (par exemple, les FPS, où il n'est pas toujours nécessaire de savoir où se trouve chaque joueur, et si vous perdez quelques paquets au passage, de nouveaux les données vous indiqueront correctement où sont les lecteurs de toute façon) et le streaming vidéo en temps réel (une image corrompue ne va pas gâcher l'expérience de visionnage).

1
Zachary Murray

Je suis un peu réticent à suggérer UDP quand TCP pourrait éventuellement fonctionner. Le problème est que si TCP ne fonctionne pas pour une raison quelconque, étant donné que la connexion est trop lente ou trop encombrée, il est peu probable que modifier l'application pour utiliser le protocole UDP puisse vous aider. Une mauvaise connexion est également mauvaise pour UDP. TCP fait déjà un très bon travail de réduction des encombrements.

Le seul cas auquel je peux penser où le protocole UDP est requis concerne les protocoles de diffusion. Dans les cas où une application implique deux hôtes connus, UDP n'offrira probablement que des avantages marginaux en termes de performances pour un coût considérablement accru de la complexité du code.