web-dev-qa-db-fra.com

IPv6: `:: 'est-il équivalent à` 0.0.0.0' lors de l'écoute des connexions?

Lorsque j'examine la sortie de IPGlobalProperties.GetActiveTcpListeners() , je vois des écouteurs sur 0.0.0.0 Ainsi que ::.

Je crois que l'écoute sur un port sur 0.0.0.0 Équivaut à écouter sur un port sur n'importe quelle carte réseau, au moins ma mémoire de l'API socket Windows dit que c'est le cas.

Il est également logique pour moi que :: Signifie l'équivalent dans le langage IPv6, donc un écouteur sur [::]:49156 Écouterait le port 49156 Sur toutes les cartes réseau IPv6 où [::1]:1434 Serait le port 1434 Uniquement sur l'adaptateur de bouclage IPv6.

Est-ce correct?

Je suppose que les points de terminaison d'écoute IPv6 s'appliquent uniquement aux adaptateurs IPv6. Autrement dit, si un adaptateur n'avait qu'une adresse IPv4, les connexions à ce port 49156 Ne seraient pas reçues par un écouteur sur [::]:49156?

En outre, quelqu'un a-t-il remarqué que l'article MSDN pour GetActiveTcpListeners() déclare incorrectement que les objets renvoyés "incluent des écouteurs dans tous les états TCP TCP sauf l'état Listen. "?

15
Xharlie

Je crois que l'écoute sur un port sur 0.0.0.0 Équivaut à écouter sur un port sur n'importe quelle carte réseau, au moins ma mémoire de l'API socket Windows dit que c'est le cas.

C'est exact. 0.0.0.0 Est défini comme INADDR_ANY Et peut être utilisé pour écouter sur tous les adaptateurs IPv4 locaux.

Il est également logique pour moi que :: Signifie l'équivalent dans le langage IPv6, donc un écouteur sur :::49156 Écouterait le port 49156 Sur tous les adaptateurs réseau IPv6 où ::1:1434 Serait le port 1434 uniquement sur l'adaptateur de bouclage IPv6.

Du point de vue de l'écoute, oui. :: Est défini comme INADDR6_ANY Et peut être utilisé pour écouter sur tous les adaptateurs IPv6 locaux. ::1 Est défini comme INADDR6_LOOPBACK.

Je suppose que les points de terminaison d'écoute IPv6 s'appliquent uniquement aux adaptateurs IPv6. Autrement dit, si un adaptateur n'avait qu'une adresse IPv4, les connexions à ce port 49156 Ne seraient pas reçues par un écouteur sur :::49156?

Cela dépend de l'auditeur. Un écouteur IPv6 uniquement ne peut pas écouter sur une carte IPv4 et ne peut pas accepter de clients IPv4. Cependant, un écouteur double pile lié à INADDR6_ANY Peut se lier aux adaptateurs IPv4 et IPv6 et accepter les clients IPv4 et IPv6, où les adresses IPv4 sont signalées par accept() , WSAAccept() et getpeername() comme adresses IPv6 mappées IPv4 .

12
Remy Lebeau

Bien que votre formulation soit trompeuse et jusqu'à présent erronée, je pense que vous voulez dire la bonne chose: l'adresse non spécifiée 0:0:0:0:0:0:0:0 alias. :: signifie que le port respectif n'écoute pas une adresse spécifique, mais toutes - essentiellement les mêmes que 0.0.0.0 dans le cas IPv4 dit.

9
glglgl

L'adresse IPv6 "::" est spécifiquement non spécifiée et n'est pas une adresse valide, ni équivalente à l'adresse IPv4 de "0.0.0.0". Voir RFC 3513, architecture d'adressage du protocole Internet version 6 (IPv6), section 2.5.2 :

2.5.2 The Unspecified Address

The address 0:0:0:0:0:0:0:0 is called the unspecified address.  It
must never be assigned to any node.  It indicates the absence of an
address.  One example of its use is in the Source Address field of
any IPv6 packets sent by an initializing Host before it has learned
its own address.`

The unspecified address must not be used as the destination address
of IPv6 packets or in IPv6 Routing Headers.  An IPv6 packet with a
source address of unspecified must never be forwarded by an IPv6
router.
4
Ron Maupin