Outils pour utilisateurs

Outils du site


Un exemple simple avec IPv4

Nous allons mettre en évidence tous les mécanismes mis en jeu lorsqu'un nœud du réseau local qui vient de démarrer souhaite obtenir une page publiée par un serveur web.

Le banc de test

La Maquette Le réseau local IPV4 est le suivant:

  • le bloc IPv4 = 192.168.60/24. Nous utilisons des adresses privées. En V4, pas possible de faire autrement, sauf en achetant des IPv4 publiques, ce qi n'est plus guère possible pour un particulier.;
  • une station de travail dispose de l'adresse 192.168.60.112;
  • un serveur DNS local a l'adresse 192.168.60.3;
  • la «box» du fournisseur d'accès a l'adresse 192.168.60.254 dans le réseau local. Elle est connectée au réseau du F.A.I par la fibre et dispose sur l'internet de l'unique adresse IPV4 que nous attribue le F.A.I. Un tour de passe-passe1) va tout de même permettre aux nœuds du lan, malgré leur adresse privée, de joindre des nœuds de l'internet disposant de «vraies adresses» IP(V4).

Un analyseur de trames est installé sur la station de travail et va capturer tout ce qu'il se passe le concernant lorsqu'il cherche à joindre la page d'accueil située sur demo.nain-t.net.

Analyse de l'enregistrement

Première recherche ARP

1     1c:b7:2c:2d:74:e6     Broadcast             ARP      42     Who has 192.168.60.3? Tell 192.168.60.112
2     1c:b7:2c:df:a1:f0     1c:b7:2c:2d:74:e6     ARP      ''192.168.60.3'' is at 18:31:bf:df:a1:f0
Rappelons que la station de travail vient de se réveiller.

  • Elle demande alors par un broadcast ARP (ff:ff:ff:ff:ff:ff) qui a l'adresse IP 192.168.60.3 c'est-à-dire le serveur DNS;
  • Ledit serveur DNS utilise alors ARP pour répondre: 192.168.60.3 est à l'adresse 18:31:bf:df:a1:f0.

La réponse à la question “pourquoi la station de travail demande-t-elle cette information ?” se trouve dans les deux trames qui suivent: C'est pour joindre le serveur DNS

Résolution du nom de la cible

3     192.168.60.112        192.168.60.3          DNS      Standard query 0xcaaa A demo.nain-t.net
4     192.168.60.3          192.168.60.112        DNS      Standard query response 0xcaaa A demo.nain-t.net A 51.68.121.59
La station de travail demande au serveur DNS quelle est l'adresse de demo.nain-t.net et le serveur lui répond que c'est 51.68.121.59. Bon. Mais que viennent faire les adresses MAC là dedans? Voyons tout le détail de la trame 3:

Frame 3: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface enp2s0f2, id 0

Ethernet II, Src: 1c:b7:2c:2d:74:e6 (1c:b7:2c:2d:74:e6), Dst: 1c:b7:2c:df:a1:f0 (18:31:bf:df:a1:f0)
    Destination: 1c:b7:2c:df:a1:f0 (18:31:bf:df:a1:f0)
        Address: 1c:b7:2c:df:a1:f0 (18:31:bf:df:a1:f0)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: 1c:b7:2c:2d:74:e6 (1c:b7:2c:2d:74:e6)
        Address: 1c:b7:2c:2d:74:e6 (1c:b7:2c:2d:74:e6)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.60.112, Dst: 192.168.60.3
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 60
    Identification: 0x7449 (29769)
    010. .... = Flags: 0x2, Don't fragment
        0... .... = Reserved bit: Not set
        .1.. .... = Don't fragment: Set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 64
    Protocol: UDP (17)
    Header Checksum: 0xcca3 [validation disabled]
    [Header checksum status: Unverified]
    Source Address: 192.168.60.112
    Destination Address: 192.168.60.3
    
User Datagram Protocol, Src Port: 51269, Dst Port: 53
    Source Port: 51269
    Destination Port: 53
    Length: 40
    Checksum: 0xf9fd [unverified]
    [Checksum Status: Unverified]
    [Stream index: 0]
    [Timestamps]
        [Time since first frame: 0.000000000 seconds]
        [Time since previous frame: 0.000000000 seconds]
    UDP payload (32 bytes)
