Chapitre 1 — Histoire et modèles OSI/TCP-IP#

Ce chapitre retrace la naissance d’Internet et présente les deux modèles de référence qui structurent encore aujourd’hui toute la réflexion sur les réseaux : le modèle OSI à 7 couches et le modèle TCP/IP à 4 couches.

Hide code cell source

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.patheffects as pe
import numpy as np
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid", palette="muted")
plt.rcParams.update({
    "figure.dpi": 120,
    "font.family": "DejaVu Sans",
    "axes.spines.top": False,
    "axes.spines.right": False,
})

Naissance d’Internet#

ARPANET (1969)#

Tout commence en 1969 lorsque l’agence de recherche du département américain de la Défense, l”ARPA (Advanced Research Projects Agency), finance la création d’un réseau expérimental reliant quatre universités :

  • UCLA (Los Angeles)

  • Stanford Research Institute

  • UC Santa Barbara

  • Université de l’Utah

Le 29 octobre 1969, le premier message est envoyé de UCLA vers Stanford. La tentative est de transmettre le mot « LOGIN » — seules les lettres « L » et « O » passent avant que le système ne plante. Internet est né sur un bug.

L’idée fondatrice d’ARPANET est la commutation de paquets (packet switching), proposée indépendamment par Paul Baran (RAND Corporation) et Donald Davies (NPL, Royaume-Uni) : plutôt que d’établir un circuit dédié entre deux points (comme le téléphone), les données sont découpées en paquets qui empruntent des chemins différents et se reassemblent à destination.

Chronologie clé#

Hide code cell source

events = [
    (1969, "ARPANET : 4 nœuds, premier message UCLA → Stanford"),
    (1971, "E-mail inventé par Ray Tomlinson (@)"),
    (1973, "Connexion internationale (Royaume-Uni, Norvège)"),
    (1974, "RFC 675 : première spécification TCP (Cerf & Kahn)"),
    (1983, "Adoption officielle de TCP/IP — 'Flag Day'"),
    (1984, "DNS introduit par Paul Mockapetris"),
    (1986, "NSFNET remplace ARPANET pour la recherche"),
    (1991, "World Wide Web — Tim Berners-Lee au CERN"),
    (1993, "Mosaic : premier navigateur graphique"),
    (1995, "Internet commercial ouvert au grand public"),
    (2004, "IPv6 déployé progressivement"),
    (2020, "Plus de 4,5 milliards d'internautes"),
]

fig, ax = plt.subplots(figsize=(12, 6))
years = [e[0] for e in events]
labels = [e[1] for e in events]
colors = plt.cm.viridis(np.linspace(0.2, 0.9, len(events)))

ax.set_xlim(1965, 2025)
ax.set_ylim(-1, 1)
ax.axhline(0, color="#555555", linewidth=2, zorder=1)

for i, (year, label) in enumerate(events):
    side = 1 if i % 2 == 0 else -1
    ax.plot([year, year], [0, side * 0.6], color=colors[i], linewidth=1.5, zorder=2)
    ax.scatter(year, 0, color=colors[i], s=60, zorder=3)
    ax.text(year, side * 0.65, str(year), ha="center", va="bottom" if side > 0 else "top",
            fontsize=7.5, fontweight="bold", color=colors[i])
    ax.text(year, side * 0.75, label, ha="center", va="bottom" if side > 0 else "top",
            fontsize=6.5, wrap=True, color="#333333",
            bbox=dict(boxstyle="round,pad=0.2", fc="white", ec=colors[i], alpha=0.85))

ax.set_yticks([])
ax.set_xticks([])
ax.set_title("Chronologie d'Internet (1969–2020)", fontsize=14, fontweight="bold", pad=20)
for spine in ax.spines.values():
    spine.set_visible(False)
plt.tight_layout()
plt.show()
_images/30deacc63eb6923b8cf91a9a1f0a6eb500a20d6051b1d5f7d831889e68f0b1dc.png

