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:
| 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 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 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: . Üçüncü parça 2960. bayttan başlar: ve kalan baytı taşır.
Toplam taşınan yük bayttır, ancak tel üzerindeki toplam 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 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ığı ise parçalık bir datagramın ulaşma olasılığı ’dir; ve için bu oran yaklaşık ’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 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.