TCP · UDP · WebSocket · API · Algorithmique distribuée
TCP est un protocole de transport orienté connexion, fiable et ordonné. Il s'appuie sur IP (couche réseau) et ajoute des mécanismes de contrôle de flux, de congestion, et d'acquittement.
ISN (choisi aléatoirement, ex. seq = 1000)ack = ISN_client + 1 = 1001) et propose son propre ISN (seq = 5000)ack = ISN_serveur + 1 = 5001) — connexion établieLa fermeture est half-duplex : chaque côté ferme indépendamment sa direction d'envoi.
TIME_WAIT (2 × MSL ≈ 60 s)Permet d'accuser réception de segments non consécutifs, évitant la retransmission de segments déjà reçus. Encodé dans les options TCP.
Le champ fenêtre TCP est limité à 65 535 octets (16 bits). L'option window scale permet un facteur multiplicateur jusqu'à 2¹⁴ → fenêtre max ≈ 1 Go.
Mesure précise du RTT et protection contre les numéros de séquence trop anciens (PAWS — Protection Against Wrapped Sequences).
Regroupe les petits segments pour réduire la surcharge réseau. Peut être désactivé avec TCP_NODELAY pour les applications temps-réel.
Permet d'envoyer des données dès le SYN (cookie TFO), réduisant la latence d'un RTT pour les connexions répétées au même serveur.
Algorithmes : Slow Start, Congestion Avoidance, Fast Retransmit, Fast Recovery. Variantes : Reno, CUBIC (Linux), BBR (Google).
UDP est un protocole de transport sans connexion, non fiable, non ordonné. Très léger (en-tête = 8 octets seulement contre 20 pour TCP).
Protocole Google basé sur UDP, intègre chiffrement TLS 1.3, multiplexage de flux, reprise de session 0-RTT. Base de HTTP/3. Évite le head-of-line blocking de TCP.
TLS adapté à UDP. Utilisé dans WebRTC pour les flux médias temps-réel. Ajoute la fiabilité optionnelle et le chiffrement sans les contraintes de TCP.
Real-time Transport Protocol sur UDP. RTP transporte les médias, RTCP transporte les statistiques (perte, jitter, RTT). Base de VoIP (SIP), visioconférence.
Protocole hybride : fiabilité de TCP + multi-streaming + multi-homing. Utilisé dans les télécoms (SS7 over IP).
Taille maximale d'une trame au niveau liaison (couche 2).
Taille maximale des données TCP dans un segment (sans en-têtes).
Negocié lors du handshake (option MSS dans le SYN).
Temps de propagation aller-retour entre client et serveur.
Données utiles réellement transmises par unité de temps (sans les en-têtes, retransmissions, paquets perdus).
| Format | Avantages | Inconvénients | Usages typiques |
|---|---|---|---|
| JSON | Léger, lisible humain, natif JS, quasi-universel, simple à parser | Pas de schéma natif, verbeux (clés répétées), pas de types binaires | REST API, config, NoSQL, localStorage |
| XML | Schéma strict (XSD), namespace, très mature, SOAP | Très verbeux (balises ouvrantes/fermantes), parsing lourd | Banque, assurance, EDI, configs Java |
| Protobuf (Google) | Binaire compact, très rapide, schéma fort (.proto) | Non lisible humain, tooling nécessaire | gRPC, microservices haute perf |
| MessagePack | Binaire, compatible JSON, plus compact | Moins répandu | Redis, IoT, mobile |
| CSV | Très simple, Excel-compatible | Pas de types, pas de hiérarchie | Exports tabulaires, data science |
| YAML | Lisible, commentaires, superset JSON | Sensible à l'indentation, lent à parser | Config (Docker, Kubernetes, CI/CD) |
| Avro | Schéma JSON + binaire, évolution de schéma | Complexité | Kafka, Hadoop, big data |
JSON.parse().
SOAP (Simple Object Access Protocol) utilise XML comme format de message. Encore très présent dans :
SOAP garantit : WS-Security (chiffrement + signature XML), WSDL (description du service), transactions ACID via WS-Transaction.
Architecture basée sur les ressources et les verbes HTTP. Stateless, cacheable, layered.
| Verbe | Action CRUD | Exemple |
|---|---|---|
GET | Read | GET /users/42 |
POST | Create | POST /users |
PUT | Update complet | PUT /users/42 |
PATCH | Update partiel | PATCH /users/42 |
DELETE | Delete | DELETE /users/42 |
Codes HTTP clés : 200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error.
Créé par Facebook (2015). Langage de requête côté client — le client choisit exactement les champs qu'il veut. Un seul endpoint (POST /graphql).
# Requête GraphQL query { user(id: 42) { name email posts { title } } }
Basé sur HTTP/2 + Protobuf. 5× à 10× plus rapide que REST+JSON. Supporte le streaming bidirectionnel. Utilisé dans les microservices.
| Critère | REST | GraphQL | gRPC | SOAP |
|---|---|---|---|---|
| Format | JSON/XML | JSON | Protobuf (binaire) | XML |
| Transport | HTTP/1.1+ | HTTP/1.1+ | HTTP/2 | HTTP |
| Contrat | OpenAPI | SDL | .proto | WSDL |
| Cache HTTP | ✅ Natif | ⚠️ Difficile | ❌ | ❌ |
| Streaming | ❌ | Subscriptions | ✅ Bidirectionnel | ❌ |
| Perf | Moyenne | Moyenne | Très haute | Basse |
| Usage | Web public | Mobile/SPA | Microservices | Entreprise legacy |
WebSocket (RFC 6455) permet une communication bidirectionnelle full-duplex persistante sur une connexion TCP unique. Démarre via un upgrade HTTP.
# Requête du client (HTTP → WebSocket) GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 # Réponse du serveur HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Après le 101 Switching Protocols, la connexion TCP reste ouverte et les deux parties peuvent s'envoyer des frames à tout moment.
// Connexion au serveur WebSocket const ws = new WebSocket('wss://mon-serveur.fr/chat'); // Événement : connexion établie ws.addEventListener('open', (event) => { console.log('Connecté au serveur !'); ws.send(JSON.stringify({ type: 'message', content: 'Bonjour !', author: 'Alice' })); }); // Événement : réception d'un message ws.addEventListener('message', (event) => { const data = JSON.parse(event.data); console.log(`Message de ${data.author}: ${data.content}`); }); // Événement : fermeture de connexion ws.addEventListener('close', (event) => { console.log(`Connexion fermée. Code: ${event.code}`); }); // Événement : erreur ws.addEventListener('error', (error) => { console.error('Erreur WebSocket :', error); }); // Fermer proprement // ws.close(1000, 'Au revoir');
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); const clients = new Set(); wss.on('connection', (ws, req) => { clients.add(ws); console.log(`Nouveau client : ${req.socket.remoteAddress}`); // Réception d'un message ws.on('message', (rawData) => { const msg = JSON.parse(rawData.toString()); // Broadcast à tous les clients connectés const payload = JSON.stringify({ ...msg, timestamp: new Date().toISOString() }); for (const client of clients) { if (client.readyState === WebSocket.OPEN) { client.send(payload); } } }); // Déconnexion ws.on('close', () => { clients.delete(ws); console.log('Client déconnecté'); }); // Ping / Keepalive ws.on('ping', () => ws.pong()); }); console.log('Serveur WebSocket démarré sur ws://localhost:8080');
1000 : Fermeture normale1001 : Going Away (page fermée)1006 : Connexion perdue anormalement1011 : Erreur interne serveurUn certificat X.509 est un document numérique standardisé qui lie une clé publique à une identité (personne, organisation, domaine). Il est signé par une Autorité de Certification (CA).
SHA-256 with RSA, ECDSACN=Let's Encrypt R3, O=Let's Encrypt, C=US)NotBefore et NotAfter (en UTC)CN=www.example.com)Subject Alternative Name (SAN) : domaines alternatifs couvertsKey Usage : usage autorisé (signature, chiffrement...)Basic Constraints : CA:TRUE si c'est un cert de CACRL Distribution Points : URL de la liste de révocationOCSP : Online Certificate Status Protocol
Root CA (auto-signé, pré-installé dans l'OS/navigateur)
↓ signe
Intermediate CA (ex. R3 de Let's Encrypt)
↓ signe
Certificat feuille (ex. www.monsite.fr)
client_random, extensions (SNI)server_random, envoi du certificatReprésente les interactions chronologiques entre acteurs/objets. Lecture de haut en bas.
Représente un algorithme ou processus avec des décisions (losanges) et des actions (rectangles).
Les 7 problématiques classiques des systèmes distribués — ce que vous devez maîtriser pour l'oral.
Permettent d'ordonner les événements dans un système distribué sans horloge globale.
L = L + 1L = L + 1, puis envoyer (msg, L)(msg, L_reçu) : L = max(L_local, L_reçu) + 1Chaque processus Pᵢ maintient un vecteur V[1..n]. Permettent de détecter la concurrence (ce que Lamport ne permet pas).
V[i] = V[i] + 1V[i] = V[i] + 1, envoyer (msg, V)(msg, V_reçu) : V[k] = max(V[k], V_reçu[k]) pour tout k, puis V[j] = V[j] + 1V = V' si ∀k : V[k] = V'[k]V < V' (précède) si ∀k : V[k] ≤ V'[k] ET ∃k : V[k] < V'[k]REQUEST(ts, i) à tousACK de tous ET que sa requête soit en tête de sa file localeRELEASE à tousN'interroge qu'un sous-ensemble de processus (quorum). Complexité réduite : ~√n messages.
Permet de capturer un état global cohérent d'un système distribué (sans arrêter le système).
Tous les processus reçoivent tous les messages dans le même ordre total — même des messages sans relation causale.
Si l'envoi de m1 précède causalement l'envoi de m2, alors tous les processus reçoivent m1 avant m2. Les messages sans relation causale peuvent être reçus dans n'importe quel ordre.
Détecte quand un calcul distribué est terminé (tous les processus inactifs, aucun message en transit).
| Algorithme | Problème résolu | Mécanisme clé | Complexité |
|---|---|---|---|
| Lamport (horloges) | Ordre causal des événements | max(local, reçu) + 1 | O(1) par message |
| Horloges vectorielles | Causalité + concurrence | Vecteur max composante par composante | O(n) par message |
| Ricart-Agrawala | Exclusion mutuelle | Timestamps + ACK différés | 2(n-1) messages |
| Chandy-Lamport | Snapshot global cohérent | Marqueurs sur canaux FIFO | O(e) messages (e = nb d'arêtes) |
| Diffusion totale | Cohérence forte | Paxos / Raft / séquenceur | O(n²) messages |
| Diffusion causale | Cohérence causale | Horloges vectorielles | O(n) par message |
| Chang-Roberts | Élection (anneau) | Propagation du max ID | O(n log n) moy. |
Applications en Réseaux · TCP · UDP · WebSocket · APIs · Algorithmique Distribuée