Domain Name System (query)
    Transaction ID: 0xcaaa
    Flags: 0x0100 Standard query
        0... .... .... .... = Response: Message is a query
        .000 0... .... .... = Opcode: Standard query (0)
        .... ..0. .... .... = Truncated: Message is not truncated
        .... ...1 .... .... = Recursion desired: Do query recursively
        .... .... .0.. .... = Z: reserved (0)
        .... .... ...0 .... = Non-authenticated data: Unacceptable
    Questions: 1
    Answer RRs: 0
    Authority RRs: 0
    Additional RRs: 0
    Queries
        demo.nain-t.net: type A, class IN
            Name: demo.nain-t.net
            [Name Length: 14]
            [Label Count: 3]
            Type: A (Host Address) (1)
            Class: IN (0x0001)
    [Response In: 4]

  1. La partie surlignée en blanc représente ce qui concerne la couche Ethernet. Dans cette couche, nous voyons bien que seules les adresses MAC sont utilisées. Cette couche ne concerne que le transport dans le réseau local. Les source et destination MAC correspondent bien aux IP des deux nœuds. Il y a dans cette couche le type utilisé dans la couche supérieure: Type: IPv4.
  2. La partie surlignée en orange représente le couche IP. Ici bien entendu ce sont les adresses IP qui sont utilisées. Le client s'adresse au serveur DNS. Ils sont tous les deux dans le réseau local. Ici, l'information concernant la couche supérieure est également indiquée: Protocol: UDP.
  3. Enfin, la partie surlignée en bleu correspond à la partie application. Nous découvrons les ports serveur (53) et client (51269). Nous y trouvons les détails du protocole DNS avec la question posée: demo.nain-t.net: type A, class IN.

Il n'est pas fondamental de détailler la trame 4 qui n'est que la réponse du berger à la bergère, en suivant le même protocole, ce qui donne: demo.nain-t.net: type A, class IN, addr 51.68.121.59.

Notons que l'adresse du serveur demo.nain-t.net n'est pas du tout dans le réseau local. La couche 3 du modèle OSI (Réseau) qui correspond dans notre modèle à la couche «Internet» l'a détecté et va donc rechercher le routeur à utiliser, ce qui exilique la présence des deux trames qui suivent:

Deuxième recherche ARP

5     1c:b7:2c:2d:74:e6     Broadcast             ARP      Who has 192.168.60.254? Tell 192.168.60.112
6     FreeboxS_86:ec:02     1c:b7:2c:2d:74:e6     ARP      192.168.60.254 is at 68:a3:78:86:ec:02

La station de travail cherche à connaître l'adresse MAC de la «box» que nous savons être 192.168.60.254 car c'est elle qui assure la fonction de routage2) du LAN vers le reste du monde. Si bien que, lors de l'établissement de la connexion TCP entre la station de travail et le serveur distant:

Établissement de la connexion TCP avec la cible

7    192.168.60.112        51.68.121.59          TCP      45616 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=1954462386 TSecr=0 WS=128
8    51.68.121.59          192.168.60.112        TCP      80 → 45616 [SYN, ACK] Seq=0 Ack=1 Win=65160 Len=0 MSS=1460 SACK_PERM TSval=3689330405 TSecr=1954462386 WS=128
9    192.168.60.112        51.68.121.59          TCP      645616 → 80 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=1954462406 TSecr=3689330405
 
En ce qui concerne directement TCP, nous pouvons observer que de nombreux paramètres vont être négociés:

Source Port 45616 C'est le client qui le choisit plus ou moins au hasard
Destination Port 80 C'est le port conventionnel pour les serveurs HTTP
Window 64240 Taille de la fenêtre proposée par le client
MSS 1460 Maximum Segment Size, en rapport avec le MTU3)
WS 128 Window Scale (multiplicateur de la taille de la fenêtre)

Aparté sur le routage

Si l'on regarde dans le détail de la trame 7 la couche Ethernet, nous voyons:

Frame 7: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface enp2s0f2, id 0

Ethernet II, Src: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6), Dst: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
    Destination: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        Address: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        Address: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.60.112, Dst: 51.68.121.59
