SEN2008 · 5. hafta · Network Layer Concepts (I): , internetworking, Internet Protocol (IP, IPv6)

IPv4 başlığı, parçalama, NAT ve IPv6

IPv4 datagram başlığının alanları, MTU yüzünden parçalama ve offset hesabı, NAT tablosunun nasıl çalıştığı ve IPv6'nın IPv4'ten farkları. Parçalama hesabı vizede klasik zor soru.

datagramTTLprotocol fieldheader checksumMTUfragmentationfragment offsetMF flagNATIPv6tunnelingdual stackICMP

Bir önceki sayfada adresleri hesapladık. Şimdi o adresleri taşıyan paketin, yani datagramın içine bakıyoruz. Ağ katmanının veri düzlemi (data plane) dediği iş tam burası: başlık okunur, TTL azaltılır, gerekirse parçalanır, iletilir. Sınavda üç tip soru gelir: başlık alanı sorusu, parçalama hesabı ve IPv6 farkları. Altın kurallar:

  1. Seçeneksiz IPv4 başlığı 20 bayttır.
  2. Offset 8 bayt birimiyle yazılır. Parça verisi 8’in katı olmak zorunda (son parça hariç).
  3. Parçaları sadece hedef host birleştirir. Ara router’lar birleştirmez.
  4. NAT kaynak adresi ve portu değiştirir, eşlemeyi tabloda tutar.
  5. IPv6 başlığı sabit 40 bayttır, router’lar parçalamaz.

IPv4 datagram başlığı

AlanBoyutNe işe yarar
Version4 bit4 ya da 6
Header length (HLEN)4 bitBaşlık boyu, 4 bayt birimiyle (5 → 20 bayt)
Type of service8 bitÖncelik, DSCP/ECN
Total length16 bitBaşlık + veri, bayt; en çok 65535
Identification16 bitAynı datagrama ait parçaları eşler
Flags3 bitDF (don’t fragment), MF (more fragments)
Fragment offset13 bitParçanın verideki yeri, 8 bayt birimiyle
Time to live (TTL)8 bitHer router’da 1 azalır, 0’da atılır
Protocol8 bitYük kime: 6 TCP, 17 UDP, 1 ICMP
Header checksum16 bitSadece başlığın hata kontrolü
Source / destination address32 + 32 bitKaynak ve hedef
OptionsdeğişkenNadiren kullanılır

Bir TCP segmenti IPv4 üzerinde taşınıyorsa en az 20 bayt IP + 20 bayt TCP başlığı vardır, yani yük başına 40 bayt ek yük (overhead).

TUZAK · TTL saniye değil. Adı “time to live” olsa da pratikte bir hop sayacıdır. TTL = 5 olan paketi 5. router atar.

ICMP (Internet Control Message Protocol) bu katmanın hata ve kontrol mesajlarını taşır: echo request/reply (ping), destination unreachable, time exceeded. ICMP mesajları IP datagramının içinde taşınır (protocol = 1).

Parçalama (fragmentation)

Her bağlantının taşıyabileceği en büyük çerçeve yükü farklıdır: MTU (Maximum Transmission Unit). Ethernet için 1500 bayt. Büyük bir datagram küçük MTU’lu bir bağlantıya gelirse IPv4 router’ı onu parçalara böler. Her parça kendi IP başlığını taşır; aynı Identification değeri, kendi offset’i ve MF bayrağıyla.

Hesap şablonu:

parc¸a verisimax⁡=⌊MTU−208⌋×8offset=verideki bayt konumu8\text{parça verisi}_{\max} = \left\lfloor \frac{\text{MTU} - 20}{8} \right\rfloor \times 8 \qquad \text{offset} = \frac{\text{verideki bayt konumu}}{8}

Örnek: 5200 baytlık datagram (20 bayt başlık), MTU = 1420.

veri            = 5200 - 20 = 5180 bayt
parça başı veri = (1420 - 20) = 1400 → 1400/8 = 175, tam 8'in katı

parça  veri   toplam uzunluk  offset            MF
1      1400   1420            0                 1
2      1400   1420            1400/8 = 175      1
3      1400   1420            2800/8 = 350      1
4       980   1000            4200/8 = 525      0
kontrol: 1400*3 + 980 = 5180

MTU - 20 sekizin katı değilse aşağı yuvarla. Örneğin MTU 1000 ise 980 değil 976 bayt veri koyabilirsin, çünkü bir sonraki parçanın offset’i 8’e bölünebilmeli.

