136 votes

Ce qui ' la différence entre flux et datagrammes dans la programmation de réseau ?

Quelle est la différence entre les prises de vs sockets (stream) (datagrammes) ? Pourquoi utiliser un sur l’autre ?

322voto

cdhowie Points 62253

Il y A longtemps j'ai lu une grande analogie pour expliquer la différence entre les deux. Je ne me souviens pas où je l'ai lu donc je ne peux malheureusement pas de crédit à l'auteur de l'idée, mais j'ai aussi ajouté beaucoup de mes propres connaissances à la base de l'analogie, de toute façon. Donc voilà:

Un socket de flux, c'est comme un appel téléphonique -- un côté les lieux de l'appel, les autres réponses, vous dire bonjour à l'autre (SYN/ACK TCP), et puis vous l'échange d'informations. Une fois que vous avez terminé, vous dire au revoir (FIN/ACK TCP). Si l'une des parties n'entend pas un au revoir, ils seront généralement appel le dos des autres puisque c'est un événement inattendu; en général, le client se connecte au serveur. Il ya une garantie que les données n'arrivera pas dans un ordre différent de celui que vous avez envoyé, et il y a une garantie raisonnable que les données ne seront pas endommagés.

Un socket datagramme est comme passer d'une note dans la classe. Considérons le cas où vous n'êtes pas directement à côté de la personne que vous êtes de passage la note; la note de voyage d'une personne à l'autre. Il ne peut pas atteindre sa destination, et il peut être modifié par le temps qu'il y arrive. Si vous passez deux notes à la même personne, ils peuvent arriver dans un ordre que vous n'avez pas l'intention, depuis la route de la note dans les salles de classe ne peut pas être la même, une personne pourrait ne pas passer une note aussi vite que l'autre, etc.

Si vous utilisez un flux de courant quand l'information dans l'ordre et intacte est important. Protocoles de transfert de fichiers sont un bon exemple ici. Vous ne voulez pas télécharger un fichier avec son contenu mélangées au hasard autour de et endommagé!

Vous pouvez utiliser une socket datagramme lorsque l'ordre est moins important que la livraison en temps opportun (pensez à la VoIP ou le jeu de protocoles), lorsque vous ne voulez pas que la hausse des frais généraux d'un cours d'eau (c'est pourquoi le DNS est principalement un protocole de datagramme, de sorte que les serveurs peuvent répondre à beaucoup de demandes, à la fois très vite), ou lorsque vous ne vous inquiétez pas trop si les données atteint jamais sa destination.

Pour se développer sur le protocole VoIP/jeu en cas, de tels protocoles comprennent leurs propres données-mécanisme de traitement des commandes. Mais si un paquet est endommagé ou perdu, vous ne voulez pas attendre sur le protocole de flux de données (généralement TCP) pour émettre un ré-envoyer la demande -- vous avez besoin de récupérer rapidement. TCP peut prendre jusqu'à un certain nombre de minutes pour récupérer, et en temps réel des protocoles comme les jeux ou la VoIP même trois secondes peut être inacceptable! À l'aide d'un protocole de datagramme comme le protocole UDP permet le logiciel pour récupérer d'un tel événement extrêmement rapidement, en ignorant tout simplement la perte de données ou de re-demander plus tôt que TCP serait.

VoIP est un bon candidat pour l'ignorant tout simplement les données perdues -- une partie serait juste entendre un court intervalle, similaire à ce qui se passe quand vous parlez à quelqu'un sur un téléphone cellulaire quand ils ont une mauvaise réception. Jeu protocoles sont souvent un peu plus complexe, mais les mesures prises seront généralement soit à ignorer les données manquantes (si par la suite-les données reçues remplace les données qui ont été perdues), re-demande, les données manquantes, ou à la demande d'un état complet de mise à jour pour s'assurer que l'état du client est en synchronisation avec le serveur.

34voto

Socket De Flux:

  • Dédié et point-à-point des canaux entre le serveur et le client.
  • L'utilisation du protocole TCP pour la transmission de données.
  • Fiable et sans perte.
  • Les données envoyées/reçues dans le même ordre.
  • Longtemps pour récupérer perdu/les données erronées

Socket Datagramme:

  • Pas & point-à-point des canaux entre le serveur et le client.
  • L'utilisation d'UDP pour la transmission de données.
  • Pas fiable à 100% et peut perdre des données.
  • Les données envoyées/reçues commande pourrait ne pas être la même
  • Ne se soucient pas ou rapide de récupération/données erronées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X