Je n'ai pas été voir les détails d'implémentation, mais je suppose qu'il y a une table des connexions TCP utilisant des adresses IPv6 dans le noyau. Chaque entrée dans la table contiendrait l'adresse source et l'adresse de destination.
Au niveau réseau, quand le kernel aurait à envoyer des paquets TCP, il construirait au niveau 3 des paquets IPv4 si l'adresse IPv6 correspond à une adresse IPv4 mappée, sinon des paquets IPv6.
Je spécule sur le fonctionnement du noyau mais ça doit être plus ou moins ça. Je regarderai les détails si ça t'intéresse.
Sur les systèmes *BSD, il semble que les sockets gèrent soit v4 soit v6 mais pas les 2 en même temps. Exemple sur mon FreeBSD 5.3:
tcp4 0 0 *.22 *.* LISTEN
tcp6 0 0 *.22 *.* LISTEN
Pour avoir un comportement similaire sous Linux, je pense qu'il faut faire la séquence socket() / bind() / accept() sur un socket ne gérant que le v4, puis après refaire la même chose avec du v6. La 2ème socket ne pourrait pas "binder" sur les adresses v4 comme c'est le cas habituellement vu que la 1ère socket a déjà pris la main. C'est ce que doit faire Exim je pense.
Pour ce que sort netstat, à mon avis il va lire ce qu'il y a dans /proc/net (fichiers tcp, tcp6, etc) et c'est tout. Je dirais qu'a priori, si tu as une socket "de type v6" sous Linux, elle est capable de recevoir en v4 et en v6, sauf si il y a eu une socket v4-only de créée explicitement avant.
[^] # Re: C'est "normal"...
Posté par galactikboulay . En réponse au message netstat et IPv6. Évalué à 2.
Au niveau réseau, quand le kernel aurait à envoyer des paquets TCP, il construirait au niveau 3 des paquets IPv4 si l'adresse IPv6 correspond à une adresse IPv4 mappée, sinon des paquets IPv6.
Je spécule sur le fonctionnement du noyau mais ça doit être plus ou moins ça. Je regarderai les détails si ça t'intéresse.
Sur les systèmes *BSD, il semble que les sockets gèrent soit v4 soit v6 mais pas les 2 en même temps. Exemple sur mon FreeBSD 5.3:
tcp4 0 0 *.22 *.* LISTEN
tcp6 0 0 *.22 *.* LISTEN
Pour avoir un comportement similaire sous Linux, je pense qu'il faut faire la séquence socket() / bind() / accept() sur un socket ne gérant que le v4, puis après refaire la même chose avec du v6. La 2ème socket ne pourrait pas "binder" sur les adresses v4 comme c'est le cas habituellement vu que la 1ère socket a déjà pris la main. C'est ce que doit faire Exim je pense.
Pour ce que sort netstat, à mon avis il va lire ce qu'il y a dans /proc/net (fichiers tcp, tcp6, etc) et c'est tout. Je dirais qu'a priori, si tu as une socket "de type v6" sous Linux, elle est capable de recevoir en v4 et en v6, sauf si il y a eu une socket v4-only de créée explicitement avant.