Kompresi dan ekspansi IPv6

Persingkat alamat IPv6 ke satu-satunya bentuk kanonisnya atau ekspansi menjadi 32 digit lengkap, lalu lihat nol mana yang dibuang, mengapa satu rangkaian menjadi ::, dan aturan RFC 5952 mana yang dilanggar ketikan Anda. Daftar alamat juga bisa.

Teks kanonis RFC 5952 · parsing RFC 4291, termasuk ekor IPv4 campuran · berjalan di browser Anda

Dibaca sebagai IPv6

8 grup, dan apa yang dibuang oleh kompresiKarakter: 39 → 17 · 22 karakter lebih sedikit
dipertahankannol di depan, dibuangrangkaian yang menjadi ::nol lain, dipertahankan
Coba

Satu alamat, atau daftar dengan satu alamat per baris (hingga 100). Dikonversi di browser Anda; tidak ada yang dikirim.

3 aturan diterapkanRFC 5952

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

Dua rangkaian 2 grup nol: yang pertama menjadi ::

RFC 5952, aturan demi aturan

Nol di depan dibuang§4.1Diperbaiki0DB8 → db8, 0001 → 1, 0000 → 0, 0000 → 0
:: sepanjang mungkin§4.2.1Diperbaiki0000:0000 ditulis lengkap → ::
Tanpa :: untuk satu grup§4.2.2Lolos
Rangkaian terpanjang; yang pertama jika seri§4.2.3LolosDua rangkaian 2 grup nol: yang pertama menjadi ::
Huruf kecil§4.3Diperbaiki0DB8 → db8
Terkompresi (RFC 5952)
Diekspansi (lengkap)
Dalam URL
Sebagai angka
Desimal · hex · biner
Nama reverse DNS

Bagaimana cara mengompresi alamat IPv6?

Ubah ke huruf kecil, buang nol di depan setiap grup, lalu ganti rangkaian terpanjang dari dua grup nol atau lebih dengan ::, atau rangkaian pertama jika ada dua yang sama panjang.

Hasilnya adalah satu-satunya bentuk kanonis yang diminta RFC 5952 untuk dicetak oleh software. Program tetap harus menerima setiap penulisan valid lainnya sebagai input, jadi kompresi tidak pernah mengubah alamatnya, hanya cara penulisannya.

2001:0DB8:0000:0000:0000:FF00:0042:8329 dipersingkat menjadi 2001:db8::ff00:42:8329, langkah demi langkah.
Alat kompresi IPv6 menampilkan nol yang dibuang menurut RFC 5952 dan rangkaian yang menjadi ::Alat kompresi IPv6 menampilkan nol yang dibuang menurut RFC 5952 dan rangkaian yang menjadi ::Yang Anda ketikHuruf besar, nol di depan, dan lain-lain: penulisan valid apa pun bisa dibaca.Nol yang dibuangNol di depan dicoret, grup demi grup.Rangkaian yang menjadi ::Rangkaian grup nol terpanjang; jika seri, yang pertama.Rangkaian yang tetapRangkaian nol lainnya mempertahankan 0-nya, beserta alasannya.Aturan demi aturanBerapa aturan RFC 5952 yang dilanggar ketikan itu; daftar di bawahnya menyebutkan masing-masing dan apa yang berubah.
Dua rangkaian nol yang sama panjang: RFC 5952 mengompresi yang pertama, dan daftar periksa menyebutkan setiap aturan yang dilanggar ketikan itu.

Apa saja aturan kompresi IPv6?

RFC 5952 menetapkan lima aturan: buang nol di depan, buat :: sepanjang mungkin, jangan pernah memakai :: untuk satu grup nol, kompres rangkaian terpanjang (yang pertama jika seri), dan tulis huruf hex dalam huruf kecil.

Rekomendasi keenam berlaku untuk alamat yang membawa IPv4: setelah prefiks seperti ::ffff:, tulis 32 bit terakhir sebagai alamat IPv4 bertitik. Alat ini mencocokkan setiap aturan dengan yang Anda ketik dan menyebutkan aturan yang diperbaikinya.

1Nol di depan dibuang§4.1

Benar: 2001:db8::1

Salah: 2001:0db8::0001

2:: sepanjang mungkin§4.2.1

Benar: 2001:db8::2:1

Salah: 2001:db8:0:0:0:0:2:1

3Tanpa :: untuk satu grup§4.2.2

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

Salah: 2001:db8::1:1:1:1:1

4Rangkaian terpanjang; yang pertama jika seri§4.2.3

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

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

5Huruf kecil§4.3

