2014-12-15 11 views
9

Wenn ich die Ausgabe von IPGlobalProperties.GetActiveTcpListeners() untersuchen, sehe ich Hörer auf 0.0.0.0 sowie ::.IPv6: Ist "::" gleich "0.0.0.0", wenn auf Verbindungen gewartet wird?

Ich glaube, dass das Abhören auf einem Port auf 0.0.0.0 entspricht dem Abhören eines Ports auf einem Netzwerkadapter, zumindest mein Speicher der Windows-Socket-API sagt, dass dies so ist.

Es macht auch Sinn für mich, dass :: das äquivalent in IPv6 parlance bedeuten würde, so ein Zuhörer auf [::]:49156 zu Port lauscht 49156 auf alle IPv6-Netzwerkadapter werden würde, wo als [::1]:1434 würde 1434 nur auf dem IPv6-Loopback-Adapter-Port sein.

Ist das korrekt?

Ich nehme an, dass IPv6 listen Endpunkte nur für IPv6-Adapter gelten. Das heißt, wenn ein Adapter nur eine IPv4-Adresse hätte, würden Verbindungen zu diesem Port 49156 nicht von einem Listener unter [::]:49156 empfangen werden?

Auch hat bemerkt jemand, dass der MSDN-Artikel für GetActiveTcpListeners() erklärt falsch, dass die zurückgegebenen Objekte „sind Zuhörer in allen TCP heißen außer den Staat Hören.“?

Antwort

3

Die IPv6-Adresse "::" ist speziell nicht spezifiziert und keine gültige Adresse, noch entspricht sie der IPv4-Adresse "0.0.0.0". Siehe RFC 3513, Internet Protocol Version 6 (IPv6) Addressing Architecture, 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. 
8

Während Ihrer Benennung irreführend ist und insofern falsch, ich glaube, Sie, das Richtige zu sagen, bedeutet: die nicht spezifizierte Adresse 0:0:0:0:0:0:0:0 aka :: bedeutet, dass der jeweilige Anschluss nicht an eine bestimmte Adresse zu hören , aber für alle von ihnen - im Wesentlichen das gleiche, was 0.0.0.0 im IPv4-Fall sagt.

6

Ich glaube, dass auf 0.0.0.0 auf einem Port lauscht auf einem Port zu hören auf jedem Netzwerkadapter, zumindest meinen Speicher der Windows-Socket-API, so entspricht, dass dies so ist.

Das ist richtig. 0.0.0.0 ist als INADDR_ANY definiert und kann zum Abhören aller lokalen IPv4-Adapter verwendet werden.

Es macht auch Sinn für mich, dass :: das äquivalent in IPv6 parlance bedeuten würde, so ein Zuhörer auf :::49156 zu Port lauscht 49156 auf alle IPv6-Netzwerkadapter werden würde, wo als ::1:1434 1434 Port wäre nur auf dem IPv6-Loopback-Adapter .

Aus der Perspektive des Zuhörens, ja. :: ist als INADDR6_ANY definiert und kann zum Abhören aller lokalen IPv6-Adapter verwendet werden. ::1 ist definiert als INADDR6_LOOPBACK.

Ich nehme an, dass IPv6 listen Endpunkte nur für IPv6-Adapter gelten. Das heißt, wenn ein Adapter nur eine IPv4-Adresse hätte, würden Verbindungen zu diesem Port 49156 von einem Listener unter :::49156 nicht empfangen werden?

Das hängt vom Zuhörer ab. Ein Nur-IPv6-Listener kann keinen IPv4-Adapter überwachen und keine IPv4-Clients akzeptieren. Ein dual-stack Hörer, der an INADDR6_ANY gebunden ist, kann jedoch an IPv4- und IPv6-Adapter binden und sowohl IPv4- als auch IPv6-Clients akzeptieren, wobei IPv4-Adressen von accept(), WSAAccept() und getpeername() als IPv4-mapped IPv6 addresses gemeldet werden.

+0

Unter Linux wird dies von der Setsockopt 'IPV6_V6ONLY' gesteuert, siehe die Manpage [ipv6 (7)] (http://linux.die.net/man/7/ipv6). – o11c

+0

Auch unter Windows. Siehe [IPPROTO_IPV6 Socket-Optionen] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738574.aspx). –

Verwandte Themen