RFC et IETF#

La gouvernance technique d’Internet repose sur deux piliers :

RFC (Request for Comments) : Documents techniques publiés depuis 1969 qui définissent tous les protocoles Internet. Malgré leur nom, beaucoup sont des standards définitifs. Quelques exemples incontournables :

RFC

Protocole

Année

RFC 791

IPv4

1981

RFC 793

TCP

1981

RFC 1034/1035

DNS

1987

RFC 2616

HTTP/1.1

1999

RFC 7540

HTTP/2

2015

RFC 9000

QUIC

2021

IETF (Internet Engineering Task Force) : Organisation ouverte créée en 1986 qui développe et promeut les standards Internet. Contrairement à d’autres organismes de normalisation, l’IETF n’a pas de membres formels — n’importe qui peut participer. Les décisions se prennent par « rough consensus and running code ».


Le modèle OSI (Open Systems Interconnection)#

Développé par l’ISO (Organisation internationale de normalisation) entre 1977 et 1984, le modèle OSI est un cadre conceptuel qui décompose la communication réseau en 7 couches indépendantes. Son but : permettre à des systèmes hétérogènes de communiquer, et standardiser les interfaces entre niveaux.

Principe fondamental du modèle OSI

Chaque couche n’interagit qu’avec la couche immédiatement inférieure et supérieure. Une couche fournit des services à la couche du dessus et utilise les services de la couche du dessous. Cela permet de changer l’implémentation d’une couche sans affecter les autres.

Les 7 couches OSI#

Hide code cell source

osi_layers = [
    (7, "Application",    "HTTP, FTP, DNS, SMTP",          "Données",   "#e74c3c"),
    (6, "Présentation",   "SSL/TLS, JPEG, ASCII, chiffrement", "Données", "#e67e22"),
    (5, "Session",        "NetBIOS, RPC, établissement de session", "Données", "#f39c12"),
    (4, "Transport",      "TCP, UDP",                       "Segment",   "#27ae60"),
    (3, "Réseau",         "IP, ICMP, OSPF, BGP",            "Paquet",    "#2980b9"),
    (2, "Liaison",        "Ethernet, Wi-Fi (802.11), PPP",  "Trame",     "#8e44ad"),
    (1, "Physique",       "Câbles, hubs, signaux électriques", "Bits",   "#2c3e50"),
]

fig, ax = plt.subplots(figsize=(11, 7))
ax.set_xlim(0, 10)
ax.set_ylim(0, 7.5)
ax.axis("off")
ax.set_title("Le modèle OSI — 7 couches", fontsize=15, fontweight="bold", pad=15)

for i, (num, name, protos, pdu, color) in enumerate(osi_layers):
    y = i
    # Boîte principale
    rect = mpatches.FancyBboxPatch((0.1, y + 0.08), 9.8, 0.84,
                                    boxstyle="round,pad=0.05", linewidth=1.5,
                                    edgecolor="#555555", facecolor=color, alpha=0.85)
    ax.add_patch(rect)
    # Numéro
    ax.text(0.55, y + 0.5, str(num), ha="center", va="center",
            fontsize=16, fontweight="bold", color="white")
    # Nom de la couche
    ax.text(2.0, y + 0.5, name, ha="left", va="center",
            fontsize=11, fontweight="bold", color="white")
    # Protocoles
    ax.text(4.5, y + 0.5, protos, ha="left", va="center",
            fontsize=8.5, color="white", alpha=0.92)
    # PDU
    ax.text(9.6, y + 0.5, pdu, ha="right", va="center",
            fontsize=9, color="white", fontstyle="italic")

# Étiquettes colonne
ax.text(0.55, 7.25, "#", ha="center", va="center", fontsize=9, color="#555555", fontweight="bold")
ax.text(2.0, 7.25, "Couche", ha="left", va="center", fontsize=9, color="#555555", fontweight="bold")
ax.text(4.5, 7.25, "Protocoles / technologies", ha="left", va="center", fontsize=9, color="#555555", fontweight="bold")
ax.text(9.6, 7.25, "PDU", ha="right", va="center", fontsize=9, color="#555555", fontweight="bold")