Benar: 2001:db8::a

Salah: 2001:DB8::A

+Ekor IPv4 bertitik§5

Benar: ::ffff:192.0.2.1

Salah: 0:0:0:0:0:ffff:192.0.2.1

Setiap aturan dengan contoh benar dan salah dari RFC 5952 sendiri.

Bagaimana cara mengekspansi alamat IPv6?

Hitung grup yang tertulis, biarkan :: mewakili grup nol sebanyak yang diperlukan untuk mencapai delapan, dan lengkapi setiap grup menjadi empat digit: 2001:db8::1 punya tiga grup, jadi :: mewakili lima.

Bentuk ekspansi adalah yang dipakai reverse DNS, digit demi digit, dan yang diperlukan banyak log dan spreadsheet untuk mengurutkan sebagai teks. Python menyebutnya .exploded dan Go StringExpanded.

2001:db8::1 diekspansi: 3 grup tertulis, 5 grup nol untuk ::, setiap grup dilengkapi.

Ada berapa cara menulis satu alamat IPv6?

Banyak: nol di depan, huruf besar-kecil, dan posisi :: semuanya bisa berubah, jadi satu alamat punya banyak penulisan yang valid, dan RFC 5952 mencantumkan delapan untuk 2001:db8:0:0:1:0:0:1 sebelum menetapkan satu bentuk kanonis.

Itulah sebabnya membandingkan alamat sebagai teks gagal: dua penulisan dari alamat yang sama tidak cocok. Bandingkan sebagai angka 128 bit, atau kompres keduanya lebih dulu.

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:1kanonis · RFC 5952
Delapan penulisan dari RFC 5952, satu alamat.

Bagaimana menulis alamat IPv6 di URL, dengan port atau zone?

Taruh alamatnya di dalam kurung siku, http://[2001:db8::1]:8443/, agar port tidak dikira grup; zone seperti %eth0 sama sekali tidak bisa dimasukkan ke URL browser.

RFC 5952 meminta alamat yang memakai port diapit kurung siku, dan menyebut 2001:db8::1:8443 tidak disarankan. Kurung siku tidak dipakai untuk hal lain di URL. Browser menampilkan alamat dalam hex bahkan setelah ::ffff:, jadi [::ffff:192.0.2.1] tampil sebagai [::ffff:c000:201].

Zone menunjuk sebuah antarmuka di satu mesin, seperti pada fe80::1%eth0. RFC 9844 mengeluarkannya lagi dari URL pada 2025 dan browser menolaknya, meski program sebaiknya tetap membiarkan Anda mengetikkannya.

http://skema[2001:db8::1]IPv6 dalam kurung siku:8443port/statuspath

Sebuah zone (%eth0) · fe80::1%eth0

Diketik di kolom sebuah programboleh
Di URL browserditolak
inet_pton()tidak bisa membacanya
Alamat globaltidak pernah punya
URL berisi alamat IPv6 yang diurai, dan di mana zone boleh dipakai.

Bagaimana cara mengompresi atau mengekspansi IPv6 dalam kode?

Parse alamatnya lalu cetak: .compressed di Python, netip.Addr.String() di Go, dan INET6_NTOA(INET6_ATON(…)) di MySQL menghasilkan teks kanonis, sedangkan .exploded dan StringExpanded() menghasilkan bentuk lengkap.

str() di Python juga menghasilkan bentuk terkompresi, dan Python menerima akhiran %zone. MySQL mencetak huruf kecil, paling banyak 39 karakter, sama di setiap platform.

› 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

Bentuk singkat kanonis dan bentuk lengkap dari Python, Go, dan MySQL.

Pertanyaan yang sering diajukan

Apa bentuk terkompresi dari 2001:0db8:0000:0000:0000:ff00:0042:8329?

2001:db8::ff00:42:8329. Ubah hurufnya menjadi huruf kecil, buang nol di depan setiap grup (0db8 menjadi db8, 0042 menjadi 42), lalu ganti rangkaian tiga grup nol dengan ::. Hasilnya 22 karakter, bukan 39, dan itulah satu-satunya bentuk yang disebut kanonis oleh RFC 5952. Mengekspansinya lagi menghasilkan 32 digit hex yang persis sama.

Bolehkah :: dipakai dua kali dalam alamat IPv6?

Tidak. :: mewakili satu grup nol atau lebih dan hanya boleh muncul sekali; jika ada dua, tidak ada yang bisa tahu berapa grup nol yang diwakili masing-masing, jadi 2001:db8::1::1 tidak valid. Jika sebuah alamat punya dua rangkaian nol, kompres yang lebih panjang, atau yang pertama jika sama panjang, dan tulis rangkaian lainnya sebagai 0:0, seperti 2001:db8::1:0:0:1.

