web-dev-qa-db-fra.com

Qu'est-ce que SOCK_DGRAM et SOCK_STREAM?

Je viens de découvrir cette chose étrange que j'ai pu voir, c'est que par défaut, ils utilisent SOCK_STREAM une fonction. Pourquoi en est-il ainsi? Est-ce SOCK_STREAM vous venez de créer plusieurs flux? Ou est-ce la norme SOCK_STREAM fonction disponible pour créer TCP flux (s)?

Je pensais que le tsunami était basé sur UDP, mais avait toujours certaines fonctionnalités comme celle de TCP, par exemple TCP équité, convivialité, etc.

Quelqu'un pourrait-il faire la lumière sur cette question? Je suis totalement confus à ce sujet.

30
echo9

TCP utilise presque toujours SOCK_STREAM et UDP utilise SOCK_DGRAM.

TCP (SOCK_STREAM) est un protocole basé sur la connexion. La connexion est établie et les deux parties ont une conversation jusqu'à ce que la connexion soit interrompue par l'une des parties ou par une erreur de réseau.

UDP (SOCK_DGRAM) est un protocole basé sur un datagramme. Vous envoyez un datagramme et obtenez une réponse, puis la connexion se termine.

  • Si vous envoyez plusieurs paquets, TCP promet de les livrer dans l'ordre. UDP ne le fait pas, donc le récepteur doit les vérifier, si la commande est importante.

  • Si un paquet TCP est perdu, l'expéditeur peut le dire. Ce n'est pas le cas pour UDP.

  • Les datagrammes UDP sont de taille limitée, de mémoire, je pense que c'est 512 octets. TCP peut envoyer des blocs beaucoup plus gros que cela.

  • TCP est un peu plus robuste et fait plus de vérifications. UDP est un poids plus léger (moins de stress informatique et réseau).

Choisissez le protocole approprié à la façon dont vous souhaitez interagir avec l'autre ordinateur.

47
Michael J

Mise à jour: ma réponse ne semble plus pertinente, mais la question d'origine faisait référence à UDT, qui est un protocole orienté connexion construit sur UDP. Plus d'informations ici: http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol


UDT semble fournir une API qui imite l'API de sockets BSD classique, de sorte qu'elle peut être utilisée comme remplacement de remplacement, pour les applications orientées flux et datagramme. Vérifiez par ex. sendmsg et recvmsg - lèvent tous deux une exception s'ils sont utilisés sur un socket créé avec SOCK_STREAM, et toutes les API orientées flux lèvent une exception pour le socket créé avec SOCK_DGRAM ainsi que.

En cas de SOCK_DGRAM il effectue un traitement supplémentaire cependant, il n'emballe pas simplement le socket UDP de manière transparente dans ce cas - pour autant que je comprenne le code après un examen rapide (je ne suis pas familier avec les internes UDT ou les spécifications de protocole). La lecture de documents techniques pourrait être très utile.

La bibliothèque crée toujours son socket "réel" sous-jacent comme un datagramme (vérifiez channel.cpp, CChannel::open).

7
Code Painters