Aller au contenu
Réseaux high

TCP vs UDP — Fiabilité ou vitesse ?

16 min de lecture

Votre API ne répond pas et vous ne savez pas comment tester si le port est accessible ? Ce module vous explique les deux protocoles de transport d’Internet : TCP (fiable) et UDP (rapide). Vous apprendrez à tester une connexion TCP avec netcat et à interpréter les erreurs — des compétences essentielles pour diagnostiquer les problèmes de connectivité en production.

  • TCP = fiable (HTTP, SSH, bases de données) — UDP = rapide (DNS, streaming, jeux)
  • Tester un port TCP : nc -zv hôte port
  • Connection refused = port fermé (service absent)
  • Timeout = paquet filtré (pare-feu) ou machine inaccessible
  • nc -zv google.com 443 affiche “succeeded”
  • Je sais distinguer “refused” (port fermé) de “timeout” (filtré)
  • ss -tlnp me montre les ports en écoute sur ma machine
Fenêtre de terminal
# 1. Tester un port TCP
nc -zv github.com 443
# 2. Voir les ports ouverts localement
ss -tlnp
# 3. Tester avec timeout court
nc -zv -w 3 192.168.1.1 22
  • Module 4 complété : vous comprenez le routage et les passerelles
  • Connaissance des ports : vous savez qu’un port identifie un service (cf. Module 2)
  • Une machine Linux connectée à Internet
  • Un terminal ouvert
  • TCP vs UDP : comprendre quand utiliser chaque protocole
  • Le handshake TCP : comment une connexion s’établit
  • Les ports bien connus : SSH, HTTP, HTTPS, DNS et autres
  • Tester avec netcat : vérifier si un port est ouvert
  • Interpréter les erreurs : refused vs timeout vs reset
  • Cas pratiques : diagnostiquer un service qui ne répond pas

Avant d’entrer dans les détails, voici le tableau de décision :

SituationProtocolePourquoi
Site web, API RESTTCPFiabilité requise
Base de donnéesTCPIntégrité des données
SSH, transfert de fichiersTCPPas de perte acceptable
Requête DNS simpleUDPRapidité, petite taille
Streaming vidéo/audioUDPLatence prime
Jeux en ligneUDPRéactivité critique
VoIP, visioconférenceUDPTemps réel
HTTP/3, QUICUDPTransport fiable implémenté au-dessus

Règle simple : si vous ne pouvez pas vous permettre de perdre des données → TCP. Si la vitesse prime sur la fiabilité → UDP.

Quand votre machine envoie des données sur le réseau, elle utilise l’un de ces deux protocoles. Ils ont des philosophies opposées.

TCP vs UDP — Comparaison📦 TCPTransmission Control Protocol📬 Courrier recommandé avec accusé✅ Connexion établie (handshake)✅ Ordre des paquets garanti✅ Retransmission si perte✅ Contrôle de flux✅ Détection d'erreursHTTP/HTTPS • SSH • EmailBases de données • APIs🚀 UDPUser Datagram Protocol📮 Carte postale simple⚡ Pas de connexion préalable⚡ Pas de garantie d'ordre⚡ Pas de retransmission⚡ Très faible latence⚡ Overhead minimalDNS • Streaming vidéo • VoIPJeux en ligne • DHCP💡 Choisir TCP quand la fiabilité prime • Choisir UDP quand la vitesse prime

TCP (Transmission Control Protocol) garantit que vos données arrivent intégralement et dans l’ordre. C’est le protocole utilisé par la majorité des services : HTTP, SSH, email, bases de données.

Caractéristiques :

  • Connexion établie avant d’envoyer des données (handshake)
  • Accusé de réception pour chaque paquet
  • Retransmission automatique si un paquet est perdu
  • Ordre garanti : les paquets arrivent dans l’ordre d’envoi
  • Contrôle de flux : évite de saturer le destinataire

