ausreichend, das alles (Computer, Handy, MP3-Player, Kafeemaschine...) eine
weltweit eindeutige Adresse bekommt
kein NAT mehr nötig
keine Workarounds mehr für P2P, VoIP,.. mehr nötig
Wo muss es unterstützt werden
Wo muss es unterstützt werden
OSI Layer >=3
Routing Protokolle
DNS
Betriebssystem Kernel und Tools
Socket API
Protokolle wie FTP, SIP, H.323...
Firewalls, Router, Telefone...
Anwendungen (Browser, Webserver, MUA, MTA...)
...
Inkompatibilitäten zu IPv4
binäre Darstellung 128-bit statt 32-bit
andere Textdarstellung der Adressen
verschiedene Textdarstellungen für gleiche Adresse
(verkürzte Darstellungen, z.B. 0:0:0:0:0:0:0:1 gleich ::1)
einiges komplexer aber auch konsistenter:
vieles, was Add-On zu IPv4 war ist jetzt im Protokoll integriert (Autokonfiguration,
Unicast, Multicast, IPSec...)
Link steht nicht gleich nach ifconfig zur Verfügung (Kollisionskontrolle)
...
Migration von IPv4 zu IPv6
Parallelbetrieb IPv4/IPv6
wohin verbindet man, wenn Hostname als IPv4 (A) und auch IPv6 (AAAA) auflöst
IPv6 im Tunnel geht andere Routen als IPv4
Host evtl. über IPv4 aber nicht über IPv6 erreichbar
DNS im Mischbetrieb
manche DNS Server antworten auf AAAA Anfragen NXDOMAIN wenn es keine IPv6,
aber IPv4 Adressen gibt:
aktiv geplegt, stabil, aber immermal auch kleinere Bugfixes
SSL und IPv6
ich bin Maintainer von IO::Socket::SSL
bisher: entweder von IO::Socket::INET oder von IO::Socket::INET6 abgeleitet
use IO::Socket::SSL
use IO::Socket::SSL 'inet6'
Sowas führt zu Problemen, da die Entscheidung bzgl IPv6 dann vom aufrufenden
Programm/Modul getroffen werden muss:
"Perl considered harmful"
seit v1.17 (10/08): wenn IO::Socket::INET6 wird es per Default genutzt
evtl. Probleme, wenn AAAA Record geliefert, aber keine IPv6 Verbindung möglich
Net::DNS
kann mit AAAA Records umgehen
kann auch IPv6 Resolver ansprechen
funktioniert i.A. ohne Probleme
kleinere Bugs durch nicht eindeutige Textdarstellung von IPv6 beim Erstellen
und Verarbeiten eigener Net::DNS::Packet's
Net::SMTP, Net::POP3,...
direkt von IO::Socket::INET abgeleitet
funktionieren also nicht mit IPv6
mögliche Lösung: @ISA hinterrücks anpassen:
@Net::SMTP::ISA =
qw(Net::Cmd IO::Socket::INET6)
Alternative: INET.pm auf INET6.pm patchen
use Net::INET6Glue::INET_is_INET6
Net::INET6Glue::INET_is_INET6
macht IO::Socket::INET == IO::Socket::INET6
durch Kopie der Symboltabelle
Module, die direkt IO::Socket::INET Objekte erstellen (LWP) oder davon
abgeleitet sind (Net::SMTP) werden damit IPv6 fähig...
...sofern sie nicht versuchen die (IPv4-)Adressen zu interpretieren
oder tief in die Innereien von IO::Socket::INET einzugreifen
LWP
benutzt für http direkt IO::Socket::INET
mit Net::INET6Glue::INET_is_INET6 kann es auch IPv6
use Net::INET6Glue::INET_is_INET6;
use LWP::Simple;
print get( 'ipv6.google.com' ); # IPv6
print get( 'www.google.com' ); # IPv4
für https wird vielleicht IO::Socket::SSL genutzt, dort wird IPv6
unterstützt.
Force IO::Socket::SSL:
use Net::SSLGlue::LWP
ftp via Net::FTP (siehe später)
Net::FTP
ist ebenfalls von IO::Socket::INET abgeleitet
Net::INET6Glue::INET_is_INET6 kümmert sich nur um Kontrollverbindung und
Datenverbindung
IP:Port der Datenverbindung werden bei IPv6 mittels EPTR und EPSV statt
PORT und PASV ausgehandelt
diese Kommandos werden von Net::FTP nicht unterstützt
Net::INET6Glue::FTP
lädt Net::INET6Glue::INET_is_INET6
fügt EPRT und EPSV Kommandos zu Net::FTP hinzu
patched pasv() und port() sodaß bei IPv6 Verbindungen EPSV und EPRT genutzt
werden
patched _dataconn(), sodaß die von EPSV gewonnenen Infos genutzt werden
und damit geht es dann
use Net::INET6Glue::FTP;
my $ftp = Net::FTP->new( '[::1]:1121' );
fragiles Vorgehen, daher fest verdrahtet auf bestimmte Version von Net::FTP
Arbeiten mit der Textdarstellung
Gültigkeit
bei IPv4 kam man noch mit einer Regex für den Syntaxcheck davon, bei IPv6
nicht mehr.
$valid_ip6 = eval { Socket6::inet_pton(...) }
Vergleich
Stringvergleich reicht nicht, da IPv6 auch eine verkürzte
Representation zuläßt.
$equal = inet_pton($a) eq inet_pton($b)
IP:Port
IPv6 enthält Doppelpunkte, d.h das einfache split()
am Doppelpunkt funktioniert nicht mehr. Stattdessen muss man komplexere
Syntax unterstützen:
ip4
ip4:port
ip6
[ip6]:port
nicht trivial, siehe IO::Socket::INET6::_sock_info
kein Modul bekannt, was einem diese Aufgabe abnimmt
Module für Textdarstellung
NetAddr::IP bietet viele Funktionen zur Arbeit mit IPv4 und IPv6 Adressen
Vergleich incl. Netzmaske
Rechnen mit Adressen
Umwandlung zwischen Text und Binärdarstellung
liefert Broadcast Adresse, Netzwerkmaske
...
arbeitet mit Operator overloading :(
Net::IP auch, aber scheint nicht mehr gepflegt zu werden (letzte Version 2006)
weniger Funktionalität als NetAddr::IP
weitere Module
AnyEvent::Socket
scheint mit IPv6 im Hinterkopf entwickelt zu sein und behandelt es transparent
aber mit welchem Aufwand: kein Socket6 und viel Aufwand um packing für sockaddr_in
und Konstante AF_INET6 für jedes Betriebssystem zu ermitteln
POE
scheint ebenfalls IPv6 zu supporten. Viel nahezu gleicher Code für IPv4 und
IPv6 um Unterschiede im Interface (inet_aton vs. inet_pton, gethostbyname vs.
getaddrinfo etc) zu umgehen