plt.tight_layout()
plt.show()
_images/337be9508517cf7897f9f063b7bb116d76021abdf93a9a57b717024c0f27e202.png

Description détaillée des couches#

Couche 1 — Physique

Transmet les bits bruts sur le support physique. Elle définit les caractéristiques électriques, mécaniques et fonctionnelles du support : tensions, fréquences, connecteurs (RJ45, LC pour fibre), débit brut. PDU : bit.

Couche 2 — Liaison de données

Organise les bits en trames et gère l’accès au support partagé (MAC — Medium Access Control). Elle détecte (et parfois corrige) les erreurs de transmission au niveau local. Exemples : Ethernet (IEEE 802.3), Wi-Fi (IEEE 802.11). PDU : trame.

Couche 3 — Réseau

Assure le routage des paquets de la source à la destination à travers des réseaux hétérogènes. Elle gère l’adressage logique (adresses IP) et détermine le chemin optimal. PDU : paquet.

Couche 4 — Transport

Fournit une communication de bout en bout entre processus. Elle assure (ou non, selon le protocole) la fiabilité, le contrôle de flux et la gestion des erreurs. TCP (fiable, orienté connexion) et UDP (non fiable, sans connexion). PDU : segment (TCP) ou datagramme (UDP).

Couche 5 — Session

Établit, gère et termine les sessions de communication entre applications. Peu implémentée en pratique — ses fonctions sont souvent absorbées par les couches 4 et 7.

Couche 6 — Présentation

Traduit les données entre le format réseau et le format application : encodage des caractères (ASCII, UTF-8), sérialisation (JSON, XML), compression, chiffrement (SSL/TLS est parfois placé ici).

Couche 7 — Application

Interface directe avec les applications utilisateur. Définit les protocoles métier : HTTP pour le web, SMTP pour le courrier, DNS pour la résolution de noms, FTP pour les fichiers…


Le modèle TCP/IP#

Le modèle TCP/IP (aussi appelé modèle Internet ou modèle DoD) est le modèle pratique sur lequel Internet est réellement construit. Il comporte 4 couches, fruit d’une simplification pragmatique par rapport à OSI.

Hide code cell source

fig, axes = plt.subplots(1, 2, figsize=(12, 7))

# ---- Modèle OSI ----
ax = axes[0]
ax.set_xlim(0, 4)
ax.set_ylim(0, 7.5)
ax.axis("off")
ax.set_title("Modèle OSI", fontsize=13, fontweight="bold")

osi_colors = ["#2c3e50","#8e44ad","#2980b9","#27ae60","#f39c12","#e67e22","#e74c3c"]
osi_names  = ["1 — Physique","2 — Liaison","3 — Réseau","4 — Transport",
               "5 — Session","6 — Présentation","7 — Application"]
for i, (name, color) in enumerate(zip(osi_names, osi_colors)):
    rect = mpatches.FancyBboxPatch((0.2, i + 0.1), 3.6, 0.8,
                                    boxstyle="round,pad=0.05",
                                    edgecolor="#444", facecolor=color, alpha=0.85)
    ax.add_patch(rect)
    ax.text(2.0, i + 0.5, name, ha="center", va="center",
            fontsize=10, color="white", fontweight="bold")

# ---- Modèle TCP/IP ----
ax2 = axes[1]
ax2.set_xlim(0, 4)
ax2.set_ylim(0, 7.5)
ax2.axis("off")
ax2.set_title("Modèle TCP/IP", fontsize=13, fontweight="bold")

