Quelle est la différence entre l'IPv4 et l'IPv6 au niveau de la socket?
- Je besoin d'ajouter le support de l'IPv6 à une embase de l'application qui actuellement ne supporte IPv4. Pour embrasser les entrants de l'ère de l'IPv6, quelqu'un m'a ordonné d'ajouter une IPv6 de l'interface de l'application et de laisser le monde extérieur afin de choisir l'interface IPv4 ou IPv6 de l'interface quand on essaie de communiquer avec l'application.
Ma question est: est-il vrai que pour le socket de la manipulation de l'API de niveau en Linux, il n'y a pas de différence entre la manipulation d'une adresse IPv4 à base de socket et IPv6 à base de socket?
De plus, est-il possible de laisser un socket en écoute sur deux adresses IP avec le même port? Si cela est vrai, alors de mettre en œuvre l'exigence est d'un banal travail, je suppose.
OriginalL'auteur Haiyuan Zhang | 2010-03-01
Vous devez vous connecter pour publier un commentaire.
Il n'est pas possible d'écouter sur 2 adresses IP différentes, avec 1 socket TCP, cependant, si vous écouter sur toutes les interfaces à l'aide de la in6addr_any adresse, qui comprendra toutes les adresses IPv4 (bien que je crois par exemple, linux est un noyau option pour désactiver le mappage).
La (nouvelle version) API socket est tout à fait transparente de savoir si vous êtes en utilisant IPv4 ou IPv6, mais assez grand soin doit être pris sur la façon dont une application IPv4 est généralement codé.
par exemple, cette IPv4 code qui accepte une connexion et affiche l'adresse de l'hôte distant:
Devrait être converti à la suivante, qui gère à la fois IPv4 et IPv6
Mais je crois que vous pourriez faire encore plus d'élégance et transparent avec getaddrinfo()
Voici les notes supplémentaires sur la couche IP de l'indépendance:
http://uw714doc.sco.com/en/SDK_netapi/sockC.PortIPv4appIPv6.html
http://www.kame.net/newsletter/19980604/
Non, vous ne pouvez pas lier un socket UDP à plus de 1 (ou tous) les adresses ip. Vous pouvez le faire avec SCTP si, à l'utilisation du multi-homing fonctionnalités. Fot TCP ou UDP, vous devez créer de 1 douille pour chaque adresse que vous souhaitez écouter, à moins que vous souhaitez écouter sur toutes les adresses ip
Pour obtenir la double pile sockets, il y a une prise d'option active ou désactive la double pile comportement de recherche pour IPV6_V6ONLY pour plus d'info. Si vous ne le faites pas, votre programme va mystérieusement échouer sur certains OS es, sur des versions spécifiques.
OriginalL'auteur nos
Beaucoup de la prise, la manipulation est la même pour les deux protocoles IPv4 et IPv6. Sur le serveur, une fois que vous avez lié votre adresse, les appels à
listen
,accept
,recv
etsend
sera la même pour les deux connexions IPv4 et IPv6.Mais toutes les fonctions qui traitent des adresses telles que
connect
,bind
,getsockname
,getpeername
devra être modifiée que vous devez utiliser unesockaddr_in6
. Aussi, vous avez besoin de modifier les fonctions qui fonctionnent avec l'adresse (par exemple, les appels àinet_addr
besoin d'être changé àinet_pton
).Sur Linux, si vous liez à
in6addr_any
, à la fois des connexions IPv4 et IPv6 pour que le port fonctionne (bien que cela puisse écouter plus de 2 adresses, car il permettra également d'écouter sur l'IPv4 bouclage127.0.0.1
IPv6 et de bouclage::1
). Mais sous Windows, je n'ai jamais été en mesure d'obtenir que de travail et de la nécessité pour l'écoute sur une socket pour IPv4 et une autre prise de courant pour IPv6.merci, cette information est très utile.
OriginalL'auteur R Samuel Klatchko
Beej Guide de Programmation du Réseau des adresses les différences de codage pour IPv4 et IPv6. http://beej.us/guide/bgnet/
Il a consacré une section à l'évolution de votre IPv4 existante du code pour gérer l'IPv6.
Il explique aussi comment le code de façon abstraite au niveau de la socket de sorte que vous n'avez pas besoin de savoir si oui ou non vous faites affaire avec une adresse IPv4 ou IPv6.
OriginalL'auteur supershabam
Je crois qu'il existe une différence, surtout la façon dont les adresses IP sont attribuées/affiche et masque de sous-réseau.
Méthodes qui prennent en entrant l'adresse IPv4, ne fonctionnera pas et lève une exception si une IPv6 pur est donné, donc vos méthodes aurez besoin de vérifier quel type de connexion a été ouverte, d'autres que cela, je ne le pense pas.
OriginalL'auteur Michal Ciechan
IPv6 est de 128 bits de l'adresse de l'espace et offre plus de fonctionnalités(apatrides, multicast, plus simple de traitement pour les routeurs, pour n'en nommer que quelques-uns) en comparaison à IPv4 (qui est en 32 bits), l'espace d'adressage IPv4 est en cours d'exécution, mais avec l'aide de NAT/SNAT, il peut augmenter la longévité du Protocole IPv4. À l'aide de IPv6 est subordonné au fait que l'OS peut soutenir le nouveau protocole. Il est certainement disponible sur Windows 7, Linux...La chose principale est que l'IPv6 est rétro-compatible avec IPv4...
Pour répondre à ta question, cela dépend du niveau de l'API fourni le système d'exploitation peut soutenir le réseau IPv6 pile, Voici un exemple de IPv6 exemple que l'on trouve sur MSDN, pour Linux, l'utilisation de sockets est essentiellement le même à l'exception que vous allez utiliser
sockaddr_in6
...Espère que cette aide,
Meilleures salutations,
Tom.
OriginalL'auteur t0mm13b