İçeriğe geç
academia.sh

Ders 10 / 18

IPv6

128 bitlik adresin yazım kuralları, adres türleri, otomatik yapılandırma, başlık farkları ve iki sürümün bir arada çalışması.

İçindekiler

Önceki iki ders 32 bitlik adres uzayının kıtlığıyla baş etme yöntemlerini kurdu: özel adresleri özenle bölmek, her bölüme gerektiği kadar vermek. Bu yöntemler kıtlığı yönetir, ortadan kaldırmaz.

Kıtlığın kendisine yönelen çözüm adres uzayını genişletmektir. Bu dersin sorusu, adres genişliğini dört katına çıkarmanın hangi kararları beraberinde getirdiğidir — çünkü adres genişliği, önceki konuda tanıtılan kum saatinin boğazındadır ve ona dokunmak her şeyi etkiler.

128 Bit

IPv6 adresi 128 bittir. Toplam adres sayısı 21282^{128}, yani yaklaşık 3,4×10383{,}4 \times 10^{38} olur. Karşılaştırma için: IPv4’ün 2322^{32} adresi, IPv6’nın uzayının 2962^{96}’da biridir.

Genişliğin böyle abartılı seçilmesi, adres sayısını en üst düzeye çıkarmak için değildir. Amaç hiyerarşik dağıtımı rahatlatmaktır: adresler bol olduğunda her düzeye cömert bloklar verilebilir, blokların bitişik kalması sağlanabilir ve önekler özetlenebilir. IPv4’te adresleri sıkıştırma çabası, yönlendirme tablolarının parçalanmasına yol açmıştı.

Bunun görünür sonucu, IPv6 alt ağlarının her zaman /64 olmasıdır. Bir alt ağdaki düğüm sayısı ne olursa olsun — iki cihaz da olsa — 64 bitlik düğüm bölümü verilir. IPv4 alışkanlığıyla bakıldığında bu savurganlıktır; IPv6 tasarımında ise otomatik yapılandırmanın ön koşuludur.

Yazım Kuralları

Adres, iki nokta üst üste ile ayrılmış sekiz onaltılık dörtlü olarak yazılır. Üç kısaltma kuralı vardır:

  1. Her dörtlüdeki baştaki sıfırlar atılabilir: 0db8db8, 00000.
  2. Ardışık sıfır dörtlüleri :: ile tek seferde atılabilir.
  3. :: bir adreste en çok bir kez kullanılabilir; iki kez kullanılsaydı hangi boşluğun kaç dörtlü olduğu belirsiz kalırdı.
import ipaddress

for metin in ("2001:0db8:0010:0003:0000:0000:0000:0001",
              "fe80:0000:0000:0000:0200:5eff:fe00:5301",
              "ff02:0000:0000:0000:0000:0000:0000:0001",
              "0000:0000:0000:0000:0000:0000:0000:0001",
              "2001:0db8:0000:0000:0001:0000:0000:0001"):
    a = ipaddress.ip_address(metin)
    print(f"{metin} -> {a.compressed}")
2001:0db8:0010:0003:0000:0000:0000:0001 -> 2001:db8:10:3::1
fe80:0000:0000:0000:0200:5eff:fe00:5301 -> fe80::200:5eff:fe00:5301
ff02:0000:0000:0000:0000:0000:0000:0001 -> ff02::1
0000:0000:0000:0000:0000:0000:0000:0001 -> ::1
2001:0db8:0000:0000:0001:0000:0000:0001 -> 2001:db8::1:0:0:1

Son satır üçüncü kuralı gösterir: adreste iki ayrı sıfır dizisi vardır, yalnızca uzun olan sıkıştırılmıştır. Kısa olan 0:0 biçiminde yazılmak zorundadır. Eşit uzunlukta iki dizi varsa soldaki sıkıştırılır.

Bağlantı noktası numarasıyla birlikte yazıldığında adres köşeli parantez içine alınır: [2001:db8:10:3::1]:443. Aksi hâlde son iki nokta üst üstenin adrese mi bağlantı noktasına mı ait olduğu ayırt edilemez.

Adres Türleri

IPv6’da yayın adresi yoktur. Yayının işlevi çok noktaya gönderimle karşılanır; bu, “herkese sor” yerine “ilgilenenlere sor” davranışı sağlar ve gereksiz işlemeyi azaltır.

Önek Tür Kapsam
2000::/3 Genel tekil adres Genel İnternet
fe80::/10 Yerel bağlantı Yalnız aynı bağlantı
fc00::/7 Benzersiz yerel adres Kurum içi
ff00::/8 Çok noktaya gönderim Öneke gömülü
::1/128 Geri döngü Makinenin kendisi
::/128 Belirsiz adres Kaynak alanında “adresim yok”
2001:db8::/32 Belgeleme Yönlendirilmez