tcpip_layers = [
    (0.1, 1.7,  "#2c3e50", "Accès réseau\n(Physique + Liaison)"),
    (1.9, 1.0,  "#2980b9", "Internet\n(Réseau)"),
    (2.9, 1.0,  "#27ae60", "Transport\n(Transport)"),
    (3.9, 2.2,  "#e74c3c", "Application\n(Session + Présentation\n+ Application)"),
]

for (y_start, height, color, label) in tcpip_layers:
    rect = mpatches.FancyBboxPatch((0.2, y_start + 0.1), 3.6, height - 0.2,
                                    boxstyle="round,pad=0.05",
                                    edgecolor="#444", facecolor=color, alpha=0.85)
    ax2.add_patch(rect)
    ax2.text(2.0, y_start + height / 2, label, ha="center", va="center",
             fontsize=9.5, color="white", fontweight="bold")

# Flèches de correspondance entre les deux modèles
fig.text(0.5, 0.5, "⟵ correspondance ⟶", ha="center", va="center",
         fontsize=9, color="#777777", fontstyle="italic")

plt.suptitle("Comparaison OSI ↔ TCP/IP", fontsize=14, fontweight="bold", y=1.01)
plt.tight_layout()
plt.show()
_images/12ad6c2c5904068c71c87c2a5f36a14063c23c83a11cde43f3b1707b3c67fc75.png

Correspondance OSI / TCP/IP#

Couche TCP/IP

Couches OSI équivalentes

Exemples de protocoles

Application

Application (7) + Présentation (6) + Session (5)

HTTP, DNS, SMTP, FTP, SSH

Transport

Transport (4)

TCP, UDP, SCTP

Internet

Réseau (3)

IP (v4/v6), ICMP, OSPF

Accès réseau

Liaison (2) + Physique (1)

Ethernet, Wi-Fi, PPP

OSI vs TCP/IP en pratique

Le modèle OSI est un outil pédagogique et conceptuel de référence — on raisonne en couches OSI pour diagnostiquer des problèmes réseau. Le modèle TCP/IP est la réalité déployée : Internet fonctionne sur TCP/IP, pas sur OSI. Dans la pratique, on parle souvent de « couche 3 » (réseau/IP) ou « couche 7 » (applicatif) en référence à OSI, même lorsqu’on travaille sur TCP/IP.


Encapsulation et décapsulation#

L”encapsulation est le processus par lequel chaque couche ajoute son propre en-tête (et parfois un pied de page) aux données reçues de la couche supérieure, avant de les transmettre à la couche inférieure.

À la réception, le processus inverse — la décapsulation — retire les en-têtes couche par couche.

Hide code cell source

fig, ax = plt.subplots(figsize=(13, 8))
ax.set_xlim(0, 14)
ax.set_ylim(0, 9)
ax.axis("off")
ax.set_title("Encapsulation des données à travers les couches TCP/IP", fontsize=14, fontweight="bold")

layers_info = [
    ("Application",   "#e74c3c", ["Données HTTP"],                                     7.8),
    ("Transport",     "#27ae60", ["En-tête TCP", "Données HTTP"],                       5.8),
    ("Internet",      "#2980b9", ["En-tête IP", "En-tête TCP", "Données HTTP"],         3.8),
    ("Accès réseau",  "#8e44ad", ["Préambule\nEth.", "En-tête IP", "En-tête TCP",
                                   "Données HTTP", "FCS"],                              1.8),
]

segment_colors = {
    "Données HTTP":   "#fadbd8",
    "En-tête TCP":    "#d5f5e3",
    "En-tête IP":     "#d6eaf8",
    "Préambule\nEth.":"#e8daef",
    "FCS":            "#e8daef",
}

