Un WebSocket est une connexion persistante et bidirectionnelle entre client et serveur : chaque côté peut pousser un message à l’instant où il survient. HTTP a bâti le web en demandant ; les WebSockets l’ont rendu vivant en écoutant — un upgrade normalisé (RFC 6455) transforme une requête en canal ouvert, et tout ce qui est temps réel sur le web — chat, présence, tickers, curseurs collaboratifs — circule dessus.
Points clés
| Question | Réponse |
|---|---|
| Ce que c’est | Une connexion persistante et full-duplex — push du serveur, envoi du client, le même tuyau |
| vs. HTTP | Request-response sans état vs. canal ouvert avec état |
| Le handshake | GET HTTP + Upgrade → 101 Switching Protocols → frames |
| Les règles de production | Toujours wss://, heartbeats + reconnexion avec backoff, planifier le fan-out |
| La couche supérieure | La synchronisation temps réel — des requêtes et de l’état sur le socket, pas des messages bruts |
Comment fonctionne le handshake d’upgrade WebSocket (HTTP 101)
GET /chat HTTP/1.1 ← commence comme du HTTP ordinaire
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
HTTP/1.1 101 Switching Protocols ← et cesse d'être du HTTP ici
Upgrade: websocket
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
# Désormais : de minuscules frames (2–14 octets d'overhead), dans les deux sens,
# vs ~500+ octets de headers pour chaque poll HTTP individuel.
La plupart des applications ne devraient pas écrire à la main ce qui vient ensuite — l’idiome de production est une couche temps réel gérée où le socket, les heartbeats et la reconnexion sont le code de quelqu’un d’autre :
// JavaScript / Node.js — Back4app JS SDK (Live Query over WebSockets)
// One WebSocket, managed for you: connect, subscribe, reconnect
const query = new Parse.Query('Message');
query.equalTo('room', 'general');
const subscription = await query.subscribe(); // wss:// under the hood
subscription.on('create', (msg) => appendToChat(msg));
subscription.on('open', () => setStatus('live'));
// Later: subscription.unsubscribe(); // Flutter / Dart — Back4app Flutter SDK (Live Query over WebSockets)
// One WebSocket, managed for you: connect, subscribe, reconnect
final liveQuery = LiveQuery();
final query = QueryBuilder<ParseObject>(ParseObject('Message'))
..whereEqualTo('room', 'general');
final sub = await liveQuery.client.subscribe(query); // wss:// under the hood
sub.on(LiveQueryEvent.create, (msg) => appendToChat(msg)); // iOS / Swift — Back4app Swift SDK (Live Query over WebSockets)
// One WebSocket, managed for you: connect, subscribe, reconnect
let query = Message.query("room" == "general")
let subscription = query.subscribeCallback // wss:// under the hood
subscription?.handleEvent { _, event in
if case .created(let msg) = event { appendToChat(msg) }
} // Android / Kotlin — Back4app Android SDK (Live Query over WebSockets)
// One WebSocket, managed for you: connect, subscribe, reconnect
val client = ParseLiveQueryClient.Factory.getClient()
val query = ParseQuery.getQuery<ParseObject>("Message")
query.whereEqualTo("room", "general")
val handling = client.subscribe(query) // wss:// under the hood
handling.handleEvent(SubscriptionHandling.Event.CREATE) { _, msg ->
appendToChat(msg)
} WebSockets vs. tout le reste qui déplace des données
| Transport | Direction | Fonctionnement | Idéal pour |
|---|---|---|---|
| Polling | Le client demande en boucle | Une requête complète par vérification | Repli legacy uniquement |
| Long polling | Le client demande, le serveur temporise | Une requête en attente par message | Repli de compatibilité |
| SSE | Serveur → client seulement | HTTP en streaming, reconnexion auto | Flux, tickers, notifications |
| WebSocket | Les deux sens | TCP persistant après upgrade | Chat, jeux, collaboration, sync |
| WebRTC | Pair ↔ pair | Canaux UDP média/données | Appels, vidéo — signalisés via WebSockets |
Exploiter des sockets en production
Quatre concepts portent la charge opérationnelle. Affinité de session : les connexions ont un état, donc les load balancers doivent maintenir chaque client épinglé à son nœud. Fan-out : diffuser un message à dix mille abonnés répartis sur de nombreux nœuds exige un backplane pub/sub entre serveurs — le message voyage de serveur à serveur avant de voyager de serveur à client. Backpressure : on ne peut pas laisser un téléphone lent sur un mauvais réseau accumuler des messages sans limite dans la mémoire de votre serveur ; il faut jeter, fusionner ou déconnecter. Vivacité : les frames ping/pong et les heartbeats applicatifs détectent les connexions à moitié mortes, et les clients se reconnectent avec un backoff exponentiel et du jitter, puis se réabonnent à leur état — l’étape que les implémentations naïves oublient. Rien de tout cela n’est exotique ; tout cela explique pourquoi « on va juste ouvrir un socket » devient une décision de plateforme.
Des messages à la synchronisation : la couche du dessus
Les WebSockets bruts déplacent des octets ; les applications veulent de l’état. L’étage au-dessus, c’est la synchronisation temps réel : au lieu d’inventer à la main des types de messages et une comptabilité côté client, vous vous abonnez à des données — une requête, un document, un canal — et la couche livre des événements de changement précis, gère la reconnexion avec rattrapage et applique les permissions côté serveur par abonné. C’est le modèle des live queries : les WebSockets comme transport, un moteur de requêtes comme cerveau. Si votre code WebSocket accumule des switch sur des types de messages, vous êtes en train de reconstruire cette couche à la main.
Cas d’usage courants
- Chat et messagerie — le cas canonique : les deux côtés parlent, instantanément.
- Présence — qui est en ligne, qui est en train d’écrire : de minuscules messages, à haute fréquence, dans les deux sens.
- Édition collaborative — documents et tableaux blancs partagés, où les positions de curseur et les modifications circulent en continu.
- Dashboards en direct et tickers — push serveur de chiffres qui bougent ; SSE convient aussi quand c’est à sens unique.
- Multijoueur et géolocalisation — état de jeu et marqueurs de carte en mouvement, là où la latence est le produit.
Avez-vous besoin d’un socket ? Matrice de décision
| Choisissez les WebSockets quand… | Le HTTP ordinaire est le bon choix quand… |
|---|---|
| Les utilisateurs regardent des données qui changent maintenant | Les données changent rarement ou à la demande |
| Les deux côtés initient des messages | Seul le client demande |
| La latence est visible par l’utilisateur (chat, jeux) | Un poll de 30 secondes suffirait honnêtement |
| Beaucoup de petits messages circulent en permanence | Les réponses sont volumineuses et cachables |
| Vous allez exploiter (ou louer) le fan-out | Personne n’est propriétaire de l’exploitation des sockets |
Et la voie médiane que la matrice cache : les cas serveur-vers-client uniquement (flux, notifications) conviennent à SSE avec moins de machinerie — la comparaison complète des transports a sa propre entrée dans le registre de ce glossaire.
Limites et trade-offs
- L’état est le prix du push. Chaque connexion ouverte est de la mémoire serveur et une contrainte de répartition de charge ; l’absence d’état de HTTP portait plus de poids qu’il n’y paraissait.
- Les réseaux détestent les connexions de longue durée. Proxies, radios mobiles et portables qu’on referme coupent des sockets en permanence — la logique de reconnexion n’est pas un cas limite, c’est la boucle principale.
- La sécurité déménage vers la connexion. Authentifiez à la connexion, validez chaque message, appliquez l’autorisation par abonnement — et toujours wss.
- Le cache n’existe pas ici. Tout ce qui est poussé est calculé et livré par client ; le CDN ne peut rien pour vous.
- La synchronisation écrite à la main est un piège. L’écart entre « j’ai ouvert un socket » et « une synchronisation d’état correcte, avec reconnexion et permissions » est là où vit la vraie ingénierie — c’est précisément la couche qui vaut la peine d’être louée.
WebSockets sur Back4app
Back4app est une plateforme open-source de Backend as a Service (BaaS) qui combine une base de données gérée, des API REST et GraphQL générées automatiquement, l’authentification, le stockage de fichiers et des fonctions serverless avec Cloud Code. Sa couche temps réel est Live Query : le transport WebSocket, les heartbeats, la reconnexion et le fan-out multi-nœuds tournent comme une infrastructure gérée (avec le protocole ouvert LiveQuery en dessous), tandis que votre code s’abonne à des requêtes et reçoit des événements de changement typés — avec des ACL appliquées par abonné, pour que le temps réel ne contourne jamais le modèle de permissions. Les onglets de code ci-dessus sont toute l’histoire côté client.
Questions fréquentes
Qu'est-ce qu'un WebSocket en termes simples ?
Un appel téléphonique au lieu d'un échange de courrier. HTTP fonctionne en request-response — le client demande, le serveur répond, la ligne se ferme. Un WebSocket ouvre une connexion persistante sur laquelle les deux côtés peuvent envoyer des messages à tout moment, avec quelques octets de framing par message au lieu de headers complets. C'est le transport standard (RFC 6455) du chat, des données en direct et de la collaboration.
En quoi un WebSocket diffère-t-il de HTTP ?
La direction et la durée de vie. HTTP est sans état et initié par le client : chaque échange est une nouvelle requête avec des headers complets, et le serveur ne peut jamais parler en premier. Un WebSocket démarre comme une requête HTTP, fait un upgrade et devient un canal full-duplex avec état où le serveur pousse sans qu'on le lui demande — ce qui est tout l'intérêt dès que quelque chose change pendant que l'utilisateur regarde.
Comment fonctionne le handshake WebSocket ?
Il commence comme du HTTP poli : le client envoie un GET avec les headers Upgrade et Connection plus une Sec-WebSocket-Key aléatoire ; le serveur répond 101 Switching Protocols avec un hash d'acceptation dérivé de cette clé. À partir de cet instant, la connexion TCP cesse de parler HTTP et transporte de légers frames WebSocket dans les deux sens jusqu'à ce qu'un des côtés la ferme.
Quelle est la différence entre ws:// et wss:// ?
La même qu'entre http et https : wss fait passer la connexion sur TLS. Le trafic de production est toujours en wss — par respect de la confidentialité et, pragmatiquement, parce que les connexions chiffrées traversent les proxies et les middleboxes d'entreprise qui abîment les upgrades en clair. Il n'existe aucune raison légitime de livrer ws en production.
Quelle est la différence entre WebSockets et Server-Sent Events ?
La direction. SSE est à sens unique — le serveur diffuse vers le client sur du HTTP ordinaire, avec reconnexion automatique intégrée — idéal pour les flux, les tickers et les notifications. Les WebSockets sont bidirectionnels, pour tous les cas où le client parle aussi : chat, jeux, édition collaborative. SSE est plus simple là où il suffit ; les WebSockets sont l'outil général.
Comment fonctionnent les reconnexions et les heartbeats ?
Le protocole inclut des frames de contrôle ping/pong pour que chaque côté vérifie que l'autre est vivant ; les applications ajoutent des heartbeats par-dessus pour détecter les connexions à moitié mortes, puis se reconnectent avec un backoff exponentiel et du jitter avant de se réabonner à leur état. Les couches temps réel gérées prennent cette boucle en charge pour vous — le code WebSocket écrit à la main qui l'oublie fonctionne jusqu'au jour où les réseaux se comportent comme des réseaux.
Les WebSockets passent-ils à l'échelle ?
Oui, avec une mécanique différente de HTTP : les connexions ont un état, donc les load balancers ont besoin d'affinité de session ; diffuser vers de nombreux clients demande un backplane pub/sub pour que chaque nœud puisse faire le fan-out des messages ; et les consommateurs lents exigent une gestion de la backpressure pour qu'un client bloqué ne fasse pas gonfler la mémoire du serveur. Ce sont des problèmes résolus — dans une infrastructure que vous construisez ou que vous louez.
Quand ne faut-il PAS utiliser les WebSockets ?
Quand le request-response convient déjà : récupérer des ressources cachables, du CRUD standard, des mises à jour peu fréquentes. Une connexion persistante achète le push instantané et le paie en état — sans intérêt pour des données qui changent rarement. La règle empirique : si un polling toutes les 30 secondes suffirait honnêtement, passez-vous du socket.