# Internet Protocol versie 6

Internet Protocol versie 6 of IPv6 is versie 6 van het internetprotocol voor het gebruik van IP-adressen. Het is de opvolger van Internet Protocol versie 4 en is de tweede versie van het internetprotocol die in gebruik is genomen. De tussenliggende versie IPv5 was een experimentele aanvulling op IPv4, maar deze werd nooit geïmplementeerd.
Toen internet in het begin van de jaren negentig populair werd, was het al snel duidelijk dat IPv4 met de maximaal beschikbare ca. 4,3 miljard adressen niet op de toekomst berekend was. IPv6 zou dit dreigende tekort met 128-bit-adressen oplossen. IPv6 werd in december 1998 als Draft Standard, als standaardontwerp geaccepteerd. Een aantal grote bedrijven, zoals Microsoft en Google, bood op 8 juni 2011, de wereldtestdag voor IPv6, de websites voor één dag aan over zowel IPv4 als IPv6 om zo de impact hiervan te testen. Verschillende internetserviceproviders en ondernemingen activeerden op 6 juni 2012 een permanent IPv6. Het werd op 14 juli 2017 een internetstandaard.

## Verbeteringen

IPv6 is onder andere ontwikkeld om de beperkingen en tekortkomingen van IPv4 te verhelpen. Met name het tekort aan beschikbare IP-adressen levert een enorm probleem op: binnen de systematiek van IPv4 zijn ongeveer 4 miljard adressen beschikbaar en op 3 februari 2011 heeft de Internet Assigned Numbers Authority de laatste IPv4-adresblokken toegewezen.
IPv4-adressen bestaan uit 32 bits, terwijl IPv6-adressen uit 128 bits bestaan. Daardoor telt IPv4 ongeveer 4 × 10$^9$ (4.294.967.296) adressen, terwijl er onder IPv6 ongeveer 3,4 × 10$^{38}$ (340.282.366.920.938.000.000.000.000.000.000.000.000) kunnen worden toegewezen. Het nieuwe IPv6 heeft dus een bijna onuitputtelijke voorraad adressen: voor elke aardbewoner zijn er ongeveer 50 quadriljard beschikbaar.
Naast een groot adresbereik kent IPv6 nog een aantal verbeteringen:
* Betere routing en netwerk-autoconfiguratie.
* Overbodig maken van NAT.
* Gegevensbeveiliging op IP-niveau.
* Ondersteuning van mobiele nodes.

## IPv6-adressering

Het belangrijkste verschil tussen IPv4 en IPv6 is de lengte van het netwerkadres. Een IPv6-adres, zoals gedefinieerd in RFC 2373, RFC 2374 en RFC 2460, is 128 bits lang. Dit komt overeen met 32 hexadecimale cijfers, die in een IPv6-adres worden gebruikt, zoals beschreven in de volgende sectie.
Het aantal mogelijke adressen is 2$^{128}$ ≈ 3,4 × 10$^{38}$. Het aantal IPv6-adressen kan ook worden berekend als 16$^{32}$, omdat elk van de 32 hexadecimale cijfers 16 mogelijke waarden kent.
Soms bestaat een IPv6-adres uit twee logische delen: een netwerkprefix van 64 bits en een "host-addressing"-deel van 64 bits, dat vaak automatisch van de interface ofwel het MAC-adres wordt afgeleid.

### Notatie van IPv6-adressen

IPv6-adressen zijn 128 bits lang en worden normaal geschreven als 8 groepen van 4 hexadecimale cijfers, gescheiden door dubbele punten:
    2001:0db8:85a3:0000:1319:8a2e:0370:7344
is een geldig IPv6-adres.
Er zijn enkele mogelijkheden om de notatie te verkorten:
In elke groep van vier cijfers kunnen de voorloopnullen worden weggelaten. Het is zelfs mogelijk dat een groep van vier nullen wordt weggelaten. Bijvoorbeeld:
    2001:0db8:85a3:0000:1319:8a2e:0370:7344