Yerel bağlantı adresi her IPv6 arayüzünde bulunur ve zorunludur; genel adres olmasa bile vardır. Yönlendirici duyuruları ve komşu keşfi bu adresler üzerinden yürür. Adres yalnızca bir bağlantı içinde anlamlı olduğundan, aynı yerel bağlantı adresi farklı arayüzlerde tekrarlanabilir; bu yüzden kullanılırken arayüz belirtilir.

Benzersiz yerel adres, IPv4’teki özel kullanım bloklarının karşılığıdır: kurum içinde kullanılır, genel İnternet’te yönlendirilmez.

Çok noktaya gönderim adreslerinde önek, kapsamı da taşır. ff02::1 bağlantı kapsamındaki tüm düğümleri, ff02::2 bağlantı kapsamındaki tüm yönlendiricileri gösterir.

İstenen düğüm çok noktaya gönderim adresi (solicited-node multicast), ARP’nin yayın sorununu çözen düzenektir: ff02::1:ff00:0/104 önekine hedef adresin son 24 biti eklenir. Komşu keşfi sorusu bu adrese gönderilir ve yalnızca son 24 biti eşleşen az sayıda arayüz mesajı işler. Yayın alanındaki her cihazın her soruyu işlemesi böylece önlenir.

Otomatik Yapılandırma

IPv6 arayüzleri, sunucu olmadan adres kurabilir. Durumsuz otomatik yapılandırma (stateless address autoconfiguration, SLAAC) dört adımdır:

  1. Arayüz, kendine bir yerel bağlantı adresi üretir (fe80:: öneki + arayüz tanımlayıcısı).
  2. Yinelenen adres sınaması (duplicate address detection) yapar: ürettiği adresin istenen düğüm grubuna bir komşu isteği gönderir. Yanıt gelirse adres kullanımdadır.
  3. ff02::2 adresine bir yönlendirici isteği gönderir. Yönlendirici, bağlantıda kullanılan /64 öneki içeren bir yönlendirici duyurusu ile yanıtlar.
  4. Arayüz, duyurulan öneki kendi arayüz tanımlayıcısıyla birleştirerek genel adresini kurar.

Arayüz tanımlayıcısını üretmenin bir yolu EUI-64 dönüşümüdür: 48 bitlik MAC adresinin ortasına ff:fe eklenir ve evrensel/yerel biti ters çevrilir.

import ipaddress


def eui64(mac: str) -> str:
    b = [int(x, 16) for x in mac.split(":")]
    b[0] ^= 0x02                       # evrensel/yerel biti ters çevrilir
    ham = bytes(b[:3] + [0xFF, 0xFE] + b[3:])
    return ":".join(ham[i:i + 2].hex() for i in range(0, 8, 2))


arayuz = eui64("00:00:5e:00:53:01")
print("arayüz tanımlayıcısı:", arayuz)
print("yerel bağlantı adresi:", ipaddress.ip_address("fe80::" + arayuz))
print("genel adres          :", ipaddress.ip_address("2001:db8:10:3:" + arayuz))
arayüz tanımlayıcısı: 0200:5eff:fe00:5301
yerel bağlantı adresi: fe80::200:5eff:fe00:5301
genel adres          : 2001:db8:10:3:200:5eff:fe00:5301

Örnek ağdaki istemcinin MAC adresi 00:00:5e:00:53:01 idi; ilk baytın ikinci biti ters çevrilerek 02 olmuş, ortaya ff:fe eklenmiştir. /64 alt ağ zorunluluğunun nedeni burada görülür: arayüz tanımlayıcısı 64 bittir.

EUI-64 dönüşümünün bir mahremiyet sorunu vardır: adres, donanım adresini içerdiği için makine ağdan ağa taşınsa bile izlenebilir. Bu nedenle uçlar çoğunlukla arayüz tanımlayıcısını rastgele üretir ve süreli olarak değiştirir. Sunucular ise sabit ve okunabilir tanımlayıcılar kullanır — 2001:db8:10:4::20 gibi elle atanmış adresler yaygındır.

SLAAC ad sunucusu bilgisi taşımaz. Bu bilgi ya yönlendirici duyurusunun bir seçeneğiyle ya da IPv6 için tanımlanmış durumsuz kiralama protokolüyle verilir.

Başlık Farkları

IPv6 başlığı 40 bayt sabittir; IPv4’ün 20 baytlık başlığından büyüktür, ancak alan sayısı azdır ve değişken uzunluk yoktur.

Değişiklik Gerekçe
Başlık sağlaması kaldırıldı Bağlantı katmanı ve taşıma katmanı zaten denetliyor; her sekmede yeniden hesap gereksiz
Yönlendiricide parçalama kaldırıldı Parçalama maliyeti uçlara itildi; ara düğüm paketi atar ve bildirir
Başlık uzunluğu sabitlendi İşleme boru hattı yalınlaşır
Seçenekler ek başlıklara taşındı Zincir hâlinde eklenir, ana başlığı şişirmez
En küçük MTU 1280 bayta yükseltildi Yol MTU keşfi gereksinimi azalır

Sağlamanın kaldırılması, uçtan uca ilkesinin doğrudan uygulanmasıdır: ara düğümde yapılan denetim doğruluk için gerekli değildi, yalnızca maliyet ekliyordu.

