RFC 6455 - The WebSocket Protocol (Le Protocole WebSocket)
Date de publication : Décembre 2011
Statut : Standards Track
Auteurs : I. Fette (Google Inc.), A. Melnikov (Isode Ltd.)
Résumé (Abstract)
Le protocole WebSocket (WebSocket Protocol) permet une communication bidirectionnelle simultanée (Full-Duplex Communication) entre un client et un serveur sur une seule connexion TCP. Le protocole WebSocket est conçu pour être implémenté dans les navigateurs web et les serveurs web, mais il peut être utilisé par n'importe quelle application client ou serveur.
Le protocole WebSocket est un protocole indépendant basé sur TCP. Sa seule relation avec HTTP est que sa poignée de main (Handshake) est interprétée par les serveurs HTTP comme une requête de mise à niveau (Upgrade Request).
Table des matières (Table of Contents)
- 1. Introduction
- 1.1 Background (Contexte)
- 1.2 Protocol Overview (Vue d'ensemble du protocole)
- 1.3 Opening Handshake (Poignée de main d'ouverture)
- 1.4 Closing Handshake (Poignée de main de fermeture)
- 1.5 Design Philosophy (Philosophie de conception)
- 1.6 Security Model (Modèle de sécurité)
- 1.7 Relationship to TCP and HTTP (Relation avec TCP et HTTP)
- 1.8 Establishing a Connection (Établissement d'une connexion)
- 1.9 Subprotocols and Extensions (Sous-protocoles et extensions)
- 2. Conformance Requirements (Exigences de conformité)
- 2.1 Terminology and Other Conventions (Terminologie et autres conventions)
- 3. WebSocket URIs
- 4. Opening Handshake (Poignée de main d'ouverture)
- 4.1 Client Requirements (Exigences du client)
- 4.2 Server-Side Requirements (Exigences côté serveur)
- 4.3 Collecting Extensions and Subprotocols (Collecte des extensions et sous-protocoles)
- 4.4 Supporting Multiple Versions (Support de plusieurs versions)
- 5. Data Framing (Tramage des données)
- 5.1 Overview (Vue d'ensemble)
- 5.2 Base Framing Protocol (Protocole de tramage de base)
- 5.3 Client-to-Server Masking (Masquage client vers serveur)
- 5.4 Fragmentation
- 5.5 Control Frames (Trames de contrôle)
- 5.6 Data Frames (Trames de données)
- 5.7 Examples (Exemples)
- 5.8 Extensibility (Extensibilité)
- 6. Sending and Receiving Data (Envoi et réception de données)
- 6.1 Sending Data (Envoi de données)
- 6.2 Receiving Data (Réception de données)
- 7. Closing the Connection (Fermeture de la connexion)
- 7.1 Definitions (Définitions)
- 7.2 Abnormal Closures (Fermetures anormales)
- 7.3 Normal Closure (Fermeture normale)
- 7.4 Status Codes (Codes d'état)
- 8. Error Handling (Gestion des erreurs)
- 8.1 Handling Errors in UTF-8-Encoded Data (Gestion des erreurs dans les données encodées en UTF-8)
- 9. Extensions
- 9.1 Negotiating Extensions (Négociation des extensions)
- 9.2 Known Extensions (Extensions connues)
- 10. Security Considerations (Considérations de sécurité)
- 10.1 Non-Browser Clients (Clients non-navigateurs)
- 10.2 Origin Considerations (Considérations sur l'origine)
- 10.3 Attacks On Infrastructure (Attaques sur l'infrastructure)
- 10.4 Implementation-Specific Limits (Limites spécifiques à l'implémentation)
- 10.5 WebSocket Client Authentication (Authentification du client WebSocket)
- 10.6 Connection Confidentiality and Integrity (Confidentialité et intégrité de la connexion)
- 10.7 Handling of Invalid Data (Traitement des données invalides)
- 10.8 Use of SHA-1 (Utilisation de SHA-1)
- 11. IANA Considerations (Considérations IANA)
- 12. Using WebSocket Protocol from Other Specifications (Utilisation du protocole WebSocket depuis d'autres spécifications)
- 13. Acknowledgements (Remerciements)
- 14. References (Références)
- 14.1 Normative References (Références normatives)
- 14.2 Informative References (Références informatives)
Ressources supplémentaires
- 📖 Guide d'implémentation : Guide d'implémentation du protocole WebSocket - Documentation technique détaillée, exemples de code et meilleures pratiques
- 🔗 RFC officiel : RFC 6455
- 📋 DataTracker : RFC 6455 DataTracker
- 🐛 Errata : RFC Editor Errata
RFC connexes
- RFC 6455 : The WebSocket Protocol ← Ce document
- RFC 7692 : WebSocket Compression Extensions (Extensions de compression WebSocket)
- RFC 8441 : Bootstrapping WebSockets with HTTP/2 (Amorçage de WebSockets avec HTTP/2)
Référence rapide
Format d'URI WebSocket
ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
ws://- Connexion non chiffrée (port par défaut 80)wss://- Connexion chiffrée TLS (port par défaut 443, recommandé pour la production)
Exemple de poignée de main
Requête du client :
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com
Réponse du serveur :
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Types de trames (Opcode)
| Opcode | Type | Description |
|---|---|---|
| 0x0 | Continuation | Trame de continuation |
| 0x1 | Text | Trame de texte (UTF-8) |
| 0x2 | Binary | Trame binaire |
| 0x8 | Close | Trame de fermeture |
| 0x9 | Ping | Trame Ping (battement de cœur) |
| 0xA | Pong | Trame Pong (réponse au battement de cœur) |
Codes d'état de fermeture
| Code | Nom | Description |
|---|---|---|
| 1000 | Normal Closure | Fermeture normale |
| 1001 | Going Away | Point de terminaison partant (par exemple, navigation de page) |
| 1002 | Protocol Error | Erreur de protocole |
| 1003 | Unsupported Data | Type de données non supporté |
| 1006 | Abnormal Closure | Fermeture anormale (aucune trame Close envoyée) |
| 1009 | Message Too Big | Message trop volumineux |
| 1011 | Internal Error | Erreur interne du serveur |
Structure de trame (Format de base)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+-------------------------------+
| Extended payload length continued, if payload len == 127 |
+-------------------------------+-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------+-------------------------------+
Points clés :
- FIN : 1=trame finale, 0=trames suivantes
- MASK : doit être 1 pour client→serveur, doit être 0 pour serveur→client
- Opcode : Identifiant du type de trame
- Payload Length : Longueur des données (0-125 direct, 126 utilise 16 bits, 127 utilise 64 bits)
Terminologie principale
| Terme anglais | Terme français | Description |
|---|---|---|
| Full-Duplex Communication | Communication bidirectionnelle simultanée | Communication bidirectionnelle simultanée |
| Opening Handshake | Poignée de main d'ouverture | Processus de mise à niveau HTTP vers WebSocket |
| Closing Handshake | Poignée de main de fermeture | Processus de fermeture gracieuse de la connexion |
| Frame | Trame | Unité de base de transmission de données |
| Message | Message | Composé d'une ou plusieurs trames |
| Masking | Masquage | Les données du client doivent être masquées (mécanisme de sécurité) |
| Fragmentation | Fragmentation | Messages volumineux transmis en plusieurs trames |