TUZAK · başlığı iki kez saymak ya da hiç saymamak. Parçalanan şey veridir. Önce orijinal başlığı çıkar, veriyi böl, sonra her parçaya yeniden 20 bayt ekle. Parçaların toplam uzunluğu orijinalden büyüktür (ekstra başlıklar yüzünden).

Geriye doğru soru da çıkar: son parçanın offset’i ve uzunluğu verilir, orijinal boyu sorulur. Formül: offset×8+(son parc¸a uzunlug˘u−20)+20\text{offset} \times 8 + (\text{son parça uzunluğu} - 20) + 20.

son parça: offset = 250, toplam uzunluk = 620, MF = 0
verinin başı   250 * 8 = 2000. bayt
son parça veri 620 - 20 = 600 bayt
orijinal veri  2000 + 600 = 2600 bayt
orijinal boy   2600 + 20 = 2620 bayt

Bu sorularda MF = 0 bilgisi kritik: sadece son parça orijinalin sonunu gösterir. MF = 1 olan bir parçadan orijinal boy bulunamaz.

DF bayrağı 1 ise router parçalayamaz; datagramı atar ve ICMP “fragmentation needed” yollar. Bir parça kaybolursa hedef bütün datagramı çöpe atar. Parçalama bu yüzden pahalıdır ve güvenlik açısından da sorunludur: üst üste binen parçalarla yapılan saldırılar (overlapping fragment attacks) güvenlik duvarlarını atlatmaya çalışır.

NAT (Network Address Translation)

IPv4 adresleri tükendi. Ev ağındaki onlarca cihaz İnternete tek bir genel adresle çıkar. Ev router’ı NAT yapar: giden her paketin kaynak IP’sini kendi genel adresiyle, kaynak portunu da kendi seçtiği bir portla değiştirir, eşlemeyi NAT çeviri tablosuna yazar.

Özel ağ: 192.168.1.0/24     NAT router genel adresi: 203.0.113.9

GİDEN   192.168.1.20:41000 → 198.51.100.80:443
NAT     kaynak değişir → 203.0.113.9:6012 → 198.51.100.80:443
tablo   203.0.113.9:6012  ↔  192.168.1.20:41000

DÖNEN   198.51.100.80:443 → 203.0.113.9:6012
NAT     tabloya bak     → 198.51.100.80:443 → 192.168.1.20:41000

Port alanı 16 bit olduğu için tek genel adres teoride 65536 eşzamanlı eşlemeye kadar destekler.

NAT’ın eleştirileri: router’ların port numarasıyla oynaması katman ilkesine aykırıdır; dışarıdan içeri bağlantı başlatmak zorlaşır (P2P, sunucu barındırma), bunun için port forwarding ya da NAT traversal gerekir. Güvenlik tarafında NAT bir güvenlik duvarı değildir, ama istenmeyen içeri bağlantıları dolaylı olarak engeller.

IPv6

32 bitlik IPv4 uzayı (232≈4.32^{32} \approx 4.3 milyar) yetmedi. IPv6 adresi 128 bittir, 21282^{128} adres. Tek bir /64 alt ağında bile 264=184467440737095516162^{64} = 18446744073709551616 adres var.

ÖzellikIPv4IPv6
Adres boyu32 bit128 bit
Başlık20 ile 60 bayt, değişken40 bayt, sabit
Checksumvaryok
Router’da parçalamavaryok (sadece kaynak)
Optionsbaşlık içindeextension header (“next header” alanı)
TTLTTLhop limit
Yeniflow label (akış etiketi)

Yazım kuralları. Sekiz tane 16 bitlik grup, onaltılık, iki nokta ile ayrılır. Her gruptaki baştaki sıfırlar atılır. Arka arkaya sıfır grupları bir kez :: ile kısaltılır.

2001:0db8:0000:0000:0000:ff00:0042:8329  →  2001:db8::ff00:42:8329
fe80:0000:0000:0000:0204:61ff:fe9d:f156  →  fe80::204:61ff:fe9d:f156
2001:0db8:0000:0001:0000:0000:0000:0001  →  2001:db8:0:1::1
0000:0000:0000:0000:0000:0000:0000:0001  →  ::1   (loopback)

Üçüncü örnekte iki sıfır bölgesi var: tek grup (0) ve üç grup. :: daha uzun olana verilir, tek sıfır 0 diye yazılır.

IPv4’ten IPv6’ya geçiş. Bütün router’lar bir gecede değiştirilemez. İki yöntem:

  • Dual stack: cihaz hem IPv4 hem IPv6 konuşur.
  • Tunneling: IPv6 datagramı, IPv4 datagramının veri kısmına konur ve araya giren IPv4-only router’lardan geçirilir. Tünelin öbür ucundaki router onu çıkarıp IPv6 olarak devam ettirir (IPv4 protocol alanı 41).