for layer_name, layer_color, segments, y in layers_info:
    # Étiquette de la couche
    ax.text(0.1, y + 0.5, layer_name, ha="left", va="center",
            fontsize=10, fontweight="bold", color=layer_color)

    total_width = 12.5
    widths = []
    for seg in segments:
        if "Données" in seg:
            widths.append(4.0)
        elif "Préambule" in seg or "FCS" in seg:
            widths.append(1.5)
        else:
            widths.append(1.8)

    scale = total_width / sum(widths)
    widths = [w * scale for w in widths]

    x = 1.3
    for seg, w in zip(segments, widths):
        color = segment_colors.get(seg, "#f0f0f0")
        rect = mpatches.FancyBboxPatch((x, y + 0.05), w - 0.05, 0.9,
                                        boxstyle="round,pad=0.04",
                                        edgecolor=layer_color, facecolor=color, linewidth=1.5)
        ax.add_patch(rect)
        ax.text(x + (w - 0.05) / 2, y + 0.5, seg, ha="center", va="center",
                fontsize=7.5, color="#333333", fontweight="bold" if "En-tête" in seg or "Préambule" in seg else "normal")
        x += w

# Flèche émission
ax.annotate("", xy=(0.5, 1.5), xytext=(0.5, 8.5),
            arrowprops=dict(arrowstyle="-|>", color="#e74c3c", lw=2))
ax.text(0.5, 9.1, "Émetteur\n(encapsulation)", ha="center", va="bottom",
        fontsize=8, color="#e74c3c", fontweight="bold")

# Flèche réception (côté droit)
ax.annotate("", xy=(13.5, 8.5), xytext=(13.5, 1.5),
            arrowprops=dict(arrowstyle="-|>", color="#27ae60", lw=2))
ax.text(13.5, 9.1, "Récepteur\n(décapsulation)", ha="center", va="bottom",
        fontsize=8, color="#27ae60", fontweight="bold")

# PDU labels
pdu_labels = ["Données (message)", "Segment TCP", "Paquet IP", "Trame Ethernet"]
pdu_y      = [7.8, 5.8, 3.8, 1.8]
for lbl, y in zip(pdu_labels, pdu_y):
    ax.text(13.8, y + 0.5, lbl, ha="left", va="center",
            fontsize=7.5, color="#555555", fontstyle="italic")

plt.tight_layout()
plt.show()
_images/4a87bd283047eb1063c9ee19bec8e9954bfbea1a4a10ad24505698ce92d710ac.png

Simulation Python d’encapsulation avec struct#

import struct

def make_http_payload(methode: str, chemin: str, hote: str) -> bytes:
    """Construit une requête HTTP/1.1 minimale."""
    requete = f"{methode} {chemin} HTTP/1.1\r\nHost: {hote}\r\nConnection: close\r\n\r\n"
    return requete.encode("ascii")

def encapsuler_tcp(payload: bytes, port_src: int, port_dst: int, seq: int = 1000) -> bytes:
    """
    Ajoute un faux en-tête TCP simplifié (sans checksum réel).
    Format : port_src (2o) | port_dst (2o) | seq (4o) | ack (4o) | flags (2o)
    """
    flags = 0x018  # PSH + ACK
    en_tete_tcp = struct.pack(">HHIIH", port_src, port_dst, seq, 0, flags)
    return en_tete_tcp + payload

def encapsuler_ip(segment: bytes, ip_src: str, ip_dst: str, proto: int = 6) -> bytes:
    """
    Ajoute un faux en-tête IPv4 simplifié.
    Format : version+IHL (1o) | TTL (1o) | proto (1o) | longueur (2o) | src (4o) | dst (4o)
    """
    def ip_to_bytes(ip: str) -> bytes:
        return bytes(int(x) for x in ip.split("."))

    longueur = 13 + len(segment)  # en-tête simplifié (13 octets) + segment
    version_ihl = (4 << 4) | 5   # IPv4, IHL=5 (20 octets réels, simplifié ici)
    en_tete_ip = struct.pack(">BBH", version_ihl, 64, longueur)
    en_tete_ip += ip_to_bytes(ip_src) + ip_to_bytes(ip_dst) + bytes([proto])
    return en_tete_ip + segment