...
La couche Ethernet va porter ce paquet à la «box» et là s'arrête sa vision, alors que dans le début de la trame IP nous voyons bien l'adresse IP du serveur demo.nain-t.net.

De même dans la trame 8:

Frame 8: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface enp2s0f2, id 0

Ethernet II, Src: FreeboxS_86:ec:02 (68:a3:78:86:ec:02), Dst: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
    Destination: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        Address: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        Address: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
    Internet Protocol Version 4, Src: 51.68.121.59, Dst: 192.168.60.112
    
Sur la couche Ethernet, c'est l'adresse MAC de la «box» qui est la source.

Les applications discutent

La connexion TCP étant en place, le client effectue une première requête dans la trame 10:

Frame 10: 368 bytes on wire (2944 bits), 368 bytes captured (2944 bits) on interface enp2s0f2, id 0
Ethernet II, Src: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6), Dst: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
    Destination: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        Address: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        Address: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.60.112, Dst: 51.68.121.59
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 400
    Identification: 0x47ec (18412)
    010. .... = Flags: 0x2, Don't fragment
        0... .... = Reserved bit: Not set
        .1.. .... = Don't fragment: Set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 64
    Protocol: TCP (6)
    Header Checksum: 0x841d [validation disabled]
    Source Address: 192.168.60.112
    Destination Address: 51.68.121.59
Transmission Control Protocol, Src Port: 45616, Dst Port: 80, Seq: 1, Ack: 1, Len: 348
    Source Port: 45616
    Destination Port: 80
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 983250803
    Acknowledgment Number: 1    (relative ack number)
    Acknowledgment number (raw): 3608667855
    1000 .... = Header Length: 32 bytes (8)
    Flags: 0x018 (PSH, ACK)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Accurate ECN: Not set
        .... 0... .... = Congestion Window Reduced: Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...1 .... = Acknowledgment: Set
        .... .... 1... = Push: Set
        .... .... .0.. = Reset: Not set
        .... .... ..0. = Syn: Not set
        .... .... ...0 = Fin: Not set
    Window: 502
    Checksum: 0xab1a [unverified]
    Urgent Pointer: 0
    Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - Timestamps: TSval 1954463268, TSecr 3689330405
            Kind: Time Stamp Option (8)
            Length: 10
            Timestamp value: 1954463268
            Timestamp echo reply: 3689330405
    TCP payload (348 bytes)
Hypertext Transfer Protocol
    GET / HTTP/1.1\r\n
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
    Upgrade-Insecure-Requests: 1\r\n
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15\r\n
    Accept-Encoding: gzip, deflate\r\n
    Accept-Language: fr-FR,fr;q=0.90\r\n
    Connection: Keep-Alive\r\n
    Host: demo.nain-t.net\r\n
    \r\n
Dans la couche IP, nous confirmons bien que le transport se fera par TCP et que c'est bien le client local (192.168.60.112) qui s'adresse au serveur distant (51.68.121.59).

Dans la couche Transport, nous pouvons remarquer:

  • les Sequence Number = 1 (notons que c'est Wireshark qui calcule ce paramètre. Le «vrai», c'est le «(raw)». C'est une attention du logiciel pour faciliter l'analyse):
  • le Acknowledgment Number: 1 (même remarque que précédemment) , qu'il faudrait retrouver dans un ACK à-venir, augmenté du TCP payload comme nous l'avons vu plus haut;
  • le bit Push à 1, ce qui veut dire que l'application (le navigateur web) souhaite que le datagramme doit être envoyé sitôt finie sa construction. Le système peut en effet créer un tampon pour stocker des datagrammes avant de les envoyer.
  • le TCP payload de 348 octets

Dans la couche application, ce qui est le plus important c'est:

  • GET / HTTP/1.1. La commande GET signifie que le client demande un document. Ici la page d'accueil, celle qui est à la racine du site.

Le segment suivant:

11   51.68.121.59          192.168.60.112        TCP     80 → 45616 [ACK] Seq=1 Ack: 349...

C'est le serveur qui confirme au client qu'il a bien reçu le segment que le client lui a envoyé. Ici la taille de la fenêtre n'a pas d'importance vue la taille du segment. Ack : 349 est bien égal à 1 + 348

