Table des matières
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
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:f0Rappelons 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'adresse18: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.59La 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]
- 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
. - 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
. - 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
.
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=3689330405En 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.112Sur 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\nDans 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é duTCP 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 commandeGET
signifie que le clientdemande
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]...
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.