- Yayın tarihi
- Okuma süresi
- 7 dk okuma
IPv6 Adresi Nasıl Kısaltılır? RFC 5952 Kuralları
IPv6 adresini RFC 5952 kurallarıyla kısaltın: baştaki sıfırlar, en uzun sıfır dizisi, eşitlikte soldaki, küçük harf; yanlış örnekler ve genişletme.
IPv6 adresinin tek bir önerilen yazımı vardır ve RFC 5952 onu tarif eder: baştaki sıfırları atın, en uzun sıfır dizisini :: ile değiştirin, harfleri küçük yazın. Bu yazıda kuralları sırasıyla, yanlış örnekleriyle ve geri açma yöntemiyle bulacaksınız. Örnek adreslerin hepsi 2001:db8::/32 belgelendirme aralığındandır.
Adres sekiz hextet'ten oluşur
IPv6 adresi 128 bittir. Metin olarak sekiz adet 16 bitlik parçaya bölünür ve her parça en çok dört onaltılık basamak taşır. Bu parçaya topluluk içinde hextet denir. RFC 4291 (yeni sekmede açılır) bunları "16-bit pieces" diye adlandırır; yani hextet resmi bir RFC terimi değildir. Tam yazım 32 basamaktır:
2001:0db8:0000:0000:0000:0000:0000:0001RFC 4291 adresi yazmanın üç geleneksel yolunu tanımlar: her parçanın yazıldığı tam biçim, sıfır sıkıştırmalı :: biçimi ve son 32 bitin ondalık IPv4 gibi yazıldığı karma biçim. RFC 5952 (yeni sekmede açılır) ise üretilen metin için tek bir kanonik biçim önerir. Kural şudur: girişte esnek, çıkışta tutarlı olun. Okuyan uygulama RFC 4291'deki her meşru biçimi kabul etmelidir; yani 2001:0DB8:0:0:0:0:0:1 geçerli bir girdidir. Yazan uygulama ise 2001:db8::1 üretmelidir.
Tek biçim, günlük dosyalarında arama yaparken, adresleri karşılaştırırken ve veritabanında saklarken işinizi kolaylaştırır. Aynı adresin birden çok geçerli yazımı vardır ve her yazım metin olarak ayrı bir kayıt demektir. 2001:db8::1 adresi için altı örnek:
| Yazım | Özellik | Girdi olarak | Çıktı olarak önerilen |
|---|---|---|---|
2001:0db8:0000:0000:0000:0000:0000:0001 | Tam biçim | Geçerli | Hayır |
2001:db8:0:0:0:0:0:1 | Baştaki sıfırlar atılmış | Geçerli | Hayır |
2001:db8::0:1 | :: yanında fazladan 0 | Geçerli | Hayır |
2001:DB8::1 | Büyük harf | Geçerli | Hayır |
2001:db8::0.0.0.1 | Karma biçim | Geçerli | Hayır |
2001:db8::1 | Kanonik biçim | Geçerli | Evet |
Kısaltma kuralları adım adım
Adım 1: baştaki sıfırları atın
Her hextet'in başındaki sıfırlar atılır, ancak her grupta en az bir rakam kalmalıdır. 0db8 olur db8, 0010 olur 10, 0000 olur 0 (RFC 5952 §4.1). Sağdaki sıfırlar atılamaz: 0010 grubunu 1 diye yazarsanız başka bir adres elde edersiniz.
Adım 2: en uzun sıfır dizisini :: ile değiştirin
Ardışık sıfır gruplarını :: ile kısaltırsınız (§4.2.1). :: bir adreste yalnızca bir kez kullanılabilir ve adresin başındaki ya da sonundaki sıfırları da gösterebilir. Kısaltırken arkada fazladan 0 bırakmayın: 2001:db8::0:1 yazılmaz, 2001:db8::1 yazılır.
Adım 3: tek sıfır grubunu kısaltmayın
:: tek bir 16 bitlik sıfır grubunu kısaltmak için kullanılmaz (§4.2.2). 2001:db8:0:1:1:1:1:1 adresinde 0 olduğu gibi kalır. 2001:db8::1:1:1:1:1 yazımı girdi olarak geçerlidir ve okunur, ama üretilen metinde kullanılmaz.
Adım 4: eşitlikte soldaki diziyi seçin
Adreste birden çok sıfır dizisi varsa en uzun olan kısaltılır. Uzunluklar eşitse soldaki seçilir (§4.2.3). Diğer dizi olduğu gibi yazılır.
Adım 5: harfleri küçük yazın
a–f harfleri küçük yazılır (§4.3): 2001:DB8::1 yerine 2001:db8::1. DNS adları harf büyüklüğüne duyarsızdır (RFC 4343 (yeni sekmede açılır)), ama adres metni için kural küçük harftir.
Beş adımın birlikte uygulanması
Girdi : 2001:0DB8:0000:0000:0001:0000:0000:0001
Adım 1 : 2001:DB8:0:0:1:0:0:1
Adım 2-4 : iki sıfır dizisi var, ikisi de iki gruplu; eşitlikte soldaki seçilir
2001:DB8::1:0:0:1
Adım 5 : 2001:db8::1:0:0:1Örnek tablosu
Her satır RFC 5952 kurallarının uygulanmasıyla çıkar. Kendi aracınızın ya da betiğinizin sonucunu bu satırlarla karşılaştırabilirsiniz.
| Girdi | Kanonik çıktı | Uygulanan kural |
|---|---|---|
2001:0db8:0000:0000:0000:ff00:0042:8329 | 2001:db8::ff00:42:8329 | Baştaki sıfırlar, en uzun dizi |
2001:db8:0:0:0:0:2:1 | 2001:db8::2:1 | En uzun dizi |
2001:db8::0:1 | 2001:db8::1 | Fazladan 0 kalmaz |
2001:db8::1:1:1:1:1 | 2001:db8:0:1:1:1:1:1 | Tek sıfır grubu kısaltılmaz |
2001:db8:0:1:0:0:0:1 | 2001:db8:0:1::1 | Üç gruplu dizi seçilir |
2001:db8:0:0:1:0:0:1 | 2001:db8::1:0:0:1 | Eşitlikte soldaki |
2001:db8:0:0:0:0:0:0 | 2001:db8:: | Sondaki dizi |
0:0:0:0:0:0:0:1 | ::1 | Baştaki dizi (geri döngü adresi) |
Yanlış kısaltmalar ve nedenleri
Yanlışların bir kısmı adresin anlamını bozar, bir kısmı yalnızca kanonik olmayan bir yazım üretir. Tabloda ikisi de var.
| Özgün adres | Yanlış yazım | Sorun | Doğrusu |
|---|---|---|---|
2001:db8:0:0:1:0:0:2 | 2001:db8::1::2 | :: iki kez kullanılmış; adres geçersiz | 2001:db8::1:0:0:2 |
2001:0db8:0010:0:0:0:0:1 | 2001:db8:1::1 | Sağdaki sıfır atılmış; başka bir adres | 2001:db8:10::1 |
2001:db8:0:1:1:1:1:1 | 2001:db8::1:1:1:1:1 | Tek sıfır grubu :: ile kısaltılmış | 2001:db8:0:1:1:1:1:1 |
2001:db8:0:0:0:0:0:1 | 2001:DB8::1 | Büyük harf | 2001:db8::1 |
0:0:1:0:0:0:0:1 | ::1:0:0:0:0:1 | Kısa dizi kısaltılmış, uzun dizi açık kalmış | 0:0:1::1 |
2001:db8::1 ve port 80 | 2001:db8::1:80 | Port ayrılamaz; son grup gibi okunur | [2001:db8::1]:80 |
Ön ekler aynı kurallarla yazılır (RFC 5952 §7), ancak / işaretinin solundaki metin başka bir adrese açılabilir. 2001:db8:0:cd30::/60 doğrudur; 2001:db8::cd30/60 ise 2001:db8:0:0:0:0:0:cd30 adresi olarak okunur. Ön ek uzunluklarının anlamı için IPv6 prefix yazısına bakabilirsiniz.
Adresleri karşılaştırmadan önce iki tarafı da aynı biçime çevirin. 2001:DB8::1 ile 2001:db8::1 aynı adrestir, ama düz metin karşılaştırmasında farklı çıkar.
Geçersiz yazımlar
Bazı yanlışlar yalnızca kanonik olmayan bir yazım üretir, bazıları ise adresi doğrudan geçersiz kılar. Bir ayrıştırıcı aşağıdaki yazımların hepsini reddeder; hangi kuralın çiğnendiğini bilmek hatayı çabuk bulmanızı sağlar.
| Yazım | Neden geçersiz |
|---|---|
1::2::3 | :: iki kez kullanılmış |
2001:db8:::1 | Üç ardışık iki nokta üst üste var; :: işareti yalnızca ikisinden oluşur |
2001:db8:0:0:0:0:0:0:1 | Dokuz grup var; bir adres en çok sekiz grup taşır |
2001:db8::12345 | Beş basamaklı grup var; bir grup en çok dört basamak taşır |
2001:db8::g1 | g onaltılık bir basamak değil |
2001:db8:1:2:3:4:5 | Yedi grup var ve :: yok; eksik grubu gösteren işaret gerekir |
::ffff:01.2.3.4 | IPv4 kuyruğunda baştaki sıfır geçersiz |
Şüpheli bir yazımı IPv6 Adres Doğrulama aracına yapıştırın; araç hatayı nedeniyle birlikte gösterir. Hata kodunun adı araçlar arasında değişebilir, ama geçersizlik kararı değişmez.
Genişletme: kısaltmayı geri açmak
Kısaltılmış adresi tam biçime çevirmek üç adımdır:
::dışında kalan grupları sayın.::yerine, 8 eksi bu sayı kadar0grubu koyun.- Her grubun başına sıfır ekleyerek dört haneye tamamlayın.
Örnek: 2001:db8:85a3::8a2e:370:7334 adresinde altı grup görünür. :: bu yüzden iki sıfır grubunu temsil eder.
Kısaltılmış : 2001:db8:85a3::8a2e:370:7334
İki grup : 2001:db8:85a3:0:0:8a2e:370:7334
Dört hane : 2001:0db8:85a3:0000:0000:8a2e:0370:7334Uç durumlarda aynı mantık işler: ::1 adresinde yedi sıfır grubu vardır ve tam biçim 0000:0000:0000:0000:0000:0000:0000:0001 olur; :: sekiz sıfır grubunun tamamıdır. Tam açılmış biçim RFC'lerde ayrı bir kanonik biçim değildir. Araçlarda, karşılaştırmalarda ve ters DNS adı üretirken kullanılan bir gösterimdir. IPv6 Adres Genişletme aracı adımları sizin yerinize yapar.
Okuma pratiği: gizlenen grupları saymak
Kısaltılmış bir adresi okurken tek soru şudur: :: kaç sıfır grubunu saklıyor? Görünen grupları sayın ve sonucu 8'den çıkarın.
| Adres | Görünen grup | Gizlenen sıfır grubu |
|---|---|---|
2001:db8::1 | 3 | 5 |
2001:db8::2:1 | 4 | 4 |
2001:db8::1:0:0:1 | 6 | 2 |
2001:db8:: | 2 | 6 |
::1 | 1 | 7 |
Girdide :: tek bir sıfır grubunu da temsil edebilir; bu geçerli bir girdidir. Kanonik çıktıda ise :: her zaman en az iki grubu temsil eder, çünkü tek grup kısaltılmaz. Bir adresi okurken bu iki durumu ayırın: yazıldığı gibi okuyun, yeniden yazarken kurala göre yazın.
IPv4 gömülü biçimler
Karma biçimde ilk altı parça onaltılık, son iki parça (32 bit) ondalık noktalı IPv4 gibi yazılır. RFC 5952 §5, IPv4-mapped (::ffff:0:0/96) gibi iyi bilinen bir önekle IPv4 gömülü olduğu anlaşılan adreslerde karma gösterimi önerir: ::ffff:192.0.2.1 yazılır, 0:0:0:0:0:ffff:192.0.2.1 yazılmaz. Aynı adres yalnızca onaltılık da yazılabilir ve iki yazım da doğrudur:
::ffff:192.0.2.1 = ::ffff:c000:201
64:ff9b::192.0.2.33 = 64:ff9b::c000:221Karma biçimde dikkat edilecek üç nokta var. IPv4 kuyruğu yalnızca adresin son 32 bitinde olabilir. Kuyrukta baştaki sıfır geçersizdir (::ffff:01.2.3.4 yazılmaz). Genel bir önekle (2001:db8::192.0.2.1) karma gösterim önerilen çıktı değildir; kanonik yazım 2001:db8::c000:201 olur. İki yazımdan hangisinin birincil çıktı sayılacağını RFC'ler tek anlamlı belirlemez, bu yüzden araçlar farklı seçimler yapabilir. Bu gösterimleri IPv4 / IPv6 Dönüştürücü ile üretebilirsiniz.
Kodla kısaltma ve genişletme
Python'un standart kütüphanesi bu kuralları uygular:
import ipaddress
adres = ipaddress.IPv6Address("2001:0DB8:0000:0000:0001:0000:0000:0001")
print(adres.compressed) # 2001:db8::1:0:0:1
print(adres.exploded) # 2001:0db8:0000:0000:0001:0000:0000:0001Python 3.13'te IPv4-mapped adreslerde compressed çıktısı karma yazılır (::ffff:192.0.2.1), exploded çıktısı ise son 32 biti noktalı bırakır; yani sekiz parça beklemeyin. Bu bir RFC kuralı değil, kütüphane davranışıdır ve sürüme göre değişebilir.
Günlük, yapılandırma ve veritabanında tek biçim
Kısaltma kuralları en çok adresleri karşılaştırdığınız yerde işe yarar. Erişim günlüğünde, izin listesinde ya da veritabanı anahtarında aynı adres farklı yazımlarla geçerse düz metin araması bazı kayıtları kaçırır. Çözüm, adresi içeri alırken ayrıştırıp kanonik biçime çevirmek ve yalnızca onu saklamaktır:
import ipaddress
girdiler = ["2001:DB8:0:0:0:0:0:1", "2001:db8::0:1", "2001:0db8::1"]
tekil = {str(ipaddress.IPv6Address(g)) for g in girdiler}
print(tekil) # {'2001:db8::1'}Üç farklı yazım tek bir kayda iner. Karşılaştırmayı metin yerine adres nesneleri üzerinden yapmak da aynı sonucu verir: ipaddress.IPv6Address("2001:DB8::1") == ipaddress.IPv6Address("2001:db8:0:0:0:0:0:1") ifadesi True döner, çünkü nesneler yazımı değil 128 bitlik değeri karşılaştırır. Girdi IPv4 de olabilecekse IPv6Address yerine ipaddress.ip_address() kullanın; sürümü kendisi belirler. Python'un str() çıktısı RFC 5952'yi izler, ancak daha önce anlatıldığı gibi IPv4-mapped adresleri karma yazar. Veritabanında IPv4-mapped adres saklıyorsanız bu davranışı hesaba katın.
URL ve portla yazım
Adresle port birleştirilirken köşeli parantez gerekir. 2001:db8::1:80 yazımı belirsizdir, çünkü son grubun adresin parçası mı yoksa port mu olduğu anlaşılmaz (RFC 5952 §6). URL'de IPv6 adresi, IP-literal kuralı gereği köşeli parantez içinde yazılır (RFC 3986 (yeni sekmede açılır)). Proxy adreslerinde de aynı kural geçerlidir:
Yanlış : http://2001:db8::1:8080
Doğru : http://[2001:db8::1]:8080Köşeli parantez URL sözdizimidir, adresin parçası değildir. Adresi veritabanına ya da yapılandırma alanına yazarken parantezi çıkarın.
Komut satırında aynı kural geçerlidir. Aşağıdaki şablonda PROXY_HOST yerine proxy'nin IPv6 adresini yazın ve köşeli parantezleri koruyun:
curl --proxy "http://KULLANICI:PAROLA@[PROXY_HOST]:PROXY_PORT" \
https://example.com/Proxy adı bir alan adıyla verilmişse parantez kullanılmaz; yalnızca IPv6 adres değeri parantez ister.
Araçlarla doğrulama
Elle kısaltırken hata yapmak kolaydır. Şüpheli bir yazımı önce IPv6 Adres Doğrulama aracına verin; araç biçim hatasını nedeniyle birlikte gösterir. Geçerli adresi IPv6 Adres Sıkıştırma ile RFC 5952 biçimine, IPv6 Adres Genişletme ile tam biçime çevirin. Adresin hangi türe girdiğini görmek için adres türleri yazısına bakın.
Kısa özet
- Girişte esnek olun, çıkışta RFC 5952 biçimini üretin.
- Sırayla uygulayın: baştaki sıfırları atın, en uzun sıfır dizisini
::yapın, tek sıfır grubunu kısaltmayın, eşitlikte soldakini seçin, küçük harf kullanın. ::bir adreste yalnızca bir kez geçer ve 8 eksi görünen grup sayısı kadar sıfır grubunu saklar.- Port ve URL için IPv6 adresini köşeli parantez içine alın.
Sık sorulan sorular
IPv6 adresinde :: işareti kaç kez kullanılabilir?
Bir adreste yalnızca bir kez. İki kez kullanılırsa atlanan grup sayısı belirsiz kalır ve adres geçersiz olur (1::2::3 gibi).
Tek bir sıfır grubu :: ile kısaltılır mı?
Kanonik çıktıda hayır; tek sıfır grubu 0 olarak yazılır (2001:db8:0:1:1:1:1:1). 2001:db8::1:1:1:1:1 yazımı girdi olarak geçerlidir ve okunur, ama RFC 5952 çıktıda bu biçimi önermez.
İki eşit uzunlukta sıfır dizisi varsa hangisi kısaltılır?
Soldaki. 2001:db8:0:0:1:0:0:1 adresi 2001:db8::1:0:0:1 olarak yazılır; ikinci dizi açık kalır.
Büyük harfle yazılmış bir IPv6 adresi geçersiz midir?
Hayır, geçerlidir ve okuyan uygulamalar kabul etmelidir. Üretilen metinde ise RFC 5952 küçük harf önerir; 2001:DB8::1 yerine 2001:db8::1 yazın.
Kısaltılmış bir IPv6 adresi nasıl genişletilir?
Çift iki nokta (::) yerine 8 eksi görünen grup sayısı kadar sıfır grubu koyun, sonra her grubu başına sıfır ekleyerek dört haneye tamamlayın. Örneğin 2001:db8::1 adresi 2001:0db8:0000:0000:0000:0000:0000:0001 olur; IPv6 Adres Genişletme aracı bunu otomatik yapar.
/112İlgili sayfalar
- AraçIPv6 Adres SıkıştırmaRFC 5952 kurallarına göre en kısa yazım
- AraçIPv6 Adres GenişletmeKısaltılmış adresi 8 × 4 haneli tam biçime çevirir
- AraçIPv6 Adres DoğrulamaBiçim hatalarını nedeniyle birlikte gösterir
- RehberIPv6 Adres Türleri: Global, Link-Local, ULA ve Çoklu YayınIPv6 adres türlerini tek tek anlatır: global tekil yayın, link-local, ULA, çoklu yayın, loopback, IPv4-mapped ve…