Dans le segment suivant, le serveur répond (pour alléger cette page, faisons l'impasse sur les couches IP et TCP):

Frame 12: 365 bytes on wire (2920 bits), 365 bytes captured (2920 bits) on interface enp2s0f2, id 0

Ethernet II, Src: FreeboxS_86:ec:02 (68:a3:78:86:ec:02), Dst: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
    Destination: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        Address: ASUSTekC_2d:74:e6 (1c:b7:2c:2d:74:e6)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        Address: FreeboxS_86:ec:02 (68:a3:78:86:ec:02)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 51.68.121.59, Dst: 192.168.60.112
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 351
    Identification: 0xcf79 (53113)
    010. .... = Flags: 0x2, Don't fragment
        0... .... = Reserved bit: Not set
        .1.. .... = Don't fragment: Set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 53
    Protocol: TCP (6)
    Header Checksum: 0xcb87 [validation disabled]
    Source Address: 51.68.121.59
    Destination Address: 192.168.60.112
Transmission Control Protocol, Src Port: 80, Dst Port: 45616, Seq: 1, Ack: 349, Len: 299
    Source Port: 80
    Destination Port: 45616
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 3608667855
    Acknowledgment Number: 349    (relative ack number)
    Acknowledgment number (raw): 983251151
    1000 .... = Header Length: 32 bytes (8)
    Flags: 0x018 (PSH, ACK)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Accurate ECN: Not set
        .... 0... .... = Congestion Window Reduced: Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...1 .... = Acknowledgment: Set
        .... .... 1... = Push: Set
        .... .... .0.. = Reset: Not set
        .... .... ..0. = Syn: Not set
        .... .... ...0 = Fin: Not set
    Window: 507
    Checksum: 0xd0cb [unverified]
    Urgent Pointer: 0
    Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - Timestamps: TSval 3689331288, TSecr 1954463268
            Kind: Time Stamp Option (8)
            Length: 10
            Timestamp value: 3689331288
            Timestamp echo reply: 1954463268
    TCP payload (299 bytes)
Hypertext Transfer Protocol
    HTTP/1.1 200 OK\r\n
        Response Version: HTTP/1.1
        Status Code: 200
        Response Phrase: OK
    Date: Fri, 14 Feb 2025 15:59:47 GMT\r\n
    Server: Apache/2.4.62 (Debian)\r\n
    Last-Modified: Mon, 10 Feb 2025 17:38:35 GMT\r\n
    ETag: "10-62dcd2d848e57"\r\n
    Accept-Ranges: bytes\r\n
    Content-Length: 16\r\n
        [Content length: 16]
    Keep-Alive: timeout=5, max=100\r\n
    Connection: Keep-Alive\r\n
    Content-Type: text/html\r\n
    \r\n
    File Data: 16 bytes
Line-based text data: text/html (1 lines)
    Bonjour toi ;-)\n

Dans le protocole HTTP, le code 200 signifie «OK».

Le reste du dialogue ne présente pas un intérêt majeur:

  • Le client demande au serveur sa «favicon»;
  • le serveur répond qu'il n'y en a pas;
  • la session TCP prend fin avec un segment FIN:
21    51.68.121.59          192.168.60.112        TCP    80 → 45616 [FIN, ACK] ...
22    192.168.60.112        51.68.121.59          TCP    45616 → 80 [ACK]...

Le résultat tel qu'il se voit à l'écran du client: epiphany-browser

Et avec IPv6 ?

Au détail près qu'ici, chaque nœud du LAN dispose d'une «vraie» adresse publique et que le masquage d'adresse n'a donc plus lieu d'être, il se passe exactement la même chose, hormis le protocole ARP qui est remplacé par NDP (Neighbor Discovery Protocol) dont le fonctionnement, bien que restant similaire, est tout de même plus évolué. Nous le verrons dans les manipulations faites autour d'IPv6.

1)
Ce tour bien connu s'appelle «le masquage d'adresse» et nous ne manquerons pas, bien entendu, d'en étudier les subtilités.
2)
À voir en détail dans le chapitre qui lui est consacré
3)
Le MTU étant généralement de 1500 octets. Mais ici il faut retrancher la taille de l'en-tête IP (20 octets) ainsi que la taille de l'en-tête TCP, également de 20 octets.
Un exemple simple avec IPv4: Dernière modification le: 21/09/2025 à 14:03 par prof