kan ook worden geschreven als
    2001:db8:85a3::1319:8a2e:370:7344
Staan er meerdere dubbele punten achter elkaar, dan mogen ze tot twee dubbele punten gereduceerd worden. Dit mag echter niet meer dan een keer binnen een IPv6-adres. Bijvoorbeeld: de notatie
    2001:0db8:0000:0000:0000:0000:1428:57ab
kan door voorloopnullen weg te laten worden gereduceerd tot
    2001:db8:::::1428:57ab
en dit wordt verkort tot
    2001:db8::1428:57ab
duiden alle hetzelfde IPv6-adres aan.
Een volledig IPv6-adres bestaat uit acht groepen van vier cijfers. In het bovenstaande voorbeeld zijn er maar vier groepen, er ontbreken vier groepen, en de twee dubbele punten staan voor vier groepen van nullen. Voor :: moet dus :0000:0000:0000:0000: worden ingevuld om het IPv6-adres weer compleet te maken.
Daarentegen, de notatie
    2001::db8::cade
is niet toegelaten, omdat bij deze notatie meerdere mogelijkheden zouden bestaan voor de posities van de "0000".
De laatste 32 bits mogen, zoals gebruikelijk bij IPv4, decimaal geschreven worden als vier groepen van acht bits. In dit geval gebruikt men een punt als scheidingsteken; derhalve
    ::ffff:192.168.89.9 is gelijk aan
    ::ffff:c0a8:5909, maar is niet gelijk aan
    ::192.168.89.9 of
    ::c0a8:5909
Het ::ffff:1.2.3.4-formaat wordt een IPv4-mapped address genoemd en het gebruik hiervan is bedoeld om IPv4 en IPv6 samen te gebruiken op één systeem. Het ::1.2.3.4 formaat is een IPv4-compatible address en het gebruik hiervan wordt ontraden in RFC 4291.
IPv4-adressen worden eenvoudig naar het IPv6-formaat geconverteerd. Het IPv4-adres 135.75.43.52 wordt dan 0000:0000:0000:0000:0000:FFFF:874B:2B34 of ::FFFF:874B:2B34. Ook kan de hybride notatie gebruikt worden (IPv4-mapped addresses), waarmee het ::ffff:135.75.43.52 wordt.

## IPv6-pakket

Een IPv6-pakket bestaat uit twee delen: de header en de payload.
IPv6 kent verschillende headers, een vaste header en een aantal optionele headers. Bij het ontwerp van IPv6 is gekozen voor een kleine, efficiënte vaste header die, naar behoefte, uitgebreid kan worden met optionele headers.
De vaste header bestaat uit de eerste 40 bytes van het pakket, met zowel het afkomstadres als het doeladres van het pakket (elk 128 bits), de IP-versie (4 bits), verkeersklasse (8 bits, Packet Priority), flow label (20 bits, QoS-management), grootte van de lading (16 bits), next header (die aangeeft wat de volgende header zal zijn) en de hoplimiet (8 bits, time to live). Hierna volgt de lading, die minimaal 1280 bytes groot moet zijn of 1500 bytes in een omgeving met een flexibele MTU-grootte. De lading kan tot 65.535 bytes groot zijn als de "jumbo payload"-optie ondersteund wordt.
Optionele headers zijn:
* Hop-by-Hop Options header
* Routing header
* Fragment header
* Destination Options header
* Authentication header
* Encrypted Security Payload header

## Verschillen met IPv4

