UDP vs TCP, combien plus rapide est-ce? [fermé]

194

Pour l'échange de messages de protocole général, qui peut tolérer une certaine perte de paquets. Combien plus efficace est UDP sur TCP?

Net Citizen
la source
Vous pouvez également ajouter la balise "tcp" car la question concerne également TCP.
Cristian Ciupitu
5
Que signifie «échange de messages de protocole général»? La question doit clarifier ce qu'est l'efficacité. Voulons-nous moins de latence pour un petit message? Ou voulons-nous un débit plus élevé pour un flux continu de données?
Johan Boulé
Tcp a plus de meilleures fonctionnalités que UDP sauf la vitesse.
RAJKUMAR NAGARETHINAM
3
La question de la vitesse TCP vs UDP est théorique. La question dans votre titre ne correspond en fait pas au corps de la question. Les paquets TCP et UDP voyagent exactement à la même vitesse sur le même support.
Ron Maupin

Réponses:

86

UDP est plus rapide que TCP, et la raison simple est que son paquet d'accusé de réception (ACK) inexistant qui permet un flux de paquets continu, au lieu de TCP qui reconnaît un ensemble de paquets, calculé en utilisant la taille de la fenêtre TCP et le temps d'aller-retour (RTT).

Pour plus d'informations, je recommande l' explication Skullbox simple mais très compréhensible (TCP vs UDP)

Fernando Barrocal
la source
19
Il existe en fait de nombreux cas où TCP est en fait plus rapide que UDP. Voir ma réponse ci-dessous.
Robert
2
Ce qui est plus rapide dépend entièrement des caractéristiques du trafic.
4
Bien que la réponse puisse être correcte, elle ne répond pas à la question et répète les connaissances mentionnées ailleurs à plusieurs reprises. Ne mentionne pas non plus que les méthodes UDP fiables avec ACK peuvent être notablement plus rapides que TCP.
Elliot Woods
268

Les gens disent que la chose la plus importante que TCP vous offre est la fiabilité. Mais ce n'est pas vraiment vrai. La chose la plus importante que TCP vous donne est le contrôle de la congestion: vous pouvez exécuter 100 connexions TCP sur une liaison DSL, toutes à vitesse maximale, et les 100 connexions seront productives, car elles "détectent" toutes la bande passante disponible. Essayez cela avec 100 applications UDP différentes, toutes poussant les paquets aussi vite que possible, et voyez comment les choses fonctionnent pour vous.

À plus grande échelle, ce comportement TCP empêche Internet de se bloquer dans un «effondrement de la congestion».

Choses qui ont tendance à pousser les applications vers UDP:

  • Sémantique de livraison de groupe: il est possible de faire une livraison fiable à un groupe de personnes beaucoup plus efficacement que l'accusé de réception point à point de TCP.

  • Livraison dans le désordre: dans de nombreuses applications, tant que vous obtenez toutes les données, peu importe dans quel ordre elles arrivent; vous pouvez réduire la latence au niveau de l'application en acceptant un bloc hors service.

  • Inamitié: sur une partie LAN, vous pouvez ne pas vous soucier si votre navigateur Web fonctionne bien tant que vous blitting les mises à jour du réseau aussi vite que possible.

Mais même si vous vous souciez des performances, vous ne voudrez probablement pas opter pour UDP:

  • Vous êtes désormais en quête de fiabilité, et beaucoup de choses que vous pourriez faire pour implémenter la fiabilité peuvent finir par être plus lentes que ce que TCP fait déjà.

  • Maintenant, vous n'êtes pas favorable au réseau, ce qui peut provoquer des problèmes dans les environnements partagés.

  • Plus important encore, les pare-feu vous bloqueront.

Vous pouvez potentiellement surmonter certains problèmes de performances et de latence TCP en «joignant» plusieurs connexions TCP ensemble; iSCSI le fait pour contourner le contrôle de la congestion sur les réseaux locaux, mais vous pouvez également le faire pour créer un canal de message "urgent" à faible latence (le comportement "URGENT" de TCP est totalement rompu).

