web-dev-qa-db-fra.com

Différences entre les sockets TCP et les sockets web, une fois de plus

En essayant de comprendre au mieux les différences entre TCP socket et websocket, j'ai déjà trouvé beaucoup d'informations utiles dans ces questions:

etc...

Dans mes investigations, je suis passé par cette phrase sur wikipedia :

Websocket diffère de TCP en ce qu'il active un flux de messages au lieu d'un flux d'octets

Je ne suis pas tout à fait sûr de ce que cela signifie exactement. Quelles sont vos interprétations?

131
PierrOz

Lorsque vous envoyez des octets à partir d'un tampon avec un socket TCP normal, la fonction d'envoi renvoie le nombre d'octets du tampon qui ont été envoyés. S'il s'agit d'une socket non bloquante ou d'un envoi non bloquant, le nombre d'octets envoyés peut être inférieur à la taille de la mémoire tampon. S'il s'agit d'une socket ou d'un envoi bloquant, le numéro renvoyé correspondra à la taille de la mémoire tampon, mais l'appel peut être bloqué. Avec WebSockets, les données transmises à la méthode d'envoi sont toujours envoyées sous forme de "message" complet ou pas du tout. En outre, les implémentations du navigateur WebSocket ne bloquent pas l'appel envoyé.

Mais il y a des différences plus importantes du côté des destinataires. Lorsque le destinataire effectue une recv (ou une lecture) sur un socket TCP, rien ne garantit que le nombre d'octets renvoyés correspond à un seul envoi (ou écriture) du côté de l'expéditeur. Ce pourrait être le même, il pourrait être inférieur (ou égal à zéro) et même supérieur (dans ce cas, les octets de plusieurs envois/écritures sont reçus). Avec WebSockets, la réception d'un message est fonction des événements (vous enregistrez généralement une routine de gestionnaire de messages), et les données contenues dans l'événement correspondent toujours au message entier envoyé par l'autre partie.

Notez que vous pouvez effectuer une communication basée sur les messages en utilisant TCP sockets, mais vous avez besoin d'une couche/encapsulation supplémentaire qui ajoute des données d'encadrement/limite de message aux messages afin que les messages d'origine puissent être réassemblés à partir des éléments. . En fait, WebSockets est construit sur des sockets TCP normaux et utilise des en-têtes contenant la taille de chaque trame et indiquant les trames faisant partie d'un message. L'API WebSocket ré-assemble les fragments de données TCP dans des trames assemblées dans des messages avant d'appeler le gestionnaire d'événements de message une fois par message.

183
kanaka

WebSocket est essentiellement un protocole d'application (faisant référence à la pile de réseau ISO/OSI), orienté message, qui utilise TCP comme couche de transport.

L’idée du protocole WebSocket consiste à réutiliser la connexion établie TCP entre un client et un serveur. Après la prise de contact HTTP, le client et le serveur commencent à parler du protocole WebSocket en échangeant des enveloppes WebSocket. La négociation HTTP est utilisée pour surmonter toute barrière (par exemple, des pare-feu) entre un client et un serveur offrant certains services (généralement, le port 80 est accessible de n’importe où, par quiconque). Client et serveur peuvent basculer à tout moment sur HTTP parlant, en utilisant la même connexion TCP (qui n'est jamais libérée).

En coulisse, WebSocket reconstruit les cadres TCP dans des enveloppes/messages cohérents. Le canal en duplex intégral est utilisé par le serveur à pousser mises à jour vers le client de manière asynchrone: le canal est ouvert et le client peut appeler tous les contrats à terme./callbacks/promet de gérer tout message reçu asynchrone de WebSocket.

Pour le dire simplement, WebSocket est un protocole de haut niveau (comme HTTP lui-même) basé sur TCP (couche de transport fiable, image par image) qui permet de créer une application en temps réel efficace avec les clients JS (auparavant Des techniques de comète et de longue interrogation ont été utilisées pour extraire les mises à jour du serveur avant que WebSockets ne soit implémenté. Voir Stackoverflow post: Différences entre websockets et longue interrogation pour tour à tour serveur de jeu ).

120
Paolo Maresca