Analogie : TCP, c’est comme envoyer un courrier recommandé avec accusé de réception. C’est plus lent, mais vous êtes sûr que ça arrive et dans quel état.

UDP (User Datagram Protocol) envoie les données sans vérification. Pas de connexion, pas d’accusé, pas de retransmission. C’est le protocole utilisé quand la vitesse prime : DNS, streaming, jeux.

Caractéristiques :

  • Pas de connexion : on envoie directement
  • Pas de garantie : les paquets peuvent être perdus
  • Pas d’ordre : les paquets peuvent arriver dans le désordre
  • Overhead minimal : en-tête très petit (8 octets vs 20 minimum pour TCP)
  • Latence très faible : pas d’attente d’accusé

Analogie : UDP, c’est comme envoyer une carte postale. C’est rapide et léger, mais pas de garantie que ça arrive.

Rappel important : TCP et UDP sont des protocoles de transport (couche 4). Ils transportent des données, mais ne définissent pas ce qu’elles contiennent.

  • TCP : fournit un “flux d’octets” fiable et ordonné
  • UDP : fournit des “datagrammes” indépendants, sans état

Le port identifie le service (application), pas le protocole applicatif. HTTP/2 sur TCP et HTTP/3 sur UDP utilisent tous deux le port 443.

Le handshake TCP : comment une connexion s’établit

Section intitulée « Le handshake TCP : comment une connexion s’établit »

Avant d’échanger des données, TCP doit établir une connexion. Ce processus s’appelle le three-way handshake (poignée de main en trois temps).

ClientServeur1. SYN (seq=100)2. SYN-ACK (seq=300, ack=101)3. ACK (ack=301)Connexion établie
  1. SYN (Synchronize)

    Le client envoie un paquet SYN au serveur : “Je veux me connecter”.

  2. SYN-ACK (Synchronize-Acknowledge)

    Le serveur répond avec SYN-ACK : “OK, je t’écoute, je suis prêt”.

  3. ACK (Acknowledge)

    Le client confirme avec ACK : “Bien reçu, on peut commencer”.

Après ces trois échanges, la connexion est établie et les données peuvent circuler dans les deux sens.

Quand vous testez une connexion TCP avec netcat, vous testez en réalité ce handshake :

RésultatSignification
Connection succeededHandshake complet → service accessible
Connection refusedLe serveur a répondu RST → port fermé
TimeoutPas de réponse → paquet perdu ou filtré

Un port est un numéro (0–65535) qui identifie un service sur une machine. Certains ports sont réservés par convention :

PortProtocoleServiceDescription
22TCPSSHConnexion à distance sécurisée
80TCPHTTPSites web non chiffrés
443TCPHTTPSSites web chiffrés (TLS)
53UDP/TCPDNSRésolution de noms
25TCPSMTPEnvoi d’emails
3306TCPMySQLBase de données MySQL
5432TCPPostgreSQLBase de données PostgreSQL
6379TCPRedisCache/base Redis
8080TCPHTTP altTests, proxys
27017TCPMongoDBBase de données MongoDB

netcat (ou nc) est l’outil de référence pour tester si un port TCP est ouvert et accessible.

Fenêtre de terminal
nc -zv <hôte> <port>

Options :

  • -z : mode scan (ne pas envoyer de données)
  • -v : mode verbeux (afficher le résultat)
Fenêtre de terminal
nc -zv github.com 443

Sortie :

Connection to github.com 443 port [tcp/https] succeeded!

Le port 443 (HTTPS) de GitHub est accessible. Le handshake TCP a réussi.

MessageSignificationCause probable
succeededConnexion établieService accessible
refusedPort ferméAucun service n’écoute
timed outPas de réponsePare-feu (DROP), routage, ou rate-limit
No route to hostRoutage impossibleProblème réseau

Pour voir quels services écoutent sur votre machine :

Fenêtre de terminal
ss -tuln