Örnek Ağın IPv6 Planı

Kurum, sağlayıcısından 2001:db8:10::/48 tahsisi almıştır. Bu tahsis 65 536 adet /64 alt ağ içerir; kurumun beş ağı için fazlasıyla yeterlidir.

import ipaddress

tahsis = ipaddress.ip_network("2001:db8:10::/48")
plan = {
    "Misafir kablosuz": "2001:db8:10:1::/64",
    "Laboratuvar": "2001:db8:10:2::/64",
    "Yönetim": "2001:db8:10:3::/64",
    "Sunucu": "2001:db8:10:4::/64",
    "Bağlantı": "2001:db8:10:ffff::/64",
}
print("tahsis:", tahsis, "— içindeki /64 sayısı:", 2 ** (64 - tahsis.prefixlen))
for ad, cidr in plan.items():
    net = ipaddress.ip_network(cidr)
    print(f"{ad:18s} {str(net):24s} tahsisin içinde={net.subnet_of(tahsis)}")
tahsis: 2001:db8:10::/48 — içindeki /64 sayısı: 65536
Misafir kablosuz   2001:db8:10:1::/64       tahsisin içinde=True
Laboratuvar        2001:db8:10:2::/64       tahsisin içinde=True
Yönetim            2001:db8:10:3::/64       tahsisin içinde=True
Sunucu             2001:db8:10:4::/64       tahsisin içinde=True
Bağlantı           2001:db8:10:ffff::/64    tahsisin içinde=True

İki planın karşıtlığı öğreticidir. IPv4 planında her bit sayıldı, boş adresler tek tek not edildi, büyüme payı bir kısıt oldu. IPv6 planında düğüm sayısı hiç hesaba girmedi; tek karar, hangi alt ağ numarasının hangi bölüme verileceğiydi. Alt ağ numaraları okunabilirlik için seçilmiştir — noktadan noktaya bağlantıya ffff verilmesi, tahsisin sonundan başlamak gibi bir düzen tercihidir.

İki Sürümün Bir Arada Çalışması

IPv4 ve IPv6 birbiriyle doğrudan konuşmaz: farklı adres genişlikleri, farklı başlıklar, farklı komşu keşfi. Bir arada çalışma için üç yaklaşım vardır.

Çift yığın (dual stack): Uçlar ve yönlendiriciler her iki protokolü de çalıştırır. Bir hedefe hangi sürümle gidileceğine ad çözümlemesinin sonucu karar verir. En yalın yöntemdir; maliyeti her şeyin iki kez yapılandırılması ve iki kez denetlenmesidir.

Tünelleme: IPv6 paketi, IPv4 paketinin yükü olarak taşınır. Aradaki ağ IPv6 bilmiyorsa kullanılır. Tünel başlığı MTU’yu düşürür; önceki konuda ele alınan parçalama ve yol MTU sorunları bu yüzden tünellerde sık görülür.

Çeviri: Bir ara düğüm IPv6 adreslerini IPv4 adreslerine dönüştürür. Uçtan uca saydamlığı bozar ve sonraki derste ele alınacak adres dönüştürme sorunlarını devralır.

Bir uç her iki sürüme de sahipse hangisini seçeceği bir sıralama kuralına bağlıdır; genel eğilim IPv6’yı önce denemek ve başarısız olursa IPv4’e dönmektir. Bu davranış, IPv6 yolunda sessiz bir arıza olduğunda gecikmeyi artırabilir.

Özet

  • IPv6 adresi 128 bittir; genişliğin amacı adres sayısını artırmaktan çok hiyerarşik dağıtımı ve önek özetlemeyi rahatlatmaktır.
  • Alt ağlar her zaman /64’tür; 64 bitlik arayüz tanımlayıcısı otomatik yapılandırmanın ön koşuludur.
  • Yazımda baştaki sıfırlar atılır ve en uzun sıfır dizisi :: ile bir kez sıkıştırılır.
  • Yayın adresi yoktur; işlevi çok noktaya gönderim ve istenen düğüm grubu ile karşılanır.
  • Durumsuz otomatik yapılandırma yerel bağlantı adresi üretme, yinelenen adres sınaması, yönlendirici duyurusu ve önek birleştirme adımlarından oluşur.
  • Başlıkta sağlama ve yönlendiricide parçalama kaldırılmıştır; iki sürüm çift yığın, tünelleme veya çeviri ile bir arada çalışır.

Sonraki Adım

Bu derste “yönlendirici paketi atar ve bildirir” ifadesi birkaç kez geçti. Bildirimin kendisi de bir protokoldür ve yalnızca hata haberciliği yapmaz: erişilebilirlik sınaması, yol keşfi ve MTU bildirimi de onun üzerinden yürür. Sonraki ders bu denetim mesajlarını, yaşam süresi alanının nasıl bir yol izleme aracına dönüştüğünü ve mesajların engellenmesinin neden sessiz arızalara yol açtığını ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat