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 sur un flux TCP? Dans quel genre de situations l'UDP serait-il le meilleur choix, et pourquoi?
Je suppose que UDP est plus rapide car il n'a pas la charge de créer et de maintenir un flux, mais cela ne serait-il pas inutile si certaines données n'atteignent jamais leur destination?
networking
tcp
udp
Jeff L
la source
la source
Réponses:
C'est une de mes questions préférées. UDP est tellement mal compris.
Dans les situations où vous voulez vraiment obtenir rapidement une réponse simple à un autre serveur, UDP fonctionne mieux. En général, vous voulez que la réponse soit dans un seul paquet de réponse et vous êtes prêt à implémenter votre propre protocole pour la fiabilité ou à renvoyer. DNS est la description parfaite de ce cas d'utilisation. Les coûts des configurations de connexion sont beaucoup trop élevés (pourtant, DNS prend également en charge un mode TCP).
Un autre cas est celui où vous livrez des données qui peuvent être perdues car de nouvelles données entrant remplaceront ces données / états précédents. Les données météorologiques, le streaming vidéo, un service de cotation d'actions (non utilisé pour le trading réel) ou les données de jeu viennent à l'esprit.
Un autre cas est lorsque vous gérez une quantité énorme d'état et que vous voulez éviter d'utiliser TCP car le système d'exploitation ne peut pas gérer autant de sessions. C'est un cas rare aujourd'hui. En fait, il y a maintenant des piles TCP utilisateur-terre qui peuvent être utilisées afin que le rédacteur d'application puisse avoir un contrôle plus fin sur les ressources nécessaires pour cet état TCP. Avant 2003, UDP était vraiment le seul jeu en ville.
Un autre cas concerne le trafic multicast. UDP peut être multidiffusé sur plusieurs hôtes alors que TCP ne peut pas du tout le faire.
la source
Si un paquet TCP est perdu, il sera renvoyé. Ce 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 la VoIP (par exemple Skype ). Dans ces cas, cependant, un paquet abandonné n'est pas si grave: nos sens ne sont pas parfaits, donc nous ne pouvons même pas le remarquer. C'est pourquoi ces types d'applications utilisent UDP au lieu de TCP.
la source
Le "manque de fiabilité" de l'UDP est un formalisme. La transmission n'est pas absolument garantie. En pratique, ils réussissent presque toujours. Ils ne sont tout simplement pas reconnus et réessayés après un temps mort.
La surcharge de négociation d'un socket TCP et de négociation 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 UDP avec une poignée de main fiable de livraison qui est moins lourde que TCP. Lisez ceci: http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol
UDP est utile pour diffuser des informations dans une application de type publication-abonnement. IIRC, TIBCO fait un usage intensif de l'UDP pour la notification de changement d'état.
Tout autre type d'activité "d'événement significatif" ou de "journalisation" unidirectionnelle peut être bien géré avec les paquets UDP. Vous souhaitez envoyer une notification sans construire une socket entière. Vous n'attendez aucune réponse des différents auditeurs.
Les messages «rythme cardiaque» ou «Je suis vivant» du système sont également un bon choix. En manquer un n'est pas une crise. Il manque une demi-douzaine (d'affilée).
la source
Je travaille sur un produit qui prend en charge les communications UDP (IP) et TCP / IP entre le client et le serveur. Il a commencé avec IPX il y a plus de 15 ans et le support IP a été ajouté il y a 13 ans. Nous avons ajouté le support TCP / IP il y a 3 ou 4 ans. Devinette à venir: Le rapport de code UDP sur TCP est probablement d'environ 80/20. Le produit est un serveur de base de données, la fiabilité est donc essentielle. Nous devons gérer 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 surviennent parfois et doivent donc être traités. L'avantage de la prise en charge d'UDP est que nous sommes en mesure de le personnaliser un peu à notre propre usage et d'en modifier un peu plus les performances.
Chaque réseau va être 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 de lancer un test par curiosité. Le test a lu 1 million d'enregistrements (sélectionnez * à partir de quelque chose). J'ai défini le nombre d'enregistrements à renvoyer avec chaque demande individuelle de client à 1, 10, puis 100 (trois cycles de test avec chaque protocole). Le serveur n'était qu'à deux sauts sur un LAN à 100 Mbits. Les chiffres semblaient correspondre à ce que d'autres ont trouvé dans le passé (l'UDP est environ 5% plus rapide dans la plupart des situations). Les temps totaux en millisecondes étaient les suivants pour ce test particulier:
La quantité totale de données transmises était à peu près la même pour IP et TCP. Nous avons des frais supplémentaires avec les communications UDP parce que nous avons certains des mêmes choses 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 ensemble d'enregistrements était de 80 octets avec UDP et 84 octets avec TCP.
la source
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 un réglage correct car il n'utilise pas de contrôle de congestion . Le contrôle de la congestion dans TCP est très trèsimportant. Il contrôle le débit et le débit de la connexion afin de minimiser la congestion du réseau en essayant d'estimer la capacité actuelle de la connexion. Même lorsque des 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 tampons se remplissent à leur capacité et les paquets sont ensuite supprimés, et TCP remarque cette baisse par le manque d'accusé de réception reçu, ce qui limite la vitesse de la connexion à l'estimation de la capacité. TCP utilise également quelque chose appelé démarrage lent , mais le débit (en fait la fenêtre de congestion) est lentement augmentée jusqu'à ce que les paquets soient abandonnés, puis est abaissée et augmentée à nouveau lentement jusqu'à ce que les paquets soient supprimés, etc. Cela fait fluctuer le débit TCP. Vous pouvez le voir clairement lorsque vous téléchargez un gros fichier.
Parce que UDP n'utilise pas le contrôle de congestion, il peut être à la fois plus rapide et subir moins de retard 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 y arrivent plus rapidement avec moins de retard. Parce que UDP n'utilise pas le contrôle de congestion, mais TCP le fait, il peut retirer la capacité de TCP qui cède aux flux UDP.
UDP est toujours vulnérable à la congestion et aux pertes de paquets, donc votre application doit être prête à gérer ces complications d'une manière ou d'une autre, probablement à l'aide de codes de retransmission ou de correction d'erreur.
Le résultat est que UDP peut:
En résumé, UDP peut être utilisé pour chaque type d'application que TCP peut, tant que vous implémentez également un mécanisme de retransmission approprié. UDP peut être très rapide, a moins de retard, n'est pas affecté par la congestion sur une base de connexion, transmet des datagrammes de taille fixe et peut être utilisé pour la multidiffusion.
la source
UDP a moins de frais généraux et est bon pour faire des choses comme le streaming de données en temps réel comme l'audio ou la vidéo, ou dans tous les cas où c'est correct si des données sont perdues.
la source
UDP est un protocole sans connexion et est utilisé dans des protocoles comme SNMP et DNS dans lesquels les paquets de données arrivant dans le désordre sont acceptables et la transmission immédiate des paquets de données est importante.
Il est utilisé dans SNMP car la gestion du réseau doit souvent être effectuée lorsque le réseau est en situation de stress, c'est-à-dire lorsqu'il est difficile d'obtenir un transfert de données fiable et contrôlé par la congestion.
Il est utilisé dans DNS car il n'implique pas d'établissement de connexion, évitant ainsi les retards d'établissement de connexion.
à votre santé
la source
L'une des meilleures réponses que je connaisse à cette question vient de l' utilisateur zAy0LfpBZLC8mAC de Hacker News . Cette réponse est si bonne que je vais la citer telle quelle.
la source
Le streaming vidéo est un parfait exemple d'utilisation de l'UDP.
la source
UDP a des frais généraux inférieurs, comme indiqué déjà, est bon pour diffuser des choses comme la vidéo et l'audio où il vaut mieux simplement perdre un paquet puis essayer de renvoyer et de rattraper son retard.
Il n'y a aucune garantie sur la livraison TCP, vous êtes simplement censé être informé si le socket est déconnecté ou, fondamentalement, si les données ne vont pas arriver. Sinon, il y arrive quand il y arrive.
Une grande chose que les gens oublient est que udp est basé sur des paquets et tcp est basé sur un flux de sortie, il n'y a aucune garantie que le "paquet tcp" que vous avez envoyé est le paquet qui apparaît à l'autre extrémité, il peut être disséqué en autant de paquets comme le désirent les routeurs et les piles. Votre logiciel a donc la surcharge supplémentaire de l'analyse des octets en morceaux utilisables, ce qui peut prendre une bonne quantité de surcharge. UDP peut être hors service, 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 a quitté, aucun changement. Le terme paquet udp a donc un sens, mais pas nécessairement le paquet tcp. TCP a son propre mécanisme de réessai et de commande qui est caché à votre application,
UDP est beaucoup plus facile à écrire du code aux deux extrémités, essentiellement parce que vous n'avez pas à établir et à maintenir les connexions point à point. Ma question est généralement où sont les situations où vous voudriez la surcharge TCP? Et si vous prenez des raccourcis comme en supposant qu'un "paquet" TCP reçu est le paquet complet qui a été envoyé, vous êtes mieux? (vous risquez de jeter deux paquets si vous prenez la peine de vérifier la longueur / le contenu)
la source
La communication réseau pour les jeux vidéo se fait presque toujours via UDP.
La vitesse est de la plus haute importance et peu importe si des mises à jour sont manquées car chaque mise à jour contient l'état actuel complet de ce que le joueur peut voir.
la source
La question clé était liée à "quel genre de situations l'UDP serait-il le meilleur choix [par rapport à TCP]"
Il y a beaucoup de bonnes réponses ci-dessus, mais ce qui manque, c'est une évaluation formelle et objective de l'impact de l'incertitude de transport sur les performances TCP.
Avec la croissance massive des applications mobiles et les paradigmes "parfois connectés" ou "parfois déconnectés" qui les accompagnent, il y a certainement des situations où la surcharge des tentatives 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 mathématiques / recherches / chiffres à ce sujet, mais j'ai produit des applications qui ont fonctionné de manière plus fiable en utilisant et ACK / NAK et la numérotation des messages sur UDP que ce qui pourrait être obtenu avec TCP lorsque la connectivité était généralement mauvaise et pauvre ancien TCP vient de passer son temps et l'argent de mon client à essayer de se connecter. Vous obtenez cela dans les zones régionales et rurales de nombreux pays occidentaux ....
la source
Dans certains cas, que d'autres ont mis en évidence, l'arrivée garantie des paquets n'est pas importante, et donc l'utilisation d'UDP est très bien. 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 celui où vous tunnelisez TCP sur un autre protocole (par exemple tunnels, réseaux virtuels, etc.). Si vous tunnelisez TCP sur TCP, les contrôles de congestion de chacun interfèrent les uns avec les autres. Par conséquent, on préfère généralement tunneler TCP sur UDP (ou un autre protocole sans état). Consultez l'article TechRepublic: Comprendre TCP sur TCP: effets du tunneling TCP sur le débit et la latence de bout en bout .
la source
UDP peut être utilisé lorsqu'une application se soucie davantage des données "en temps réel" plutôt que de la réplication exacte des données. Par exemple, VOIP peut utiliser UDP et l'application s'inquiétera de réorganiser les paquets, mais en fin de compte, VOIP n'a pas besoin de chaque paquet, mais plus important encore, il a besoin d'un flux continu de beaucoup d'entre eux. Peut-être que vous avez ici un "problème" dans la qualité de la voix, mais le but principal est que vous obteniez le message et non qu'il soit parfaitement recréé de l'autre côté. UDP est également utilisé dans des situations où les frais de création d'une connexion et de synchronisation avec TCP l'emportent sur la charge utile. Les requêtes DNS en sont un parfait exemple. Un paquet en sortie, un paquet en arrière, par requête. Si vous utilisez TCP, cela serait beaucoup plus intensif. Si vous ne récupérez pas la réponse DNS, réessayez simplement.
la source
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 manière qu'il ne dépende pas de la précision des paquets.
la source
Ce n'est pas toujours clair. Cependant, si vous avez besoin d'une livraison garantie de paquets sans perte et dans la bonne séquence, TCP est probablement ce que vous voulez.
D'un autre côté, UDP est approprié pour transmettre de courts paquets d'informations lorsque la séquence des informations est moins importante ou lorsque les données peuvent tenir dans un seul paquet.
Il convient également lorsque vous souhaitez diffuser les mêmes informations à de nombreux utilisateurs.
D'autres fois, c'est approprié lorsque vous envoyez des données séquencées mais si certaines d'entre elles manquent, vous n'êtes pas trop inquiet (par exemple une application VOIP).
Certains protocoles sont plus complexes car ce qui est nécessaire, ce sont certaines (mais pas toutes) des fonctionnalités de TCP, mais plus que ce que fournit UDP. C'est là que la couche application doit implémenter les fonctionnalités supplémentaires. Dans ces cas, UDP est également approprié (par exemple, radio Internet, l'ordre est important mais tous les paquets n'ont pas besoin de passer).
Exemples où il est / pourrait être utilisé 1) Un serveur de temps diffusant l'heure correcte à un tas de machines sur un LAN. 2) Protocoles VOIP 3) Recherches DNS 4) Demande de services LAN, par exemple, où êtes-vous? 5) Radio Internet 6) et bien d'autres ...
Sous Unix, vous pouvez taper grep udp / etc / services pour obtenir une liste des protocoles UDP implémentés aujourd'hui ... il y en a des centaines.
la source
Regardez la section 22.4 de la programmation réseau Unix de Steven , "Quand utiliser UDP au lieu de TCP".
Voir également cette autre réponse SO sur l'idée fausse selon laquelle UDP est toujours plus rapide que TCP .
Ce que dit Steven peut se résumer comme suit:
la source
Nous savons que l'UDP est un protocole sans connexion, il est donc
Exemples spécifiques:
la source
En comparant TCP avec UDP, des protocoles sans connexion comme UDP assurent la vitesse, mais pas la fiabilité de la transmission de paquets. Par exemple, dans les jeux vidéo, ils n'ont généralement pas besoin d'un réseau fiable, mais la vitesse est la plus importante et l'utilisation de l'UDP pour les jeux a l'avantage de réduire le retard du réseau.
la source
Vous souhaitez utiliser UDP sur TCP dans les cas où la perte de certaines données en cours de route ne ruinera pas complètement les données transmises. Beaucoup de ses utilisations se font dans des applications en temps réel, telles que les jeux (par exemple, FPS, où vous n'avez pas toujours besoin de savoir où se trouve chaque joueur à un moment donné, et si vous perdez quelques paquets en cours de route, de nouveaux les données vous indiqueront correctement où se trouvent les lecteurs de toute façon) et le streaming vidéo en temps réel (une image corrompue ne ruinera pas l'expérience de visionnement).
la source
Nous avons un service Web qui a des milliers de clients Winforms sur autant de PC. Les PC n'ont pas de connexion avec le backend DB, tout l'accès se fait via le service web. Nous avons donc décidé de développer un serveur de journalisation central qui écoute sur un port UDP et tous les clients envoient un paquet de journal d'erreurs xml (à l'aide de l'appendeur UDP log4net) qui est transféré dans une table DB dès réception. Comme nous ne nous soucions pas vraiment si quelques journaux d'erreurs 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.
la source
Je suis un peu réticent à suggérer UDP alors que TCP pourrait éventuellement fonctionner. Le problème est que si TCP ne fonctionne pas pour une raison quelconque, parce que la connexion est trop lente ou encombrée, il est peu probable que changer l'application pour utiliser UDP puisse aider. Une mauvaise connexion est également mauvaise pour UDP. TCP fait déjà un très bon travail pour minimiser la congestion.
Le seul cas où je peux penser où UDP est requis est pour les protocoles de diffusion. Dans les cas où une application implique deux hôtes connus, UDP n'offrira probablement que des avantages de performance marginaux pour des coûts considérablement accrus de complexité du code.
la source
N'utilisez UDP que si vous savez vraiment ce que vous faites. L'UDP est dans des cas extrêmement rares aujourd'hui, mais le nombre d'experts (même très expérimentés) qui essaieraient de le coller partout semble hors de proportion. Ils aiment peut-être eux-mêmes implémenter le code de gestion des erreurs et de maintenance des connexions.
TCP devrait être beaucoup plus rapide avec les cartes d'interface réseau modernes en raison de ce qu'on appelle l' empreinte de somme de contrôle . Étonnamment, à des vitesses de connexion rapides (telles que 1 Gbit / s), le calcul d'une somme de contrôle représenterait une charge importante pour un processeur.Il est donc déchargé sur le matériel NIC qui reconnaît les paquets TCP pour l'impression, et il ne vous offrira pas le même service.
la source
UDP est parfait pour les adresses VoIP où les paquets de données doivent être envoyés, moins sa fiabilité ... Protocoles DNS et SNMP. UDP n'a pas de surcharge tandis que TCP a beaucoup de surcharge
la source