IPv6 Adresleme
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:

Metin
2001:0db8:0000:0000:0000:0000:0000:0001

RFC 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ÖzellikGirdi olarakÇıktı olarak önerilen
2001:0db8:0000:0000:0000:0000:0000:0001Tam biçimGeçerliHayır
2001:db8:0:0:0:0:0:1Baştaki sıfırlar atılmışGeçerliHayır
2001:db8::0:1:: yanında fazladan 0GeçerliHayır
2001:DB8::1Büyük harfGeçerliHayır
2001:db8::0.0.0.1Karma biçimGeçerliHayır
2001:db8::1Kanonik biçimGeçerliEvet

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ı

Metin
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.

GirdiKanonik çıktıUygulanan kural
2001:0db8:0000:0000:0000:ff00:0042:83292001:db8::ff00:42:8329Baştaki sıfırlar, en uzun dizi
2001:db8:0:0:0:0:2:12001:db8::2:1En uzun dizi
2001:db8::0:12001:db8::1Fazladan 0 kalmaz
2001:db8::1:1:1:1:12001:db8:0:1:1:1:1:1Tek sıfır grubu kısaltılmaz
2001:db8:0:1:0:0:0:12001:db8:0:1::1Üç gruplu dizi seçilir
2001:db8:0:0:1:0:0:12001:db8::1:0:0:1Eşitlikte soldaki
2001:db8:0:0:0:0:0:02001:db8::Sondaki dizi
0:0:0:0:0:0:0:1::1Baş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 adresYanlış yazımSorunDoğrusu
2001:db8:0:0:1:0:0:22001:db8::1::2:: iki kez kullanılmış; adres geçersiz2001:db8::1:0:0:2
2001:0db8:0010:0:0:0:0:12001:db8:1::1Sağdaki sıfır atılmış; başka bir adres2001:db8:10::1
2001:db8:0:1:1:1:1:12001:db8::1:1:1:1:1Tek sıfır grubu :: ile kısaltılmış2001:db8:0:1:1:1:1:1
2001:db8:0:0:0:0:0:12001:DB8::1Büyük harf2001:db8::1
0:0:1:0:0:0:0:1::1:0:0:0:0:1Kısa dizi kısaltılmış, uzun dizi açık kalmış0:0:1::1
2001:db8::1 ve port 802001:db8::1:80Port 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.

İpucu

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ımNeden 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:1Dokuz grup var; bir adres en çok sekiz grup taşır
2001:db8::12345Beş basamaklı grup var; bir grup en çok dört basamak taşır
2001:db8::g1g onaltılık bir basamak değil
2001:db8:1:2:3:4:5Yedi grup var ve :: yok; eksik grubu gösteren işaret gerekir
::ffff:01.2.3.4IPv4 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:

  1. :: dışında kalan grupları sayın.
  2. :: yerine, 8 eksi bu sayı kadar 0 grubu koyun.
  3. 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.

Metin
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:7334

Uç 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.

AdresGörünen grupGizlenen sıfır grubu
2001:db8::135
2001:db8::2:144
2001:db8::1:0:0:162
2001:db8::26
::117

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:

Metin
::ffff:192.0.2.1     =  ::ffff:c000:201
64:ff9b::192.0.2.33  =  64:ff9b::c000:221

Karma 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:

Python
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:0001

Python 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:

Python
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:

Metin
Yanlış : http://2001:db8::1:8080
Doğru  : http://[2001:db8::1]:8080

Köş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:

Bash
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.