Gibt es einen Unterschied zwischen IPv4 und IPv6 auf der Socket-Ebene?

8

Ich muss IPv6-Unterstützung zu einer vorhandenen socketbasierten Anwendung hinzufügen, die derzeit nur IPv4 unterstützt. Um das kommende Zeitalter von IPv6 in Angriff zu nehmen, hat mir jemand befohlen, eine IPv6-Schnittstelle für die App hinzuzufügen und die Außenwelt bei der Kommunikation mit der App entweder die IPv4-Schnittstelle oder die IPv6-Schnittstelle wählen zu lassen.

Meine Frage ist: Stimmt es, dass es für die Socket-Handling-API-Ebene unter Linux keinen Unterschied zwischen der Verarbeitung eines IPv4-basierten Sockets und IPv6-basierten Sockets gibt?

Außerdem, ist es möglich, einen Socket zwei IP-Adressen mit demselben Port abhören zu lassen? Wenn das wahr ist, dann ist die Umsetzung der Anforderung eine triviale Arbeit, denke ich.

    
Haiyuan Zhang 01.03.2010, 15:38
quelle

5 Antworten

6

Es ist nicht möglich, 2 verschiedene IP-Adressen mit 1 TCP-Socket abzurufen, wenn Sie jedoch alle Schnittstellen mit dem in6addr_any Adresse, das wird auch alle IPv4-Adressen einschließen (obwohl ich glaube, dass zB linux eine Kernel-Option hat, um diese Zuordnung zu deaktivieren).

Die (neuere Version von) Socket-API ist relativ transparent, ob Sie IPv4 oder IPv6 verwenden, aber es muss sehr sorgfältig darauf geachtet werden, wie eine IPv4-Anwendung normalerweise codiert wird.

z.B. Dieser IPv4-Code akzeptiert eine Verbindung und gibt die Adresse des Remote-Hosts aus:

%Vor%

Müsste in folgendes konvertiert werden, das sowohl IPv4 als auch IPv6 behandelt.

%Vor%

Obwohl ich glaube, Sie könnten es noch eleganter und transparenter mit getaddrinfo ()

Hier finden Sie weitere Hinweise zur IP-Layer-Unabhängigkeit: Ссылка Ссылка

    
nos 01.03.2010, 16:07
quelle
4

Ein Großteil der Socket-Verarbeitung ist für IPv4 und IPv6 identisch. Auf dem Server funktionieren die Aufrufe von listen , accept , recv und send für IPv4- und IPv6-Verbindungen, sobald Sie Ihre Adresse gebunden haben.

Aber alle Funktionen, die mit Adressen wie connect , bind , getsockname , getpeername arbeiten, müssen geändert werden, da Sie sockaddr_in6 verwenden müssen. Außerdem müssen Sie die Funktionen ändern, die mit der Adresse arbeiten (z. B. müssen Aufrufe von inet_addr in inet_pton geändert werden).

Wenn Sie unter Linux an in6addr_any binden, funktionieren sowohl IPv4- als auch IPv6-Verbindungen zu diesem Port (obwohl dies mehr als 2 Adressen hören könnte, da es auch auf die IPv4-Loopback 127.0.0.1 und IPv6 hört Loopback ::1 ). Aber unter Windows war ich nie in der Lage, das zum Laufen zu bringen und muss auf einen Socket für IPv4 und einen anderen Socket für IPv6 warten.

    
R Samuel Klatchko 01.03.2010 16:04
quelle
2

Beej's Guide zur Netzwerkprogrammierung behandelt die Unterschiede in der Codierung für IPv4 und IPv6. Ссылка

Er hat einen Abschnitt eingerichtet, um Ihren bestehenden IPv4-Code für IPv6 zu ändern.

Er erklärt auch, wie man abstrakt auf der Socket-Ebene codiert, so dass man nicht wissen muss, ob es sich um eine IPv4-Adresse oder um eine IPv6 handelt.

    
supershabam 06.03.2010 08:39
quelle
0

Ich glaube, es gibt einen Unterschied, hauptsächlich wie IP-Adressen zugewiesen / angezeigt werden und Subnetzmasken.

Methoden, die die eingehende IPv4-Adresse annehmen, funktionieren nicht und lösen eine Ausnahme aus, wenn ihnen ein reines IPv6 gegeben wird. Daher müssen Ihre Methoden prüfen, welche Art von Verbindung initiiert wurde, abgesehen davon, dass ich das nicht glaube .

    
Michal Ciechan 01.03.2010 15:44
quelle
0

IPv6 ist 128bit Adressraum und bietet mehr Funktionen (zustandslos, Multicast, einfachere Verarbeitung für Router, um nur einen zu nennen Im Vergleich zu IPv4 (also 32bit) ist der Adressraum für IPv4 knapp, aber mit Hilfe von NAT / SNAT kann die Langlebigkeit des IPv4-Protokolls erhöhen. Die Verwendung von IPv6 hängt davon ab, ob das Betriebssystem das neue Protokoll unterstützen kann. Es ist sicherlich auf Windows 7, Linux verfügbar ... Die Hauptsache ist, dass IPv6 abwärtskompatibel zu IPv4 ist ...

Um Ihre Frage zu beantworten, hängt das von der API-Ebene ab, sofern das Betriebssystem den IPv6-Netzwerk-Stack unterstützt. Hier finden Sie ein Beispiel für IPv6-Sockets, wie es auf MSDN , für Linux , Verwendung von Sockets ist meistens gleich, mit der Ausnahme, dass Sie sockaddr_in6 ...

verwenden werden

Hoffe, das hilft, Freundliche Grüße, Tom.

    
t0mm13b 01.03.2010 15:52
quelle

Tags und Links