Cependant, si C1 et C2 font la même chose vers le même serveur (même ip serveur et même port), il faudrait alors 2 règles, du coup comment fait le routeur pour s'y retrouver et savoir s'il doit envoyer à C1 ou à C2 ?
Attention, je me permet de revenir sur ce sujet pour ajouter une explication.
Lorsque C1 et C2, derrière une même NAT se connecte à un serveur, deux cas possibles :
- C1 et C2 sont sur deux machines différentes.
- C1 et C2 sont sur la même machine.
Voyons ces deux cas de plus près.
C1 et C2 sont sur deux machines différentes
Dans ce cas, le NAT saura différencier les machines par leurs adresses IP distincts. Lorsque les paquets de C1 et C2 seront nattés, la NAT prendra soins de réécrire des ports sources différents. Ainsi, lors de la réponse, la NAT saura à qui est destiné le message par le port destination de la réponse sera différent.
Prenons un exemple :
Les machines A (192.168.0.10) et B (192.168.0.11) sont derrière la NAT N donc l'IP publique est 88.222.222.222 et souhaitent se connecter au serveur S (88.111.111.111) sur son port 1234.
Lorsque la machine A va se connecter au serveur S, la machine A va ouvrir un port automatiquement, choisi par le système, par exemple 5550. La NAT, située entre les clients et le serveur, va analyser le paquet de générer un numéro de port, par exemple 7770. Dans sa table, elle va donc associer 7770 à 192.168.0.10:5550. De plus la NAT va réécrire le champs source du message par son IP et son port généré de telle sorte que le serveur voie le message en provenance de 88.222.222.222:7770.
Tuple ajouté à la table de la NAT :
7770 -> 192.168.0.10:5550
Maintenant, la machine B envoie un message au serveur (même IP, même port). La machine B va ouvrir un port automatiquement, choisi par le système, par exemple 5550 (pas de bol, en plus il est identique). La NAT, située entre les clients et le serveur, va analyser le paquet de générer un numéro de port, par exemple 7771. Dans sa table, elle va donc associer 7771 à 192.168.0.11:5550. De plus la NAT va réécrire le champs source du message par son IP et son port généré de telle sorte que le serveur voie le message en provenance de 88.222.222.222:7771.
Tuple ajouté à la table de la NAT :
7771 -> 192.168.0.11:5550
Voici donc la table de la NAT :
1 2
| 7770 -> 192.168.0.10:5550
7771 -> 192.168.0.11:5550 |
Le serveur a reçu deux messages en provenance de la même IP, mais de deux port différents. (88.222.222.222:7770 et 88.222.222.222:7771). Il peux donc répondre à l'un comme à l'autre sans que ces messages soit mélangés. Il répond donc aux deux clients.
La NAT, toujours entre les deux, reçois donc deux messages : l'un sur son port 7770 et l'autre sur son port 7771.
Elle regarde sa table :
1 2
| 7770 -> 192.168.0.10:5550
7771 -> 192.168.0.11:5550 |
... et sais que le message reçu sur le port 7770 doit être acheminé vers 192.168.0.10:5550 et l'autre vers 192.168.0.11:5550.
Il n'y a donc pas de problème à avoir deux machines derrière une même NAT qui se connecte au même serveur, sur le même port.
C1 et C2 sont sur la même machine
C'est typiquement ce qu'il se produit lorsqu'on ouvre deux navigateurs et qu'on les connecte au même site.
Dans ce cas, la NAT fonctionne toujours de la même manière et le système, qui attribut les ports automatiquement, fonctionne également de la même manière. Seulement, lorsqu'un programme client demande l'ouverture d'un port au système, ce dernier lui en attribut un nouveau à chaque fois (bien souvent, c'est celui qui est immédiatement après), si bien que si C1 et C2 veulent se connecter au même serveur, le port source sera différent.
Prenons un exemple :
C1 (192.168.0.10) envois un message au serveur (88.111.111.111:1234). Le système génère un numéro de port, par exemple 6660. Le message sort de l'ordinateur avec comme adresse 192.168.0.10:6660.
La NAT fait le même travaille que tout à l'heure, génère par exemple le port 7770, et mémorise dans sa table :
7770 -> 192.168.0.10:6660
Ensuite, C2 fait la même chose, le système lui attribut le numéro de port 6661, le message sort de l'ordinateur avec comme adresse 192.168.0.10:6661. C'est la même machine mais pas le même port.
La NAT fait le même travaille que tout à l'heure, génère par exemple le port 7771, et mémorise dans sa table :
7771 -> 192.168.0.10:6661
Voici donc le contenu de la table de la NAT :
1 2
| 7770 -> 192.168.0.10:6660
7771 -> 192.168.0.10:6661 |
Pour le dialogue avec le serveur, c'est exactement la même chose que tout à l'heure, le serveur à affaire à la même IP, mais de deux port différents. (88.222.222.222:7770 et 88.222.222.222:7771). Il peux donc répondre à l'un comme à l'autre sans que ces messages soit mélangés. Il répond donc aux deux clients.
La NAT, toujours entre les deux, reçois donc deux messages : l'un sur son port 7770 et l'autre sur son port 7771.
Elle regarde sa table :
1 2
| 7770 -> 192.168.0.10:6660
7771 -> 192.168.0.10:6661 |
... et sais que le message reçu sur le port 7770 doit être acheminé vers 192.168.0.10:6660 et l'autre vers 192.168.0.10:6661.
Dans les deux cas, ce sera la même machine qui recevra les deux messages (tout comme c'était la même NAT qui a reçu les deux messages tout à l'heure). C'est ensuite dans le système que les deux messages sont être aiguillé vers le bon programme (C1 ou C2) car lors de la création de leur socket respectif, le système leur a affecté des ports différents (bien que ces programmes soit identique). Ainsi, le programme C1 récupèrera le message qui arrivera sur le port 6660 de la machine tandis que le programme C2 récupèrera le message qui arrivera sur le port 6661 de cette même machine.
D'accord, c'est bien ce que nous redoutions.
Il n'y a rien à redouter. Il n'y a que dans le cas du P2P ou il faut procéder à une "bidouille" : soit effectuer un UDP Hole Punching ou paramétrer la NAT à l'aide d'un protocole spécifique comme UPNP ou STUN. Mais dans le cas d'une communication exclusivement client/serveur, tu n'as rien à faire de particulier, sauf, bien évidement, paramétrer le routeur derrière lequel se situe ton serveur (une seule fois) si tu veux qu'on puisse y accéder depuis l'extérieur.
Partager