tqbf
la source
18
Bonne réponse, j'irais même plus généralement, "contrôle de flux" (par opposition au contrôle de congestion, qui est un sous-ensemble du contrôle de flux). Non seulement plusieurs connexions TCP peuvent partager un lien, mais cela empêcherait également l'expéditeur de déborder le tampon du récepteur s'il interrompait le traitement des données entrantes pour une raison quelconque.
Alex B
1
@AaronLS: les pertes de paquets et les augmentations de RTT (temps aller-retour) (qui peuvent être considérées comme un proxy pour le délai de mise en file d' attente ) sont / peuvent être (par exemple: les réseaux WiFi peuvent perdre des paquets sans congestion réelle, duper certains algorithmes de contrôle de congestion TCP en évitant la congestion) indicateurs de congestion.
ninjalj
2
UDP est un salaud à gérer ... Je suis déjà épuisé à ce sujet. Peu importe ce que je fais, je n'arrive pas à trouver un équilibre entre performances, latence, débit et fiabilité. Idéal pour les choses en temps réel comme les choses sur les minuteries ... mais je travaille sur un remplacement TCP en utilisant UDP et la correction d'erreur directe et c'est beaucoup plus difficile que je ne le pensais. Contrôle de la congestion. Un système universel qui fonctionne tout de même sur les réseaux 1 Go et les réseaux sans fil est une œuvre d'art. J'ai l'impression d'essayer de réassembler les paquets qui ont été chargés dans un fusil de chasse.
Jason Nelson
1
Un autre avantage en faveur de TCP est qu'il est intrinsèquement orienté connexion, ce qui simplifie considérablement la logique de gestion du client d'application ( listen-> accept-> l'état du client est naturellement indépendant des autres clients). La gestion de plusieurs connexions à partir d'un seul client en particulier devient noueuse avec UDP. Et un point en faveur d'UDP est que les piles UDP sont vraiment faciles à implémenter, ce qui est un énorme avantage sur les systèmes embarqués (microcontrôleurs, FPGA, etc., en particulier, une implémentation TCP pour un FPGA est généralement quelque chose que vous voulez simplement acheter auprès de quelqu'un d'autre) et ne pas y penser).
Jason C
1
Tout cela ne fait que supposer que nous sommes intéressés par la livraison de données importantes (sans trop se soucier de la latence). Dans un très peu d' applications (jeux / VoIP), la situation est radicalement différente: nous avons very_small quantité de données, mais se soucient de latences BEAUCOUP; c'est cette chose simple qui représente 99% des utilisations légitimes de l'UDP. Et quelques astuces: (a) la livraison de groupe NE FONCTIONNE PAS sur Internet (et ne le sera probablement jamais), c'est donc le domaine Intranet uniquement; (b) par Google, seulement 8 à 9% de la population Internet a des problèmes avec UDP; (c) "réseau inamical" ne s'applique pas pour le flux à taux fixe
No-Bugs Hare
93

Dans certaines applications, TCP est plus rapide (meilleur débit) que UDP.

C'est le cas lorsque vous effectuez de nombreuses petites écritures par rapport à la taille MTU. Par exemple, j'ai lu une expérience dans laquelle un flux de paquets de 300 octets était envoyé sur Ethernet (1500 octets MTU) et TCP était 50% plus rapide que UDP .

La raison en est que TCP essaiera de mettre les données en mémoire tampon et de remplir un segment de réseau complet, ce qui permettra une utilisation plus efficace de la bande passante disponible.

UDP d'autre part met le paquet sur le fil immédiatement encombrant ainsi le réseau avec beaucoup de petits paquets.

Vous ne devriez probablement pas utiliser UDP sauf si vous avez une raison très spécifique de le faire. D'autant plus que vous pouvez donner à TCP le même type de latence que UDP en désactivant l' algorithme Nagle (par exemple si vous transmettez des données de capteur en temps réel et que vous n'êtes pas inquiet de congestionner le réseau avec beaucoup de petits paquets).

Robert S. Barnes
la source
3
J'ai en fait fait des repères à cet effet. J'envoyais des paquets qui étaient aussi gros que UDP le supporterait sans lever d'exceptions (en Java) et TCP était beaucoup plus rapide. Je suppose que beaucoup d'optimisations du système d'exploitation, des pilotes et du matériel en font également partie.
Charlie
14
@Myforwik: Premièrement, ce n'est pas une implémentation définie, cela fait partie du protocole TCP. Cela s'appelle l'algorithme Nagle. Il aide à prévenir ce qu'on appelle communément le syndrome de la fenêtre idiote. Recherchez les deux termes. Deuxièmement, il n'y a pas de concept de paquets provenant du point de vue TCP. Enfin, le livre "Programmation TCP / IP efficace" consacre un chapitre entier à ce sujet et plusieurs autres chapitres au sujet connexe de savoir quand utiliser TCP vs UDP. J'évoque cette situation (qui est en fait assez courante) parce que le PO a posé une question générale, et c'est l'une des nombreuses réponses possibles.
Robert
46
@Myforwik. Lorsque vous suggérez le moronisme chez les autres, essayez de réaliser que nous avons tous des lacunes dans nos connaissances - vous y compris. SO est, après tout, un forum de partage des connaissances. Presque tous les tireurs à la première personne utilisent UDP, et il est rare qu'ils envoient des paquets à des tailles aussi proches que MTU. Si vous souhaitez aller suggérer à John Carmack quel crétin il était pour avoir proposé cette approche, je vous encourage à vous renseigner en profondeur à cet égard, d'abord. 15 ans, et la valeur d'un code de réseau hautes performances pour une industrie ne se couche pas et ne meurt pas parce que vous pensez que c'est "idiot".
Ingénieur
2
" J'ai lu une expérience dans laquelle un flux de paquets de 300 octets était envoyé via Ethernet (1500 octets MTU) et TCP était 50% plus rapide que UDP. " - pourriez-vous lier cette expérience?
Leviathan
3
@Leviathan C'est dans le livre Programmation TCP / IP efficace.
Robert S.Barnes
31

avec tolérance aux pertes

Voulez-vous dire "avec tolérance aux pertes"?

Fondamentalement, UDP n'est pas "tolérant aux pertes". Vous pouvez envoyer 100 paquets à quelqu'un, et il se peut qu'ils n'en reçoivent que 95, et certains peuvent être dans le mauvais ordre.

Pour des choses comme le streaming vidéo et les jeux multijoueurs, où il vaut mieux manquer un paquet que de retarder tous les autres paquets derrière, c'est le choix évident

Pour la plupart des autres choses cependant, un paquet manquant ou «réorganisé» est essentiel. Vous devez écrire du code supplémentaire à exécuter sur UDP pour réessayer si les choses ont été manquées et appliquer l'ordre correct. Cela ajouterait un peu de frais généraux à certains endroits.

Heureusement, certaines personnes très très intelligentes l'ont fait et l'ont appelé TCP.

Pensez-y de cette façon: si un paquet est manquant, préférez-vous simplement obtenir le prochain paquet le plus rapidement possible et continuer (utiliser UDP), ou avez-vous réellement besoin de ces données manquantes (utilisez TCP). Les frais généraux n'auront pas d'importance à moins que vous ne soyez dans un scénario vraiment à la pointe.

Orion Edwards
la source
1
5 paquets sur 100? C'est beaucoup. Je suppose que ce n'est qu'un exemple. Question: en situation réelle, combien de paquets peuvent être perdus? Parce que si c'est par exemple 2 sur 10000 (plus moins 1), je ne m'en inquiéterais pas.
freakish
1
@freakish, oui, ce n'était qu'un exemple. La quantité réelle de perte de paquets dépend de votre connexion, de vos réseaux en amont, etc. dès que je lancerais un téléchargement en arrière-plan, j'en commencerais à en obtenir (peut-être 10% -20%). C'était il y a environ 5 ans, et des connexions Internet plus rapides peuvent aider.
Orion Edwards
2
Les routeurs Internet abandonnent udp avant
TCP
19

Le protocole le plus performant (en termes de débit) - UDP ou TCP - dépend vraiment des caractéristiques du réseau et du trafic réseau. Robert S. Barnes, par exemple, souligne un scénario dans lequel TCP fonctionne mieux (écritures de petite taille). Maintenant, considérons un scénario dans lequel le réseau est congestionné et a à la fois du trafic TCP et UDP. Les expéditeurs du réseau qui utilisent TCP sentiront la «congestion» et réduiront leurs tarifs d'envoi. Cependant, UDP n'a pas de mécanisme d'évitement de congestion ou de contrôle de congestion, et les expéditeurs utilisant UDP continueraient à pomper des données au même débit. Progressivement, les expéditeurs TCP réduiraient leurs taux d'envoi au strict minimum et si les expéditeurs UDP ont suffisamment de données à envoyer sur le réseau, ils monopoliseraient la majorité de la bande passante disponible. Donc, dans un tel cas, Les expéditeurs UDP auront un débit plus élevé, car ils obtiennent la plus grande part de la bande passante du réseau. En fait, il s'agit d'un sujet de recherche actif - Comment améliorer le débit TCP en présence de trafic UDP. Une façon, à ma connaissance, d'utiliser les applications TCP qui peuvent améliorer le débit consiste à ouvrir plusieurs connexions TCP. De cette façon, même si le débit de chaque connexion TCP peut être limité, la somme totale du débit de toutes les connexions TCP peut être supérieure au débit d'une application utilisant UDP.

gjain
la source
2
Ce n'est pas correct, les routeurs abandonneront UDP avant TCP. Sur un fil partagé, vous pouvez vous noyer avec UDP, mais ce qui est susceptible de se produire dans une situation d'offre excédentaire dépend de la technologie, mais il est assez facile pour UDP de se dégrader au point de ne recevoir que très peu de collisions.
user1496062
J'aime votre explication, mais je ne comprends pas un point. Si les connexions UDP peuvent obtenir tout le trafic (si la bande passante est faible ou les données sont élevées), dans ce cas, votre application si vous utilisez TCP est essentiellement prise en otage par ceux qui utilisent UDP. Si toutes les applications utilisent TCP, elles "jouent bien" les unes avec les autres. Alors pourquoi autoriser UDP sur le rauter en premier lieu?
Igor Čordaš
@PSIXO: Eh bien, TCP et UDP répondent à des exigences d'application différentes, donc les deux sont utilisés par les applications. L'implication de votre suggestion est que nous devrions avoir une infrastructure réseau différente pour le trafic TCP et UDP - une proposition coûteuse, et certainement pas quelque chose que nous pouvons faire maintenant, en particulier avec tous les investissements déjà effectués. C'est pourquoi les chercheurs sont occupés à trouver des moyens alternatifs d'équilibrer le conflit dans les «logiciels».
gjain
Eh bien essentiellement oui, avoir deux infrastructures serait une solution parfaite mais malheureusement ce n'est pas plausible. Ce que je voulais dire avec mon commentaire était que vous surestimez le hit UDP vers TCP parce que si c'était un facteur élevé, les gens désactiveraient simplement UDP sur le routeur (comme ils le font parfois dans les entreprises) s'ils ont besoin de TCP pour fonctionner rapidement. Gardez également à l'esprit que les paquets UDP ont plus de chances d'être suspendus que TCP. Concernant le reste des faits dans votre réponse, je suis entièrement d'accord et le trouve très utile, mais je pense simplement que vous surestimez certains effets.
Igor Čordaš
18

Quand on parle de "ce qui est plus rapide" - il y a au moins deux aspects très différents: le débit et la latence.

Si parler de débit - le contrôle de flux TCP (comme mentionné dans d'autres réponses), est extrêmement important et faire quelque chose de comparable sur UDP, bien que cela soit certainement possible, serait un gros mal de tête (tm). Par conséquent, l'utilisation d'UDP lorsque vous avez besoin d'un débit est rarement considérée comme une bonne idée (sauf si vous souhaitez obtenir un avantage indu sur TCP).

Cependant, si l'on parle de latences - le tout est complètement différent. Alors qu'en l'absence de perte de paquets, TCP et UDP se comportent de manière extrêmement similaire (toute différence, le cas échéant, étant marginale) - après la perte du paquet, le modèle entier change radicalement.

Après toute perte de paquets, TCP attendra la retransmission pendant au moins 200 ms (1 seconde par paragraphe 2.4 de la RFC6298, mais les implémentations modernes pratiques tendent à la réduire à 200 ms). De plus, avec TCP, même les paquets qui ont atteint l'hôte de destination - ne seront pas livrés à votre application jusqu'à ce que le paquet manquant soit reçu (c'est-à-dire que toute la communication est retardée de ~ 200 ms) - BTW, cet effet, appelé Head-of -Le blocage de ligne, est inhérent à tous les flux ordonnés fiables, qu'ils soient TCP ou UDP fiables + ordonnés. Pour aggraver encore les choses - si le paquet retransmis est également perdu, nous parlerons alors d'un retard de ~ 600 ms (en raison de ce que l'on appelle une interruption exponentielle, la première retransmission est de 200 ms et la seconde de 200 * 2 = 400 ms). Si notre canal a 1% de perte de paquets (ce qui n'est pas mauvais selon les normes actuelles), et nous avons un jeu avec 20 mises à jour par seconde - de tels retards de 600 ms se produiront en moyenne toutes les 8 minutes. Et comme 600 ms est plus que suffisant pour vous tuer dans un jeu au rythme rapide - eh bien, c'est assez mauvais pour le gameplay. Ces effets expliquent pourquoi gamedev préfère souvent UDP à TCP.

Cependant, lorsque vous utilisez UDP pour réduire les latences - il est important de réaliser que simplement "utiliser UDP" n'est pas suffisant pour obtenir une amélioration substantielle de la latence, tout dépend de COMMENT vous utilisez UDP. En particulier, bien que les bibliothèques RUDP évitent généralement cette «interruption exponentielle» et utilisent des temps de retransmission plus courts - si elles sont utilisées comme un flux «ordonné fiable», elles doivent quand même souffrir d'un blocage en tête de ligne (donc en cas de double perte de paquets, au lieu de ces 600 ms, nous obtiendrons environ 1,5 * 2 * RTT - ou pour un très bon RTT de 80 ms, c'est un retard de ~ 250 ms, ce qui est une amélioration, mais il est toujours possible de faire mieux). D'autre part, si vous utilisez des techniques décrites dans http://gafferongames.com/networked-physics/snapshot-compression/ et / ou http: // ithare. , il est possible d'éliminer complètement le blocage de tête de ligne (donc pour une perte de double paquet pour un jeu avec 20 mises à jour / seconde, le retard sera de 100 ms quel que soit le RTT).

Et en guise de remarque - si vous n'avez accès qu'à TCP mais pas à UDP (comme dans un navigateur, ou si votre client est derrière l'un des 6-9% de pare-feu laids bloquant UDP) - il semble y avoir un moyen de implémentez UDP-over-TCP sans encourir trop de latences, voir ici: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (assurez-vous de lire également les commentaires (!)).

No-Bugs Hare
la source
13

Chaque connexion TCP nécessite une prise de contact initiale avant la transmission des données. En outre, l'en-tête TCP contient de nombreux frais généraux destinés à différents signaux et à la détection de remise de message. Pour un échange de messages, UDP suffira probablement si une petite chance d'échec est acceptable. Si la réception doit être vérifiée, TCP est votre meilleure option.

Kyle Cronin
la source
Petite chance d'échec et limite de taille de paquet.
11

@Andrew , je vous prie de différer. UDP est le choix dans certains types d'applications en raison des exigences de performances. Un exemple classique est la vidéoconférence. Ce type d'application ne répond pas bien au contrôle TCP.

Un autre aspect à prendre en compte est de savoir si vous allez avoir besoin de la multidiffusion. Si oui, utilisez UDP.

Marcio Aguiar
la source
8
UDP est également utilisé parce que si vous manquez un paquet ou deux, il est probablement trop tard de toute façon, et vous êtes probablement mieux de le sauter et de continuer afin de pouvoir continuer à regarder. Un petit défaut dans la vidéo à cause de certains paquets perdus est bien mieux que d'avoir des tonnes de congestion.
Kibbee
1
Correct - la diffusion multiple du réseau est assez rare, la plupart des routeurs le bloquent.
user1496062
8

Si vous avez besoin de diffuser rapidement un message sur le net entre deux adresses IP qui n'ont même pas encore parlé, alors un UDP va arriver au moins 3 fois plus vite, généralement 5 fois plus vite.

Myforwik
la source
1
Des références?
Gerard
8

Je vais juste clarifier les choses. TCP / UDP sont deux voitures qui roulent sur la route. supposons que les panneaux de signalisation et les obstacles sont des erreurs TCP s'occupe des panneaux de signalisation, respecte tout autour. Conduite lente car quelque chose peut arriver à la voiture. Alors que l' UDP démarre, la vitesse maximale ne respecte pas les panneaux de signalisation. Rien, un chauffeur fou. UDP n'a pas de récupération d'erreur, s'il y a un obstacle, il va juste entrer en collision avec lui puis continuer. Alors que TCP s'assure que tous les paquets sont envoyés et reçus parfaitement, aucune erreur, donc, la voiture passe juste des obstacles sans entrer en collision. J'espère que c'est un bon exemple pour vous de comprendre pourquoi UDP est préféré dans les jeux. Le jeu a besoin de vitesse. TCP est préféré dans les téléchargements, ou les fichiers téléchargés peuvent être corrompus.

Ahmed I. Elsayed
la source
7

UDP est un peu plus rapide dans mon expérience, mais pas de beaucoup. Le choix ne doit pas être fait sur les performances mais sur le contenu des messages et les techniques de compression.

S'il s'agit d'un protocole avec échange de messages , je dirais que la très faible performance que vous prenez avec TCP en vaut la peine. Vous disposez d'une connexion entre deux points d'extrémité qui vous donnera tout ce dont vous avez besoin. N'essayez pas de fabriquer votre propre protocole bidirectionnel fiable par-dessus UDP, sauf si vous êtes vraiment, vraiment confiant dans ce que vous entreprenez.

Andrew
la source
5

Gardez à l'esprit que TCP conserve généralement plusieurs messages sur le fil. Si vous voulez implémenter cela dans UDP, vous aurez beaucoup de travail si vous voulez le faire de manière fiable. Votre solution sera soit moins fiable, moins rapide ou une quantité de travail incroyable. Il existe des applications valides d'UDP, mais si vous posez cette question, la vôtre ne l'est probablement pas.

Leon Timmermans
la source
5

Il y a eu du travail pour permettre au programmeur de bénéficier des deux mondes.

SCTP

C'est un protolol de couche de transport indépendant, mais il peut être utilisé comme bibliothèque fournissant une couche supplémentaire sur UDP. L'unité de communication de base est un message (mappé à un ou plusieurs paquets UDP). Il y a un contrôle de congestion intégré. Le protocole a des boutons et des twiddles pour allumer

  • pour la livraison des messages
  • retransmission automatique des messages perdus, avec des paramètres définis par l'utilisateur

si tout cela est nécessaire pour votre application particulière.

Un problème avec cela est que l'établissement de la connexion est un processus compliqué (et donc lent)

Autres trucs similaires

Une autre chose expérimentale propriétaire similaire

Cela tente également d'améliorer la prise de contact à trois voies de TCP et de modifier le contrôle de la congestion pour mieux gérer les lignes rapides.

user7610
la source
3

Il est inutile de parler de TCP ou UDP sans tenir compte de l'état du réseau. Si le réseau entre les deux points a une qualité très élevée, UDP est absolument plus rapide que TCP, mais dans certains autres cas comme le réseau GPRS, TCP peut être plus rapide et plus fiable que UDP.

zhanglongpan
la source
1

La configuration du réseau est cruciale pour toutes les mesures. Cela fait une énorme différence si vous communiquez via des sockets sur votre machine locale ou avec l'autre bout du monde.

Trois choses que je veux ajouter à la discussion:

  1. Vous pouvez trouver ici un très bon article sur TCP vs UDP dans le contexte du développement de jeux.
  2. De plus, iperf ( jperf améliore iperf avec une interface graphique) est un très bon outil pour répondre vous-même à votre question en mesurant.
  3. J'ai implémenté un benchmark en Python (voir cette question SO ). En moyenne de 10 ^ 6 itérations, la différence pour l'envoi de 8 octets est d'environ 1 à 2 microsecondes pour UDP.
Michael Dorner
la source
1
Pour que la référence soit pertinente pour Internet dans le monde réel, vous devez la relancer avec un simulateur de perte de paquets tel que netem. Si vous le faites correctement (et avec une RTT simulée de 100 ms et une perte de paquets simulée de 1%), les résultats différeront considérablement. En bref - alors que les latences TCP et UDP sont en effet les mêmes pour une perte de paquets nulle - elles commencent à différer BEAUCOUP pour chaque paquet perdu.
No-Bugs Hare