def encapsuler_ethernet(paquet: bytes, mac_src: str, mac_dst: str, ethertype: int = 0x0800) -> bytes:
    """
    Ajoute un en-tête Ethernet simplifié.
    Format : dst (6o) | src (6o) | EtherType (2o)
    """
    def mac_to_bytes(mac: str) -> bytes:
        return bytes(int(x, 16) for x in mac.split(":"))

    en_tete_eth = mac_to_bytes(mac_dst) + mac_to_bytes(mac_src) + struct.pack(">H", ethertype)
    return en_tete_eth + paquet

# --- Simulation ---
print("=== Simulation d'encapsulation réseau ===\n")

# Couche Application : données HTTP
payload = make_http_payload("GET", "/index.html", "example.com")
print(f"[Couche Application] Données HTTP : {len(payload)} octets")
print(f"  {payload[:60]}...\n")

# Couche Transport : encapsulation TCP
segment = encapsuler_tcp(payload, port_src=54321, port_dst=80)
print(f"[Couche Transport] Segment TCP : {len(segment)} octets")
print(f"  En-tête TCP (hex) : {segment[:10].hex(' ')}\n")

# Couche Internet : encapsulation IP
paquet = encapsuler_ip(segment, ip_src="192.168.1.10", ip_dst="93.184.216.34")
print(f"[Couche Internet] Paquet IP : {len(paquet)} octets")
print(f"  En-tête IP (hex) : {paquet[:13].hex(' ')}\n")

# Couche Accès réseau : encapsulation Ethernet
trame = encapsuler_ethernet(paquet,
                             mac_src="aa:bb:cc:dd:ee:ff",
                             mac_dst="11:22:33:44:55:66")
print(f"[Couche Accès réseau] Trame Ethernet : {len(trame)} octets")
print(f"  En-tête Ethernet (hex) : {trame[:14].hex(' ')}\n")

print(f"--- Trame complète ({len(trame)} octets) ---")
print(f"  Premiers 32 octets : {trame[:32].hex(' ')}")
=== Simulation d'encapsulation réseau ===

[Couche Application] Données HTTP : 66 octets
  b'GET /index.html HTTP/1.1\r\nHost: example.com\r\nConnection: clo'...

[Couche Transport] Segment TCP : 80 octets
  En-tête TCP (hex) : d4 31 00 50 00 00 03 e8 00 00

[Couche Internet] Paquet IP : 93 octets
  En-tête IP (hex) : 45 40 00 5d c0 a8 01 0a 5d b8 d8 22 06

[Couche Accès réseau] Trame Ethernet : 107 octets
  En-tête Ethernet (hex) : 11 22 33 44 55 66 aa bb cc dd ee ff 08 00

--- Trame complète (107 octets) ---
  Premiers 32 octets : 11 22 33 44 55 66 aa bb cc dd ee ff 08 00 45 40 00 5d c0 a8 01 0a 5d b8 d8 22 06 d4 31 00 50 00

Décapsulation : lecture des en-têtes#

def decapsuler_ethernet(trame: bytes):
    """Lit et retire l'en-tête Ethernet."""
    mac_dst = trame[0:6]
    mac_src = trame[6:12]
    ethertype = struct.unpack(">H", trame[12:14])[0]
    payload = trame[14:]
    print(f"[Ethernet] dst={':'.join(f'{b:02x}' for b in mac_dst)}"
          f"  src={':'.join(f'{b:02x}' for b in mac_src)}"
          f"  EtherType=0x{ethertype:04X}")
    return payload

def decapsuler_ip(paquet: bytes):
    """Lit et retire l'en-tête IP simplifié (13 octets ici)."""
    version_ihl, ttl, longueur = struct.unpack(">BBH", paquet[0:4])
    ip_src = ".".join(str(b) for b in paquet[4:8])
    ip_dst = ".".join(str(b) for b in paquet[8:12])
    proto  = paquet[12]
    payload = paquet[13:]
    print(f"[IP]       src={ip_src}  dst={ip_dst}  TTL={ttl}  proto={proto}")
    return payload