Mengapa 2001:db8:0:1:1:1:1:1 tidak dikompres menjadi 2001:db8::1:1:1:1:1?

Karena RFC 5952 melarang memakai :: untuk satu grup nol. Pemendekan itu hanya menghemat satu karakter dan membuat alamat lebih sulit dibaca, jadi bentuk kanonisnya mempertahankan grup tunggal itu sebagai 0: 2001:db8:0:1:1:1:1:1. Parser tetap menerima 2001:db8::1:1:1:1:1 sebagai alamat yang sama, tetapi software tidak boleh mencetaknya seperti itu.

Apakah alamat IPv6 ditulis dengan huruf besar atau huruf kecil?

Huruf kecil. RFC 5952 mewajibkan huruf hex a sampai f ditulis kecil dalam bentuk kanonis, dan browser serta sebagian besar library mencetaknya seperti itu. Software tetap harus menerima input huruf besar, jadi 2001:DB8::A dan 2001:db8::a adalah alamat yang sama; hanya bentuk cetaknya yang berubah. Huruf besar umum di dokumentasi lama dan di file konfigurasi beberapa vendor.

Bagaimana cara mengekspansi :: dalam alamat IPv6?

Hitung grup yang tertulis, lalu biarkan :: mewakili grup nol sebanyak yang diperlukan untuk mencapai delapan. Pada 2001:db8::ff00:42:8329 ada lima grup tertulis, jadi :: mewakili tiga grup 0000. Lengkapi setiap grup menjadi empat digit dan hasilnya 2001:0db8:0000:0000:0000:ff00:0042:8329, bentuk ekspansi yang dipakai reverse DNS dan banyak alat log.

Berapa karakter alamat IPv6 terpanjang?

39 untuk bentuk hex lengkap: delapan grup empat digit dan tujuh titik dua. Bentuk dengan ekor IPv4 bertitik bisa lebih panjang, itulah sebabnya ukuran buffer INET6_ADDRSTRLEN pada socket API adalah 46 byte, cukup untuk 0000:0000:0000:0000:0000:ffff:255.255.255.255 dan karakter NUL penutup. Alamat terkompresi biasanya jauh lebih pendek; alamat :: hanya dua karakter.

Mengapa ::ffff:c000:280 menjadi ::ffff:192.0.2.128?

Karena RFC 5952 menyarankan 32 bit terakhir alamat IPv4-mapped ditulis sebagai alamat IPv4 bertitik, sebab itulah arti bit-bit tersebut. Kedua penulisan adalah alamat yang sama dan keduanya input yang valid. Browser adalah pengecualian: URL Standard selalu mencetak bentuk hex, jadi alamat yang sama tampil sebagai [::ffff:c000:280] di address bar.

Bagaimana cara menaruh alamat IPv6 dengan port di URL?

Taruh alamatnya di dalam kurung siku dan port-nya setelahnya: http://[2001:db8::1]:8443/. Tanpa kurung siku, port akan terlihat seperti satu grup lagi, itulah sebabnya RFC 5952 meminta agar tidak menulis 2001:db8::1:8443. Kurung siku hanya dipakai untuk literal IPv6 di URL. Zone seperti %eth0 sama sekali tidak bisa dimasukkan ke URL browser; browser menolaknya.

Bagaimana cara mengompresi alamat IPv6 di Python?

Parse dengan modul ipaddress, lalu baca .compressed untuk bentuk singkat kanonis atau .exploded untuk ke-32 digitnya: ipaddress.ip_address('2001:0db8::0001').compressed menghasilkan '2001:db8::1', dan str() mengembalikan hal yang sama. Di Go, String() dan StringExpanded() milik netip.Addr melakukan tugas yang sama, dan INET6_NTOA(INET6_ATON(…)) di MySQL mencetak teks kanonis huruf kecil.

Bisakah saya mengompresi daftar alamat IPv6 sekaligus?

Bisa. Tempel hingga 100 alamat, satu per baris, dan alat ini beralih ke tabel berisi bentuk terkompresi dan bentuk ekspansi setiap baris serta aturan RFC 5952 yang dilanggar penulisannya. Baris yang bukan alamat ditandai, bukan dibuang, sehingga baris-barisnya tetap sesuai dengan input Anda. Salin salah satu kolom atau unduh CSV; tidak ada yang keluar dari browser Anda.

Ada yang kurang?Usulkan fitur atau alat baru