De wijze waarop het protocol werkt, verschilt op het eerste gezicht misschien niet veel met het IPv4-protocol. Onder de motorkap zijn er echter aanzienlijke verschillen. Zo leunt IPv6 sterk op het uitgebreide ICMPv6-protocol zoals beschreven in RFC 4443. Onderdeel daarvan is bijvoorbeeld hoe laag 2 (MAC)-adressen worden geleerd. Zo is het address resolution protocol overbodig geworden en gebruikt IPv6 het Neighbor Discovery Protocol voor dit doeleinde. Een ander onderdeel van ICMPv6 is bijvoorbeeld SLAAC (StateLess Address AutoConfiguration), wat mogelijk maakt automatisch IPv6-adressen toe te kennen zonder dat daar een Dynamic Host Configuration Protocol-server aan te pas komt.
Een IPv6-subnet bevat tevens niet langer een netwerkadres en een broadcastadres: het eerste adres in een IPv6-subnet is het router-anycast-adres, waar dat het netwerkadres is in IPv4, terwijl broadcast in IPv6 geïmplementeerd wordt als een speciaal geval van multicast, waarbij het adres ff02::1 overeenkomt met het subnet-specifieke broadcastadres in IPv4.

## Routering en toekenning van IPv6-netwerken

Zoals reeds aangegeven, is IPv6 een IP-adres van 128 bits. Een volledig adres wordt ook wel aangeduid als een /128-adres.

### Adressen op een lokaal netwerksegment

Een LAN heeft een /64-adres; de eerste 64 bits van het netwerkadres zijn dus gelijk voor alle nodes in het lokale netwerk. De laatste 64 bits maken iedere node op het lokale netwerk uniek. Hierdoor is het uitdelen van IP-nummers overbodig; als gebruikgemaakt wordt van autoconfiguratie worden de laatste 64 bits automatisch zelf gekozen door de op het netwerk aangesloten systemen. Oorspronkelijk werden deze bits gekozen op basis van het MAC-adres van de netwerkkaart. Dit heeft echter het nadeel dat de laatste 64 bits van het adres altijd gelijk zijn, ongeacht op welk netwerk het apparaat is aangesloten. Een apparaat dat vanaf meerdere netwerken dezelfde websites bezoekt kan zo getraceerd worden, zelfs wanneer de gebruiker privacy-beschermende maatregelen heeft getroffen zoals het uitschakelen van cookies. Daarom worden er tegenwoordig meestal privacy-uitbreidingen gebruikt die de laatste 64 bits regelmatig laten veranderen. Netwerkbeheerders die dat onwenselijk vinden kunnen autoconfiguratie uitschakelen en de adressen handmatig of middels bijvoorbeeld DHCPv6 uitdelen.
Voorbeeld van hoe een lokaal adres wordt aangemaakt op basis van het MAC-adres:
* Het MAC-adres is bijvoorbeeld 00-12-34-56-78-90.
* Dit wordt in 2 stukken verdeeld: 00-12-34 en 56-78-90.
* Daartussen wordt FFFE geplaatst: 0012-34FF-FE56-7890.
* De universal/local bit wordt aangepast. Die bit bevindt zich op de voorlaatste plaats van het eerste octet.
* In dit voorbeeld wordt 00 veranderd in 02, want 0000 0000 wordt 0000 0010.
* De host-ID ziet er dan als volgt uit: 0212:34FF:FE56:7890.
* Dit wordt samengevoegd met de prefix, wat dan FE80::0212:34FF:FE56:7890 vormt.
De prefix _fe80_ duidt altijd op een adres in het lokale segment; het adres FE80::1319:8a2e:0370:7344/128 duidt dus per definitie op een node in het lokale segment. Elk LAN maakt gebruik van deze prefix, zelfs als er niets geconfigureerd is. Daarnaast kunnen er mogelijk andere prefixen gebruikt worden welke door de op het LAN aangesloten routers geadverteerd worden.
Een netwerkinterface kan bij IPv6 meerdere adressen hebben. Het is heel gebruikelijk dat een aangesloten systeem een _fe80_ adres heeft en voor elke door de routers geadverteerde prefix een adres gebaseerd op het MAC-adres en mogelijk één of meerdere adressen volgens de privacy-uitbreidingen.

### Adressen binnen een netwerk

Een campus- of bedrijfsnetwerk heeft een /48-adres. Alle nodes binnen dit netwerk delen dus dezelfde eerste 48 bits. De bits 49 tot en met 64 worden gebruikt om het segment binnen het bedrijfsnetwerk aan te geven.
De prefix _fc80_ duidt altijd op een adres binnen het eigen netwerk. Op deze wijze kan een node binnen het netwerk geadresseerd worden.

### Adressering op hoger niveau

Een van de uitgangspunten van het ontwerp van IPv6 is de betere routeerbaarheid. Door de overvloed van IP-nummers is het mogelijk netwerknummerhiërarchie op te zetten.
Op hoog niveau wordt een onderscheid gemaakt tussen netwerknummers voor de verschillende continenten. Binnen de continenten kunnen internet exchanges en internetaanbieders hiërarchische nummerplannen opstellen.
Deze hiërarchie kent twee voordelen:
* Routeringstabellen in routers worden minder complex.
* Applicaties kunnen, aan de hand van het IP-nummer, bepalen welke nodes netwerktechnisch dichterbij staan. Zo kunnen applicaties als BitTorrent distributiealgoritmen ontwikkelen die efficiënter netwerkverkeer opleveren doordat bij voorkeur peers worden gekozen die dichter bij elkaar staan.

## Overbodig maken van NAT

NAT is ontwikkeld als techniek om het adresprobleem op internet te omzeilen; NAT maakt het mogelijk meerdere nodes samen één IPv4-adres te laten delen.
NAT op IPv4 kent verschillende situaties:
* In het client-servermodel, bijvoorbeeld waar een computer verbinding zoekt met een mail- of webserver, biedt NAT geen belemmeringen.
* In een peer-to-peernetwerk, waarbij twee clients een verbinding willen opbouwen, ontstaat er een probleem wanneer beide clients achter een NAT-voorziening zitten. Ze kunnen geen verbinding opbouwen. Er zijn verschillende oplossingen, zoals de portforwarding aanzetten op de NAT-voorziening (zoals bij BitTorrent) of gebruikmaken van een derde, niet ge-NAT-te client die als doorgeefstation dienstdoet, zoals bij Skype. In deze situatie biedt IPv6 een uitkomst doordat NAT niet meer nodig is.
NAT op IPv4 biedt slechts een schijn van veiligheid voor systemen achter het NAT-systeem. De achterliggende systemen kunnen in eerste instantie niet meer rechtstreeks vanaf het internet aangesproken worden. Verschillende methoden laten echter zien dat het gros van de NAT-methoden te omzeilen valt. Deze semiveiligheid kan in een IPv6-situatie worden gesimuleerd door IP-poortnummers op de netwerkrouter van het (campus)netwerk dicht te zetten. Er kan bijvoorbeeld voor worden gekozen om alle VoIP-verkeer rechtstreeks door te laten, terwijl web- en mailverkeer wordt verwezen naar de daarvoor aangewezen servers.

## Gegevensbeveiliging op IP-niveau

IPv6 maakt het mogelijk om gegevens tijdens het transport te voorzien van beveiliging door middel van IPsec. Deze beveiliging kent twee vormen:
* Encryptie of versleuteling van gegevens. Zender en ontvanger kunnen een sleutel afspreken waarmee het gegevenstransport beveiligd wordt. IPv4 kende deze mogelijkheid oorspronkelijk niet, waardoor veel beveiligingsvarianten boven de IP-laag ontwikkeld zijn, bijvoorbeeld VPN, HTTP of SSH. De versleuteling van IPsec maakt beveiliging op bovenliggende niveaus overbodig: ieder gegevenstransport op basis van IPv6 kan immers veilig gebeuren. In de praktijk gebeurt dat echter zelden en worden dezelfde beveiligingsvarianten als bij IPv4 gebruikt.
* Authenticatie van gegevens. Hierbij kan de zender ieder pakket voorzien van een elektronische waarborg. Andere partijen kunnen de gegevens niet ongemerkt wijzigen, noch zich als de oorspronkelijke afzender voordoen. Hierdoor heeft de ontvanger zekerheid over de herkomst van de ontvangen IP-pakketten.
Deze gegevensbeveiliging maakt het onder andere mogelijk "closed user groups" te creëren van computers die alleen onderling contact mogen hebben, terwijl zij toch op willekeurige plekken op het internet aangekoppeld worden.
IPsec is gelijktijdig met IPv6 ontwikkeld. Het is echter toe te passen op zowel IPv4 als IPv6.

## Ondersteuning van mobiele nodes

IPv6 maakt het mogelijk een node (tijdelijk) van een ander IP-adres gebruik te laten maken.
Wanneer een IPv6-node (node A) een andere IP-node (node B) aanroept, die (tijdelijk) een ander IP-adres gebruikt, ontvangt node A een redirect waarbij wordt aangegeven wat het actuele IP-adres van node B is. Hierna kan het verkeer tussen A en B plaatsvinden.
Om het redirectmechanisme van B goed te laten verlopen, is het natuurlijk essentieel dat er nog wel een node is die reageert op het oorspronkelijke IP-adres van B. Hiervoor is het mogelijk om het IP-adres van B te laten termineren op een homenode (node H). Tijdens het opstarten van het systeem geeft B door aan H wat het actuele IP-adres is. Wordt een verbinding van A naar B aangevraagd, dan komt deze uit op H. H geeft een redirect aan A, waarna de daadwerkelijke verbinding opgezet kan worden.
Het IP-adres van B (zoals dit uitkomt op H) kan uiteraard gewoon in DNS opgenomen worden.
Samen met de faciliteiten voor gegevensbeveiliging biedt deze faciliteit de mogelijkheid voor het opbouwen van volkomen virtuele netwerken. Alleen het homing device (node H) vereist nog een vaste plek.

## IPv6-gebaseerde protocollen

Thread is een IPv6-gebaseerd protocol dat o.a. bedoeld is voor IoT-toepassingen thuis.

## Websites

* Internet Protocol Version 6 Address Space
* Internet.nl, een testpagina voor o.a. IPv6, gemaakt door organisaties binnen de Nederlandse internetgemeenschap
* The KAME project. testsite die laat zien dat IPv4 of IPv6 is opgevraagd
* RFC2460 - Internet Protocol, Version 6 (IPv6) Specification
* IPv6 Address Types
* LE Hughes. The Second Internet: Reinventing Computer Networking with IPv6, oktober 2010.
* ↑ Stichting IPv6 Nederland. Wereld IPv6 Dag op 8 juni 2011.
* ↑ (en) World IPv6 Launch. Gearchiveerd op 2 augustus 2023.
* ↑ (en) A Siddiqui voor de Internet Society. RFC 8200 – IPv6 has been standardized, 17 juli 2017. Gearchiveerd op 9 juni 2023.
* ↑ Minder dan 1 per bewoner van de aarde, de wereldbevolking telt ruim 7 miljard mensen.
* ↑ J Schellevis voor tweakers.net ipv4-blocks zijn toegewezen, 3 februari 2011.
* ↑ RFC 2373
* ↑ RFC 2374
* ↑ RFC 2460
* ↑ RFC 4291: IP Version 6 Addressing Architecture
* ↑ RFC 4443
* 1 2 RFC 4941: Privacy Extensions for Stateless Address Autoconfiguration in IPv6
* ↑ RFC 3315: Dynamic Host Configuration Protocol for IPv6 (DHCPv6)
* ↑ (en) S Kamkar op Applied hacking. pwnat. NAT to NAT client-server communication, beschrijving van de pwnat tool