def decapsuler_tcp(segment: bytes):
    """Lit et retire l'en-tête TCP simplifié (10 octets ici)."""
    port_src, port_dst, seq, ack, flags = struct.unpack(">HHIIH", segment[0:14])
    payload = segment[14:]
    print(f"[TCP]      src_port={port_src}  dst_port={port_dst}  seq={seq}  flags=0x{flags:03X}")
    return payload

print("=== Simulation de décapsulation (côté récepteur) ===\n")
reste = decapsuler_ethernet(trame)
reste = decapsuler_ip(reste)
reste = decapsuler_tcp(reste)
print(f"[HTTP]     {reste.decode('ascii', errors='replace')[:80]}...")
=== Simulation de décapsulation (côté récepteur) ===

[Ethernet] dst=11:22:33:44:55:66  src=aa:bb:cc:dd:ee:ff  EtherType=0x0800
[IP]       src=192.168.1.10  dst=93.184.216.34  TTL=64  proto=6
[TCP]      src_port=54321  dst_port=80  seq=1000  flags=0x018
[HTTP]     GET /index.html HTTP/1.1
Host: example.com
Connection: close

...

Résumé#

Hide code cell source

fig, ax = plt.subplots(figsize=(11, 5))
ax.axis("off")

resume = {
    "Concept": ["ARPANET", "RFC", "IETF", "Modèle OSI", "Modèle TCP/IP", "Encapsulation"],
    "Rôle": [
        "Premier réseau à commutation de paquets (1969)",
        "Documents définissant les standards Internet",
        "Organisme ouvert gérant les standards Internet",
        "Cadre conceptuel à 7 couches (ISO)",
        "Modèle pratique d'Internet à 4 couches",
        "Ajout d'en-têtes couche par couche à l'émission",
    ],
    "Exemple / date": [
        "4 nœuds — UCLA, Stanford, UCSB, Utah",
        "RFC 791 (IPv4), RFC 793 (TCP), RFC 2616 (HTTP)",
        "Fondé en 1986, réunions publiques",
        "ISO 7498 — publié en 1984",
        "Adopté officiellement en 1983 (Flag Day)",
        "Trame = En-tête Eth. + Paquet IP + Segment TCP + HTTP",
    ],
}

df = pd.DataFrame(resume)
tbl = ax.table(cellText=df.values, colLabels=df.columns,
               cellLoc="left", loc="center",
               colWidths=[0.18, 0.45, 0.37])
tbl.auto_set_font_size(False)
tbl.set_fontsize(8.5)
tbl.scale(1, 2.2)

for (row, col), cell in tbl.get_celld().items():
    if row == 0:
        cell.set_facecolor("#2c3e50")
        cell.set_text_props(color="white", fontweight="bold")
    elif row % 2 == 0:
        cell.set_facecolor("#eaf4fb")
    else:
        cell.set_facecolor("white")
    cell.set_edgecolor("#cccccc")

ax.set_title("Récapitulatif du chapitre 1", fontsize=13, fontweight="bold", pad=15)
plt.tight_layout()
plt.show()
_images/ed43c1be0d473ad36e19696dc1d5cb6c66fc1532809d413ec0d7371c3455516d.png

Points clés à retenir

  • Internet est né d’ARPANET en 1969 sur le principe de la commutation de paquets.

  • Le modèle OSI (7 couches) est un cadre pédagogique et de référence ; le modèle TCP/IP (4 couches) est la réalité déployée.

  • Les PDU (Protocol Data Units) changent de nom selon la couche : bits → trames → paquets → segments → données.

  • L”encapsulation consiste à envelopper les données de chaque couche dans un en-tête de la couche inférieure.

  • Les RFC sont les documents techniques fondateurs d’Internet, gérés par l”IETF.