İPUCU · neden checksum kaldırıldı? TCP/UDP ve Ethernet zaten hata kontrolü yapıyor. Her hopta yeniden hesaplanan bir alanı atmak router’ı hızlandırır. Aynı mantıkla parçalama da kaynağa bırakıldı.

Güvenlik notu: IP başlığına güvenme

IP başlığındaki hiçbir alan doğrulanmaz. Kaynak adresi gönderen kendisi yazar; sahte kaynak adresli paket göndermeye IP spoofing denir. Bu, 10. haftadaki DDoS yansıtma (reflection) saldırılarının temelidir. Parçalama da kötüye kullanılabilir: çakışan offset’li parçalar ya da hiç tamamlanmayan parça dizileri, hedefin yeniden birleştirme (reassembly) tamponunu doldurabilir veya bir güvenlik duvarının denetimini atlatabilir. Bu yüzden ISP’ler kendi ağlarından çıkan sahte kaynaklı paketleri filtreler (ingress filtering), güvenlik duvarları da parçaları denetlemeden önce birleştirir. Kimlik ve bütünlük gerekiyorsa üst katmanda kriptografi (IPsec, TLS) kullanılır.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Offset bayt cinsinden8 bayt birimiyle; 185 → 1480. bayt
Parça verisi MTU - 208’in katına aşağı yuvarla (980 → 976)
Son parçada MF = 1Son parçada MF = 0
Router’lar parçaları birleştirirSadece hedef host birleştirir
TTL saniye cinsindendirHop sayacıdır
NAT sadece IP adresini değiştirirPort da değişir, tabloda tutulur
IPv6’da router parçalarAtar, ICMPv6 Packet Too Big yollar
:: birkaç kez kullanılabilirBir adreste en fazla bir kez
IPv6 başlığı IPv4’ün 4 katı (80 B)Sabit 40 bayt; adresler 4 kat büyüdü, başlık 2 kat

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

What is the size of an IPv4 header with no options?

Cevabı göster
20 bytes

Seçeneksiz IPv4 başlığı 5 tane 32 bitlik satırdır: 5×4=205 \times 4 = 20 bayt. Header length alanı 4 bayt birimiyle sayar, bu durumda değeri 5'tir. En fazla 15, yani 60 bayt olabilir.

Soru 2kolay

A datagram arrives with TTL = 5 and travels along a path of routers. Which router discards it?

  1. The 4th router
  2. The 5th router
  3. The 6th router
  4. None; TTL only limits the time in seconds
Cevabı göster
B) The 5th router

Her router TTL'yi 1 azaltır: 1. router 4, 2. router 3, 3. router 2, 4. router 1, 5. router 0 yapar. Sıfıra düşüren router datagramı atar ve kaynağa ICMP "time exceeded" gönderir. traceroute bu davranışı kullanır.

Soru 3kolay

The Protocol field of an IPv4 header contains 17. Which protocol is carried in the payload?

  1. TCP
  2. ICMP
  3. UDP
  4. OSPF
Cevabı göster
C) UDP

Protocol alanı yükü hangi üst katmana vereceğini söyler: 1 ICMP, 6 TCP, 17 UDP, 89 OSPF.

Soru 4zor

A 3000-byte IPv4 datagram (20-byte header, no options) must cross a link with MTU = 1000 bytes. How many fragments are produced, and what is the offset field of the last fragment?

Cevabı göster
4 fragments, last offset 366

Veri = 3000 - 20 = 2980 bayt. Bir parçaya en çok 1000 - 20 = 980 bayt veri sığar, ama offset 8 bayt birimiyle olduğu için 8'in katına indir: 976.
976 + 976 + 976 = 2928, kalan 2980 - 2928 = 52 bayt. Toplam 4 parça.
Offsetler: 0, 976/8 = 122, 244, 366. Son parçanın toplam uzunluğu 52 + 20 = 72 bayt ve MF = 0.

Soru 5orta

A fragment has offset field = 185. At which byte of the original payload does its data begin?

Cevabı göster
1480

Offset 8 baytlık birimlerle yazılır: 185×8=1480185 \times 8 = 1480. Bu parçanın verisi orijinal yükün 1480. baytından başlar.

Soru 6zor

The last fragment of a datagram has Total Length = 1500, offset = 370 and MF = 0 (20-byte header). What was the total length of the original datagram?

Cevabı göster
4460 bytes

Son parçanın verisi 370×8=2960370 \times 8 = 2960. bayttan başlar ve 1500−20=14801500 - 20 = 1480 bayttır. Orijinal veri 2960+1480=44402960 + 1480 = 4440 bayt. Bir başlık ekle: 4440+20=44604440 + 20 = 4460 bayt.

