İçeriğe geç
academia.sh

Ders 04 / 18

Çerçeve, Paket, Segment

Katman başına veri birimi terimleri, en büyük iletim birimi, en büyük segment boyu ve IPv4 parçalama hesabı.

İçindekiler

Önceki ders 100 baytlık bir uygulama verisinin 158 baytlık bir çerçeveye dönüşünü izledi ve yol boyunca üç ayrı ad kullandı: segment, datagram, çerçeve. Bu adlar gelişigüzel değildir; her biri belirli bir katmanın veri birimini gösterir.

Adların kesinleştirilmesi terminolojik bir titizlikten ibaret değildir. Her katmanın kendi boyut sınırı vardır ve bu sınırlar birbirini belirler. Bu dersin sorusu, bir verinin en fazla ne kadar büyük olabileceği ve sınırı aştığında ne olduğudur.

Katman Başına Veri Birimi

Bir katmanın kendi başlığıyla birlikte oluşturduğu birime protokol veri birimi (protocol data unit) denir. Katman başına adlandırma şöyledir:

Katman Birim adı İçeriği
Uygulama Veri / mesaj Uygulamanın ürettiği bayt dizisi
Taşıma (TCP) Segment TCP başlığı + uygulama verisi
Taşıma (UDP) Datagram UDP başlığı + uygulama verisi
İnternet Paket / datagram IP başlığı + taşıma birimi
Bağlantı Çerçeve (frame) Bağlantı başlığı + IP paketi + kuyruk
Fiziksel Bit / simge Ortama konan sinyal

İki ayrım özellikle karışır.

Birincisi, segment ile datagram ayrımıdır. TCP’nin birimi segmenttir; UDP’nin birimi datagramdır. Ad farkı tesadüf değildir: segment, bir bayt akışından kesilmiş bir dilimdir ve akış içindeki yeri sıra numarasıyla bilinir. Datagram ise kendi başına duran, sınırları korunan bir mesajdır. Bu fark, taşıma katmanı konusunda ayrıntılı biçimde ele alınacaktır.

İkincisi, paket sözcüğünün iki anlamıdır. Dar anlamda paket, ağ katmanının birimidir. Geniş anlamda, ağ üzerinde giden herhangi bir veri parçasını gösterir — “paket anahtarlama” terimindeki kullanım budur. Bu kurs, ağ katmanı birimi için “paket” veya “datagram” terimlerini kullanır; ölçüsüz kullanımdan kaçınmak için diğer katmanların birimleri kendi adlarıyla anılır.

En Büyük İletim Birimi

En büyük iletim birimi (maximum transmission unit, MTU), bir bağlantı katmanı teknolojisinin tek bir çerçevede taşıyabileceği yükün üst sınırıdır. Ölçü, bağlantı başlığını içermez: MTU, çerçevenin taşıyabileceği ağ katmanı paketinin boyudur.

Yaygın Ethernet gerçekleştiriminde bu sınır 1500 bayttır. Sınırın bir üst sınır olmasının nedeni, ortamın paylaşılmasıdır: tek bir çerçeve ne kadar uzun sürerse, sıradaki cihazlar o kadar bekler. Sınırın bir alt sınırının olmasının nedeni ise başlık yükünün küçük çerçevelerde katlanılmaz hâle gelmesidir.

MTU değeri yol boyunca değişebilir. Bir tünel, kendi başlığı için yer ayırmak zorunda olduğundan içindeki bağlantının MTU değerini düşürür. Yolun tamamında geçerli olan en küçük değer, yol MTU değeri (path MTU) olarak adlandırılır.

En Büyük Segment Boyu

En büyük segment boyu (maximum segment size, MSS), bir TCP segmentinin taşıyabileceği uygulama verisinin üst sınırıdır. MTU’dan türetilir ve başlıklar düşülür:

MSS=MTUIP bas¸g˘ıTCP bas¸g˘ı\text{MSS} = \text{MTU} - \text{IP başlığı} - \text{TCP başlığı}

Ortam MTU IP başlığı TCP başlığı MSS
Ethernet, IPv4 1500 20 20 1460
Ethernet, IPv6 1500 40 20 1440
Tünelli bağlantı 1492 20 20 1452

UDP için karşılık gelen sınır 1500208=14721500 - 20 - 8 = 1472 bayttır; UDP başlığı 8 bayttır.

MSS, TCP bağlantısı kurulurken iki uç arasında bildirilir: her uç, kendi alabileceği en büyük segment boyunu karşı tarafa söyler ve küçük olan geçerli olur. Bu bildirim, gönderen tarafın parçalamaya düşmeden segment üretmesini sağlar.

Seçeneklerin kullanıldığı durumlarda TCP başlığı 20 baytı aşar ve MSS buna göre azalır. Zaman damgası ve seçmeli onay gibi seçenekler etkinken kullanılabilir veri alanı daralır.

Parçalama

Bir IPv4 paketi, geçeceği bağlantının MTU değerinden büyükse parçalanır (fragmentation). Parçalama, IP başlığındaki üç alanla yürütülür:

  • Kimlik: Aynı özgün datagramdan gelen tüm parçalarda aynıdır.
  • Parça devam ediyor bayrağı (MF): Son parça dışındaki tüm parçalarda 1’dir.
  • Parça ofseti: Bu parçanın yükünün, özgün yükün başından itibaren kaçıncı bayttan başladığını verir. Alan 13 bit olduğundan ofset 8 baytlık birimlerle sayılır; bu yüzden son parça dışındaki her parçanın yükü 8’in katı olmak zorundadır.

Aşağıdaki program, verilen yük boyunu ve MTU değerini alıp parçaları hesaplar.

def parcala(yuk_boyu: int, mtu: int, baslik: int = 20) -> None:
    """Bir IPv4 datagramının yükünü MTU sınırına göre parçalara böler."""
    parca_yuku = (mtu - baslik) // 8 * 8      # ofset 8 baytın katı olmalı
    ofset = 0
    kalan = yuk_boyu
    sira = 1
    while kalan > 0:
        bu_parca = min(parca_yuku, kalan)
        kalan -= bu_parca
        print(f"parça {sira}: yük={bu_parca:4d} bayt  "
              f"ofset alanı={ofset // 8:3d}  MF={1 if kalan else 0}  "
              f"datagram={bu_parca + baslik:4d} bayt")
        ofset += bu_parca
        sira += 1


parcala(4000, mtu=1500)

Çıktı:

parça 1: yük=1480 bayt  ofset alanı=  0  MF=1  datagram=1500 bayt
parça 2: yük=1480 bayt  ofset alanı=185  MF=1  datagram=1500 bayt
parça 3: yük=1040 bayt  ofset alanı=370  MF=0  datagram=1060 bayt

Hesabın adımları izlenebilir. MTU 1500, IP başlığı 20 bayt olduğuna göre parça başına en çok 150020=14801500 - 20 = 1480 bayt yük taşınabilir; 1480 zaten 8’in katıdır. İlk parça 0. bayttan başlar, ofset alanı 0’dır. İkinci parça 1480. bayttan başlar: 1480/8=1851480 / 8 = 185. Üçüncü parça 2960. bayttan başlar: 2960/8=3702960 / 8 = 370 ve kalan 40002960=10404000 - 2960 = 1040 baytı taşır.

Toplam taşınan yük 1480+1480+1040=40001480 + 1480 + 1040 = 4000 bayttır, ancak tel üzerindeki toplam 1500+1500+1060=40601500 + 1500 + 1060 = 4060 bayta çıkmıştır: iki fazladan IP başlığı eklenmiştir.

Daha küçük bir MTU değeri, parça sayısını hızla artırır:

parcala(4000, mtu=576)
parça 1: yük= 552 bayt  ofset alanı=  0  MF=1  datagram= 572 bayt
parça 2: yük= 552 bayt  ofset alanı= 69  MF=1  datagram= 572 bayt
parça 3: yük= 552 bayt  ofset alanı=138  MF=1  datagram= 572 bayt
parça 4: yük= 552 bayt  ofset alanı=207  MF=1  datagram= 572 bayt
parça 5: yük= 552 bayt  ofset alanı=276  MF=1  datagram= 572 bayt
parça 6: yük= 552 bayt  ofset alanı=345  MF=1  datagram= 572 bayt
parça 7: yük= 552 bayt  ofset alanı=414  MF=1  datagram= 572 bayt
parça 8: yük= 136 bayt  ofset alanı=483  MF=0  datagram= 156 bayt

Burada 57620=556576 - 20 = 556 değeri 8’in katı olmadığından parça yükü 552’ye yuvarlanmıştır.

Parçalamanın Maliyeti

Parçalama üç nedenle istenmez.

Kayıp maliyeti çarpılır. Parçalar ancak tümü ulaştığında birleştirilebilir. Sekiz parçadan biri kaybolursa diğer yedisi de atılır ve özgün datagram yeniden gönderilmek zorunda kalır. Bağımsız kayıp varsayımıyla, parça başına kayıp olasılığı pp ise nn parçalık bir datagramın ulaşma olasılığı (1p)n(1-p)^n’dir; p=0,01p = 0{,}01 ve n=8n = 8 için bu oran yaklaşık 0,9230{,}923’tür, yani datagram kaybı %7,7’ye çıkar.

Birleştirme yükü alıcıya düşer. Parçalar yol boyunca birleştirilmez; yalnızca son hedefte birleştirilir. Alıcı, eksik parçaları beklerken bellek tutmak ve bir zaman aşımı saymak zorundadır.

Ara katmanların işi zorlaşır. Yalnızca ilk parça taşıma katmanı başlığını taşır; sonraki parçalarda bağlantı noktası numarası yoktur. Bağlantı noktasına göre karar veren düzenekler, sonraki parçaları sınıflandıramaz.

Bu nedenle yaygın uygulama parçalamadan kaçınmaktır. Gönderen, IP başlığındaki parçalanmasın (DF) bayrağını kurar; paket MTU’dan büyük bir bağlantıya geldiğinde yönlendirici onu atar ve gönderene bir hata mesajı döndürür. Gönderen bu mesajdaki MTU değerine göre segment boyunu küçültür. Bu döngüye yol MTU keşfi (path MTU discovery) denir ve ICMP dersinde ayrıntılı olarak ele alınacaktır.

IPv6, parçalamayı yol üzerindeki yönlendiricilerden tamamen kaldırmıştır: bir paket MTU’dan büyükse yönlendirici onu parçalamaz, atar ve bildirir. Parçalama gerekiyorsa yalnızca gönderen uç yapar.

Örnek Ağda Sınırlar

Kurumsal ağdaki istemci, 198.51.100.20 adresine 3000 baytlık bir gövde göndermek istediğinde ne olacağı bu derste kurulan hesapla belirlenir. TCP kullanılıyorsa parçalama hiç yaşanmaz: taşıma katmanı gövdeyi kendisi böler ve 1460+1460+801460 + 1460 + 80 baytlık üç segment üretir. Her segment ayrı bir IP paketi olarak gider ve hiçbiri MTU’yu aşmaz.

UDP kullanılıyorsa durum başkadır: UDP gövdeyi bölmez, 3000 baytlık tek bir datagram üretir ve bölme işi IP katmanına düşer. Bu, taşıma katmanı seçiminin ağ katmanı davranışını doğrudan belirlediği somut bir örnektir.

Özet

  • Her katmanın veri birimi ayrı adla anılır: segment (TCP), datagram (UDP ve IP), paket (IP), çerçeve (bağlantı katmanı).
  • MTU, bir bağlantının tek çerçevede taşıyabileceği ağ katmanı paketinin üst sınırıdır ve bağlantı başlığını içermez.
  • MSS, MTU’dan IP ve TCP başlıkları düşülerek bulunur: Ethernet ve IPv4 için 1460 bayt.
  • Parçalama kimlik, parça devam ediyor bayrağı ve parça ofseti alanlarıyla yürütülür; ofset 8 baytlık birimlerle sayıldığından son parça dışındaki yükler 8’in katı olmalıdır.
  • 4000 baytlık bir yük 1500 baytlık MTU’da 1480 + 1480 + 1040 biçiminde üç parçaya bölünür; tel üzerindeki toplam 4060 bayta çıkar.
  • Parçalama kayıp maliyetini çarpar; yaygın uygulama parçalanmasın bayrağı ve yol MTU keşfi ile ondan kaçınmaktır.

Sonraki Adım

Bu konu, verinin katmanlar arasındaki biçimini tanımladı. Sıradaki konu, bu biçimlerin gerçekte nasıl taşındığına iner. İlk durak en alttaki adres düzeyidir: aynı kabloyu veya aynı kablosuz hücreyi paylaşan cihazlar birbirini nasıl bulur, bir anahtar hangi çerçeveyi nereye gönderir. Sonraki ders Ethernet çerçevesini ve donanım adreslerinin yapısı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