Options :

  • -t : TCP
  • -u : UDP
  • -l : en écoute (listening)
  • -n : numérique (pas de résolution DNS)

Sortie typique :

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:3000 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
udp UNCONN 0 0 127.0.0.53:53 0.0.0.0:*

Lecture :

Local AddressSignification
0.0.0.0:22SSH écoute sur toutes les interfaces
127.0.0.1:3000App écoute uniquement en local
127.0.0.53:53DNS local (systemd-resolved)

Cas pratique : diagnostiquer un service inaccessible

Section intitulée « Cas pratique : diagnostiquer un service inaccessible »

Scénario : votre API déployée sur api.example.com ne répond pas.

  1. Vérifier la résolution DNS

    Fenêtre de terminal
    dig +short api.example.com

    Si pas de réponse → problème DNS. Sinon, notez l’IP.

  2. Tester la connectivité réseau

    Fenêtre de terminal
    ping -c 3 api.example.com

    Si timeout → problème réseau ou ICMP bloqué. Ne concluez pas trop vite : continuez avec un test TCP.

  3. Tester le port TCP

    Fenêtre de terminal
    nc -zv api.example.com 443
    • succeeded → le port est ouvert, problème applicatif
    • refused → le service n’écoute pas
    • timeout → pare-feu ou routage
  4. Vérifier côté serveur (si vous avez accès)

    Fenêtre de terminal
    sudo ss -tulnp | grep :443

    Le service écoute-t-il ? Sur quelle interface ?

  5. Vérifier le pare-feu

    Fenêtre de terminal
    # iptables (legacy, encore courant)
    sudo iptables -L -n | grep 443
    # nftables (moderne, Debian 10+, Ubuntu 20.04+)
    sudo nft list ruleset | grep 443

    Une règle bloque-t-elle le trafic entrant ?

  1. Testez un port fermé local

    Fenêtre de terminal
    nc -zv localhost 12345

    Observez le message “Connection refused” — aucun service n’écoute.

  2. Testez un port ouvert local (si SSH actif)

    Fenêtre de terminal
    nc -zv localhost 22

    Observez “succeeded” si sshd écoute.

  3. Listez les services de votre machine

    Fenêtre de terminal
    ss -tuln

    Quels services écoutent ? Sur quelle interface ?

  4. Identifiez les processus (avec sudo)

    Fenêtre de terminal
    sudo ss -tulnp | grep LISTEN

    Quel processus écoute sur chaque port ?

  1. Testez les ports web de Google

    Fenêtre de terminal
    nc -zv -w 3 google.com 80
    nc -zv -w 3 google.com 443

    Les deux devraient répondre “succeeded”.

  2. Simulez un timeout

    Fenêtre de terminal
    nc -zv -w 2 192.0.2.1 80

    L’adresse 192.0.2.1 est réservée pour la documentation et ne répond jamais.

  3. Mesurez le temps de réponse

    Fenêtre de terminal
    time nc -zv -w 5 google.com 443

    La connexion TCP prend combien de temps ?

  4. Testez plusieurs ports d’un coup

    Fenêtre de terminal
    nc -zv -w 2 google.com 80 443

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
10 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • TCP = fiable, connexion établie, retransmission → HTTP, SSH, bases de données
  • UDP = rapide, sans connexion, sans garantie → DNS, streaming, jeux
  • QUIC/HTTP/3 = UDP + fiabilité applicative (la fiabilité n’est pas réservée à TCP)
  • Handshake TCP : SYN → SYN-ACK → ACK (3 échanges avant de communiquer)
  • nc -zv <hôte> <port> : teste si un port TCP est accessible
  • refused = port fermé (service absent), timeout = filtré (pare-feu DROP)
  • UDP non testable comme TCP : “succeeded” ne garantit pas un service actif
  • ss -tuln : voir les ports en écoute sur votre machine
  • Ports privilégiés : < 1024, nécessitent root ou CAP_NET_BIND_SERVICE