Soru 7orta

Why must every router recompute the IPv4 header checksum?

  1. Because the payload changes at each hop
  2. Because the TTL field (and possibly options) changes at each hop
  3. Because the source address is rewritten by every router
  4. Because the checksum covers the Ethernet frame
Cevabı göster
B) Because the TTL field (and possibly options) changes at each hop

Header checksum sadece başlığı kapsar. Her router TTL'yi azalttığı için başlık değişir, checksum da yeniden hesaplanmalıdır. IPv6 bu maliyet yüzünden checksum alanını kaldırdı.

Soru 8orta

A host 192.168.1.20 behind a NAT router (public address 203.0.113.9) sends a segment from port 41000 to 198.51.100.80:443. The NAT assigns port 6012. What source address and port does the web server see?

  1. 192.168.1.20:41000
  2. 203.0.113.9:41000
  3. 203.0.113.9:6012
  4. 192.168.1.20:6012
Cevabı göster
C) 203.0.113.9:6012

NAT giden pakette kaynak IP'yi kendi genel adresiyle, kaynak portu da yeni seçtiği portla değiştirir ve tabloya (203.0.113.9:6012 ↔ 192.168.1.20:41000) satırını yazar. Sunucu özel adresi hiç görmez. Cevap geldiğinde NAT tabloya bakıp hedefi geri 192.168.1.20:41000 yapar.

Soru 9orta

Write 2001:0db8:0000:0000:0000:ff00:0042:8329 in its shortest valid IPv6 form.

Cevabı göster
2001:db8::ff00:42:8329

İki kural: her gruptaki baştaki sıfırlar atılır (0db8 → db8, 0042 → 42), arka arkaya gelen sıfır gruplarının bir bloğu :: ile yazılır. Üç sıfır grubu :: olur.

Soru 10orta

Which of the following is NOT a valid IPv6 address?

  1. fe80::204:61ff:fe9d:f156
  2. ::1
  3. 2001:db8::7::1
  4. 2001:db8:0:1::1
Cevabı göster
C) 2001:db8::7::1

:: bir adreste sadece bir kez kullanılabilir. İki tane olursa kaç sıfır grubunun hangisine ait olduğu belirsiz kalır. Diğerleri geçerli: ::1 loopback, fe80:: link-local.

Soru 11orta

Which IPv4 header field has NO counterpart in the IPv6 base header?

  1. Hop limit / TTL
  2. Header checksum
  3. Source address
  4. Traffic class / type of service
Cevabı göster
B) Header checksum

IPv6 temel başlığı sabit 40 bayttır. Checksum (taşıma ve bağlantı katmanı zaten kontrol ediyor), parçalama alanları (router'lar parçalamaz) ve options (extension header'a taşındı) çıkarıldı. TTL'nin karşılığı hop limit, ToS'un karşılığı traffic class.

Soru 12zor

An IPv6 router receives a datagram larger than the outgoing link's MTU. What does it do?

  1. Fragments it like IPv4
  2. Drops it and sends an ICMPv6 Packet Too Big message to the source
  3. Forwards it anyway
  4. Converts it into IPv4
Cevabı göster
B) Drops it and sends an ICMPv6 Packet Too Big message to the source

IPv6'da ara router'lar parçalama yapmaz. Datagramı atar, kaynağa ICMPv6 "Packet Too Big" yollar. Gerekirse parçalamayı kaynak yapar (path MTU discovery).

Doğrulama: Parçalama uzunlukları, offset değerleri ve MF bayrakları, IPv6 sıfır sıkıştırması ve 2^64 node ile hesaplandı (verify/SEN2008/05.mjs).

Deftere not kartı

IPv4 başlık: 20 B (seçeneksiz), en çok 60 B. HLEN 4 B birimiyle TTL her router'da -1; 0 olunca at + ICMP time exceeded Protocol: 1 ICMP, 6 TCP, 17 UDP, 89 OSPF checksum sadece başlık; TTL değiştiği için her hopta yeniden Parçalama: parça verisi = (MTU-20) aşağı 8'in katı offset = bayt konumu / 8; MF=1 son parça hariç geri birleştirme (reassembly) SADECE hedef hostta orijinal uzunluk = son offset*8 + son veri + 20 NAT: (genel IP, yeni port) ↔ (özel IP, port) tablosu IPv6: 128 bit, başlık sabit 40 B, checksum yok, router parçalamaz :: sadece 1 kez; baştaki sıfırlar atılır geçiş: dual stack, tunneling (IPv6'yı IPv4 içine koy)