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?
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?
Réponses:
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)
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).
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).
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).
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.
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.
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 (!)).
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.
@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.
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.
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.
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.
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
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.
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.
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: