Kompresja i rozwijanie IPv6

Skróć adres IPv6 do jego jedynej kanonicznej postaci albo rozwiń go do wszystkich 32 cyfr i zobacz, które zera znikają, dlaczego jeden ciąg zamienił się w podwójny dwukropek :: i którą regułę RFC 5952 złamał twój zapis. Działa też z listami.

Kanoniczny zapis według RFC 5952 · parsowanie według RFC 4291, z końcówkami IPv4 włącznie · działa w twojej przeglądarce

Rozpoznany zapis IPv6

8 grup i to, co usuwa skracanieZnaki: 39 → 17 · 22 znaki mniej
zostajezero wiodące, usunięteciąg, który staje się ::inne zera, zostają
Przykłady

Jeden adres albo lista, po jednym w wierszu (do 100). Konwersja odbywa się w twojej przeglądarce; nic nie jest wysyłane.

Zastosowano 3 regułyRFC 5952

2001:db8::1:0:0:1

Dwa ciągi po 2 grupy zerowe: pierwszy zamieniono na ::

RFC 5952, reguła po regule

Usunięte zera wiodące§4.1Poprawiona0DB8 → db8, 0001 → 1, 0000 → 0, 0000 → 0
:: jak najdłuższe§4.2.1Poprawiona0000:0000 rozpisane → ::
Bez :: dla jednej grupy§4.2.2Spełniona
Najdłuższy ciąg, przy remisie pierwszy§4.2.3SpełnionaDwa ciągi po 2 grupy zerowe: pierwszy zamieniono na ::
Małe litery§4.3Poprawiona0DB8 → db8
Skrócony (RFC 5952)
Rozwinięty (pełny)
W adresie URL
Jako liczba
Dziesiętny · hex · binarny
Nazwa zwrotna DNS

Jak skrócić adres IPv6?

Zamień litery na małe, usuń zera wiodące w każdej grupie, a potem zastąp przez :: najdłuższy ciąg co najmniej dwóch grup zerowych, a przy dwóch równie długich ciągach pierwszy z nich.

Tak powstaje jedyna kanoniczna postać, którą według RFC 5952 ma wypisywać oprogramowanie. Na wejściu programy muszą nadal przyjmować każdy inny poprawny zapis, więc skracanie nigdy nie zmienia adresu, tylko sposób jego zapisu.

2001:0DB8:0000:0000:0000:FF00:0042:8329 skrócony krok po kroku do 2001:db8::ff00:42:8329.
Narzędzie do kompresji IPv6 pokazujące zera usuwane przez RFC 5952 i ciąg, który staje się ::Narzędzie do kompresji IPv6 pokazujące zera usuwane przez RFC 5952 i ciąg, który staje się ::Co wpisanoWielkie litery, zera wiodące i cała reszta: odczytany zostanie każdy poprawny zapis.Usunięte zeraZera wiodące przekreślone, grupa po grupie.Ciąg, który staje się ::Najdłuższy ciąg grup zerowych; przy remisie pierwszy.Ciągi, które zostająPozostałe ciągi zer zachowują swoje zera, z podanym powodem.Reguła po reguleIle reguł RFC 5952 złamał zapis; lista kontrolna pod spodem nazywa każdą i to, co się zmieniło.
Dwa równe ciągi zer: RFC 5952 skraca pierwszy, a lista kontrolna nazywa każdą regułę, którą złamał zapis.

Jakie są zasady kompresji IPv6?

RFC 5952 ustala pięć reguł: usuń zera wiodące, rób :: jak najdłuższe, nigdy nie używaj :: dla pojedynczej grupy zerowej, skracaj najdłuższy ciąg (przy remisie pierwszy) i pisz litery szesnastkowe małymi literami.

Szóste zalecenie dotyczy adresów niosących IPv4: po prefiksie takim jak ::ffff: zapisuj ostatnie 32 bity jako adres IPv4 z kropkami. Narzędzie sprawdza każdą regułę na wpisanym tekście i nazywa te, które poprawiło.

1Usunięte zera wiodące§4.1

Dobrze: 2001:db8::1

Źle: 2001:0db8::0001

2:: jak najdłuższe§4.2.1

Dobrze: 2001:db8::2:1

Źle: 2001:db8:0:0:0:0:2:1

3Bez :: dla jednej grupy§4.2.2

Dobrze: 2001:db8:0:1:1:1:1:1

Źle: 2001:db8::1:1:1:1:1

4Najdłuższy ciąg, przy remisie pierwszy§4.2.3

Dobrze: 2001:db8::1:0:0:1

Źle: 2001:db8:0:0:1::1

5Małe litery§4.3

Dobrze: 2001:db8::a

Źle: 2001:DB8::A

+Końcówka IPv4 z kropkami§5

Dobrze: ::ffff:192.0.2.1

Źle: 0:0:0:0:0:ffff:192.0.2.1

Każda reguła z poprawnymi i błędnymi przykładami wziętymi z samego RFC 5952.

Jak rozwinąć adres IPv6?

Policz zapisane grupy, niech :: zastąpi tyle grup zerowych, ile brakuje do ośmiu, i dopełnij każdą grupę do czterech cyfr: 2001:db8::1 ma trzy grupy, więc :: to pięć.

Postaci rozwiniętej używa odwrotny DNS, półbajt po półbajcie, i potrzebuje jej wiele logów i arkuszy, by sortować adresy jako tekst. Python nazywa ją .exploded, a Go StringExpanded.

2001:db8::1 rozwinięty: 3 zapisane grupy, 5 grup zerowych za ::, każda grupa dopełniona.

Na ile sposobów można zapisać jeden adres IPv6?

Na wiele: zera wiodące, wielkość liter i miejsce :: mogą się zmieniać, więc jeden adres ma wiele poprawnych zapisów, a RFC 5952 wymienia osiem dla 2001:db8:0:0:1:0:0:1, zanim ustali jedną postać kanoniczną.

Dlatego porównywanie adresów jako tekstu zawodzi: dwa zapisy tego samego adresu do siebie nie pasują. Porównuj je jako liczby 128-bitowe albo najpierw skróć oba.

2001:db8:0:0:1:0:0:12001:0db8:0:0:1:0:0:12001:db8::1:0:0:12001:db8::0:1:0:0:12001:0db8::1:0:0:12001:db8:0:0:1::12001:db8:0000:0:1::12001:DB8:0:0:1::1
2001:db8::1:0:0:1kanoniczny · RFC 5952
Osiem zapisów z RFC 5952, jeden adres.

Jak zapisać adres IPv6 w adresie URL, z portem lub strefą?

Umieść adres w nawiasach kwadratowych, http://[2001:db8::1]:8443/, aby portu nie wzięto za grupę; strefy takiej jak %eth0 w ogóle nie da się umieścić w adresie URL przeglądarki.

RFC 5952 każe ująć w nawiasy adres z portem, a zapis 2001:db8::1:8443 nazywa niezalecanym. Do niczego innego nawiasy w adresie URL nie służą. Przeglądarki wypisują adres szesnastkowo nawet po ::ffff:, więc [::ffff:192.0.2.1] pojawia się jako [::ffff:c000:201].

Strefy wskazują interfejs na jednym komputerze, jak w fe80::1%eth0. RFC 9844 w 2025 roku z powrotem usunął je z adresów URL, a przeglądarki je odrzucają, choć programy powinny nadal pozwalać je wpisać.

http://schemat[2001:db8::1]IPv6 w nawiasach:8443port/statusścieżka

Strefa (%eth0) · fe80::1%eth0

Wpisana w pole programudozwolona
W adresie URL przeglądarkiodrzucana
inet_pton()nie umie jej odczytać
Adresy globalnenigdy jej nie mają
Adres URL z adresem IPv6 rozłożony na części i miejsca, w których może stać strefa.

Jak skrócić lub rozwinąć IPv6 w kodzie?

Sparsuj adres i wypisz go: .compressed w Pythonie, netip.Addr.String() w Go i INET6_NTOA(INET6_ATON(…)) w MySQL dają kanoniczny tekst, a .exploded i StringExpanded() pełną postać.

W Pythonie str() też daje postać skróconą, a Python akceptuje przyrostek %zone. MySQL wypisuje małe litery, najwyżej 39 znaków, tak samo na każdej platformie.

› import ipaddress
a = ipaddress.ip_address('2001:0DB8::0001')
a.compressed, a.exploded
('2001:db8::1', '2001:0db8:0000:0000:0000:0000:0000:0001')

Python ipaddress

› a := netip.MustParseAddr("2001:0DB8::0001")
fmt.Println(a.String(), a.StringExpanded())
2001:db8::1 2001:0db8:0000:0000:0000:0000:0000:0001

Go net/netip

› SELECT INET6_NTOA(INET6_ATON('2001:0DB8::0001'));
2001:db8::1

MySQL 8.4

Kanoniczna krótka forma i pełna forma z Pythona, Go i MySQL.

Najczęściej zadawane pytania

Jaka jest skrócona postać 2001:0db8:0000:0000:0000:ff00:0042:8329?

To 2001:db8::ff00:42:8329. Zamień litery na małe, usuń zera wiodące w każdej grupie (0db8 staje się db8, 0042 staje się 42), a potem zastąp ciąg trzech grup zerowych przez ::. Wynik ma 22 znaki zamiast 39 i jest jedyną postacią, którą RFC 5952 nazywa kanoniczną. Ponowne rozwinięcie daje dokładnie te same 32 cyfry szesnastkowe.

Ile razy podwójny dwukropek (::) może wystąpić w adresie IPv6?

Tylko raz. :: zastępuje jedną lub więcej grup zer i może pojawić się w adresie tylko jeden raz; przy dwóch nikt nie wiedziałby, ile grup zerowych zastępuje każdy z nich, więc 2001:db8::1::1 jest nieprawidłowy. Gdy adres ma dwa ciągi zer, skróć dłuższy albo pierwszy, jeśli są równe, a drugi zapisz jako 0:0, jak w 2001:db8::1:0:0:1.

Dlaczego 2001:db8:0:1:1:1:1:1 nie skraca się do 2001:db8::1:1:1:1:1?

Bo RFC 5952 zabrania używania :: dla pojedynczej grupy zerowej. Takie skrócenie oszczędziłoby jeden znak, a adres byłby mniej czytelny, więc postać kanoniczna zostawia samotną grupę jako 0: 2001:db8:0:1:1:1:1:1. Parsery nadal przyjmują 2001:db8::1:1:1:1:1 jako ten sam adres, ale oprogramowanie nigdy nie powinno go tak wypisywać.

Czy adresy IPv6 pisze się wielkimi, czy małymi literami?

Małymi. RFC 5952 wymaga w postaci kanonicznej liter szesnastkowych od a do f zapisanych małymi literami, a przeglądarki i większość bibliotek tak je wypisują. Oprogramowanie musi jednak przyjmować na wejściu wielkie litery, więc 2001:DB8::A i 2001:db8::a to ten sam adres; zmienia się tylko postać wypisywana. Wielkie litery są częste w starszej dokumentacji i w plikach konfiguracyjnych niektórych producentów.

Jak rozwinąć :: w adresie IPv6?

Policz zapisane grupy, a potem niech :: zastąpi tyle grup zerowych, ile brakuje do ośmiu. W 2001:db8::ff00:42:8329 zapisano pięć grup, więc :: to trzy grupy 0000. Dopełnij każdą grupę do czterech cyfr, a otrzymasz 2001:0db8:0000:0000:0000:ff00:0042:8329, czyli postać rozwiniętą, której używa odwrotny DNS i wiele narzędzi do logów.

Ile znaków ma najdłuższy adres IPv6?

39 w pełnej postaci szesnastkowej: osiem grup po cztery cyfry i siedem dwukropków. Postać z końcówką IPv4 może być dłuższa, dlatego rozmiar bufora INET6_ADDRSTRLEN w API gniazd wynosi 46 bajtów, co wystarcza na 0000:0000:0000:0000:0000:ffff:255.255.255.255 i kończący znak NUL. Skrócone adresy są zwykle znacznie krótsze; adres :: ma tylko dwa znaki.

Dlaczego ::ffff:c000:280 zmienia się w ::ffff:192.0.2.128?

Bo RFC 5952 zaleca zapisywanie ostatnich 32 bitów adresu mapowanego z IPv4 jako adresu IPv4 z kropkami, skoro właśnie to oznaczają te bity. Oba zapisy to ten sam adres i oba są poprawnym wejściem. Wyjątkiem są przeglądarki: standard URL zawsze wypisuje postać szesnastkową, więc ten sam adres pojawia się w pasku adresu jako [::ffff:c000:280].

Jak wpisać adres IPv6 z portem w adresie URL?

Umieść adres w nawiasach kwadratowych, a port za nimi: http://[2001:db8::1]:8443/. Bez nawiasów port wyglądałby jak kolejna grupa, dlatego RFC 5952 odradza zapis 2001:db8::1:8443. W adresach URL nawiasy kwadratowe służą wyłącznie do literałów IPv6. Strefy takiej jak %eth0 w ogóle nie da się umieścić w adresie URL przeglądarki; przeglądarki ją odrzucają.

Jak skrócić adres IPv6 w Pythonie?

Sparsuj go modułem ipaddress i odczytaj .compressed dla kanonicznej krótkiej postaci albo .exploded dla wszystkich 32 cyfr: ipaddress.ip_address('2001:0db8::0001').compressed daje '2001:db8::1', a str() zwraca to samo. W Go to samo robią String() i StringExpanded() typu netip.Addr, a INET6_NTOA(INET6_ATON(…)) w MySQL wypisuje kanoniczny tekst małymi literami.

Czy mogę skrócić naraz całą listę adresów IPv6?

Tak. Wklej do 100 adresów, po jednym w wierszu, a narzędzie przełączy się na tabelę ze skróconą i rozwiniętą postacią każdego wiersza oraz regułami RFC 5952, które złamał jego zapis. Wiersze, które nie są adresami, zostają oznaczone, a nie usunięte, więc wiersze wciąż odpowiadają twoim danym. Skopiuj dowolną kolumnę albo pobierz plik CSV; nic nie opuszcza twojej przeglądarki.