Ders 17 / 18
UDP
Sekiz baytlık başlık, datagram sınırının korunması, güvencesiz iletimin uygun olduğu uygulamalar ve uygulama katmanında güvenilirlik kurma.
İçindekiler
Önceki iki ders TCP’nin güvencelerini ve bunların bedelini kurdu: el sıkışma bir tur, kayıp durumunda yeniden iletim ek turlar, sıralı teslim ise bekleme.
Bu bedel her uygulama için gerekli değildir; bazıları için doğrudan zararlıdır. Bu dersin sorusu, hiçbir güvence vermeyen bir taşıma protokolünün ne işe yaradığı ve hangi gereksinimlerde doğru seçim olduğudur.
Sekiz Baytlık Başlık
UDP (User Datagram Protocol) başlığı 8 bayttır:
| Alan | Boyut | İşlev |
|---|---|---|
| Kaynak bağlantı noktası | 2 bayt | Gönderen uç nokta; kullanılmıyorsa sıfır |
| Hedef bağlantı noktası | 2 bayt | Alıcı uç nokta |
| Uzunluk | 2 bayt | Başlık dahil datagram boyu |
| Sağlama | 2 bayt | Başlık, yük ve sözde başlık üzerinde |
TCP’nin 20 baytlık başlığındaki alanların çoğu burada yoktur: sıra numarası, onay numarası, pencere, bayraklar. Yokluklarının nedeni, karşılık gelen düzeneklerin de olmamasıdır.
Sağlama alanı IPv4’te isteğe bağlıdır; sıfır bırakılırsa denetim yapılmaz. IPv6’da zorunludur, çünkü ağ katmanında başlık sağlaması kaldırılmıştır ve tek denetim taşıma katmanında kalmıştır.
Verilmeyen Sözler
| TCP’nin sözü | UDP |
|---|---|
| Teslim güvencesi | Yok — kaybolan datagram yeniden gönderilmez |
| Sıra | Yok — datagramlar gönderim sırasından farklı gelebilir |
| Yinelemesizlik | Yok — aynı datagram iki kez teslim edilebilir |
| Akış denetimi | Yok — alıcının kapasitesi gözetilmez |
| Tıkanıklık denetimi | Yok — ağın durumu gözetilmez |
| Bağlantı durumu | Yok — el sıkışma ve kapanış yoktur |
Bu liste eksiklik listesi gibi okunmamalıdır. Her satır aynı zamanda bir maliyetin kaldırılmasıdır: durum tutulmaz, tur beklenmez, gecikmiş veri için sıra bekletilmez.
Datagram Sınırı
UDP’nin verdiği tek yapısal söz, mesaj sınırının korunmasıdır. Gönderilen her datagram, alıcıda tek bir okuma işleminde ve aynı boyutla teslim edilir. TCP’de böyle bir söz yoktur: akış, baytların kesintisiz bir dizisidir ve gönderim çağrılarının sınırları kaybolur.
Aşağıdaki program aynı üç mesajı iki protokolle gönderir ve alınanları yazdırır.
import socket import threading import time MESAJLAR = [b"ALFA", b"BRAVO", b"CHARLIE"] def tcp_sunucu(alinan: list, hazir: threading.Event) -> None: d = socket.socket(socket.AF_INET, socket.SOCK_STREAM) d.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) d.bind(("127.0.0.1", 9201)) d.listen(1) hazir.set() baglanti, _ = d.accept() time.sleep(0.3) # üç gönderim de arabellekte birikir while True: parca = baglanti.recv(4096) if not parca: break alinan.append(parca) baglanti.close() d.close() def udp_sunucu(alinan: list, hazir: threading.Event) -> None: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(("127.0.0.1", 9202)) hazir.set() for _ in range(len(MESAJLAR)): veri, _ = s.recvfrom(4096) alinan.append(veri) s.close() tcp_alinan: list = [] hazir = threading.Event() threading.Thread(target=tcp_sunucu, args=(tcp_alinan, hazir), daemon=True).start() hazir.wait() istemci = socket.socket(socket.AF_INET, socket.SOCK_STREAM) istemci.connect(("127.0.0.1", 9201)) for m in MESAJLAR: istemci.send(m) time.sleep(0.5) istemci.close() time.sleep(0.3) print("TCP gönderilen:", MESAJLAR) print("TCP okunan :", tcp_alinan) udp_alinan: list = [] hazir2 = threading.Event() threading.Thread(target=udp_sunucu, args=(udp_alinan, hazir2), daemon=True).start() hazir2.wait() u = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for m in MESAJLAR: u.sendto(m, ("127.0.0.1", 9202)) time.sleep(0.5) u.close() print("UDP gönderilen:", MESAJLAR) print("UDP okunan :", udp_alinan)
Çıktı:
TCP gönderilen: [b'ALFA', b'BRAVO', b'CHARLIE'] TCP okunan : [b'ALFABRAVOCHARLIE'] UDP gönderilen: [b'ALFA', b'BRAVO', b'CHARLIE'] UDP okunan : [b'ALFA', b'BRAVO', b'CHARLIE']
TCP tarafında üç gönderim tek bir okumada birleşmiştir. Bu birleşme garanti değildir; zamanlamaya göre iki veya üç ayrı okumada da gelebilirdi. Garanti olan, sınırların korunmayacağıdır: TCP üzerinde mesaj taşıyan bir uygulama, mesaj sınırını kendisi kodlamalıdır — sabit uzunluk, uzunluk öneki veya ayraç kullanarak.
UDP tarafında üç datagram üç ayrı okumada gelmiştir ve bu garantidir. Alıcının okuma arabelleği datagramdan küçükse datagram kırpılır; kalan bölümü kaybolur.
Ne Zaman Seçilir
Seçim ölçütü, uygulamanın geciken veriye ne yaptığıdır.
| Uygulama sınıfı | Seçim | Gerekçe |
|---|---|---|
| Dosya aktarımı | TCP | Her bayt gerekli; sıra ve bütünlük zorunlu |
| Ad çözümleme | UDP | Tek istek–tek yanıt; el sıkışma turu maliyetin çoğu olur |
| Adres kiralama | UDP | Adres yokken bağlantı kurulamaz |
| Gerçek zamanlı ses ve görüntü | UDP | Geciken çerçeve değersizdir; yeniden iletim zarar verir |
| Etkileşimli oyun durumu | UDP | Eski konum bilgisi yenisiyle geçersizleşir |
| Sürekli ölçüm gönderimi | UDP | Tek bir örneğin kaybı önemsiz |
| Yayın ve çok noktaya gönderim | UDP | TCP çoklu alıcıyı desteklemez |
Gerçek zamanlı akış satırı, seçimin özünü gösterir. Bir ses çerçevesi 200 ms geç ulaşırsa çalınacağı an geçmiştir; onu yeniden istemek yalnızca ağı yorar. Kayıp çerçevenin yerine sessizlik veya kestirim koymak, geciken çerçeveyi beklemekten iyidir.
Sıra Başı Engellemesi
TCP’nin sıralı teslim sözünün ikinci bir bedeli vardır. Alıcı, akıştaki bir boşluğu doldurmadan sonraki verileri uygulamaya veremez — elinde olsalar bile. Bir segment kaybolduğunda, arkasından ulaşan segmentler arabellekte bekletilir. Buna sıra başı engellemesi (head-of-line blocking) denir.
Tek bir akış taşıyan bir bağlantıda bu doğru davranıştır. Ancak tek bir TCP bağlantısı üzerinde birbirinden bağımsız birden çok mantıksal akış taşınıyorsa, bir akıştaki kayıp diğerlerini de bekletir — aralarında hiçbir bağımlılık olmamasına karşın.
UDP’de bu engelleme yoktur, çünkü sıra sözü de yoktur. Bağımsız akışları çoğullayan protokollerin UDP üzerine kurulmasının nedenlerinden biri budur: sıra ve güvenilirlik akış başına yönetilir, akışlar birbirini bekletmez.
Güvenilirliği Uygulamada Kurmak
UDP seçmek, güvenilirlikten vazgeçmek anlamına gelmez; onu gerektiği kadar kurmak anlamına gelir. Uygulama katmanında sık kurulan parçalar şunlardır:
- Yeniden deneme ve zaman aşımı. Ad çözümlemedeki tipik kalıp: yanıt gelmezse aynı sorgu yinelenir, birkaç denemeden sonra başka bir sunucuya geçilir.
- Sıra numarası. Datagramlara numara konarak kayıp ve sıra bozulması sezilir; hangi eksiğin telafi edileceğine uygulama karar verir.
- Seçmeli yeniden iletim. Yalnızca hâlâ değerli olan veriler yeniden istenir.
- Hız denetimi. Tıkanıklık denetimi olmadığından, sürekli veri gönderen bir uygulama kendi hız sınırını kendisi koymalıdır.
Son madde ihmal edilmemelidir. Denetimsiz bir UDP akışı, aynı yolu paylaşan TCP akışlarını geri çekilmeye zorlar ve payını haksız biçimde büyütür; ağın tamamı için de tıkanıklık riski doğurur.
Bu parçaların tümü kuruluyorsa TCP’yi yeniden yazmak gibi görünür. Fark, hangi parçaların kurulduğudur: uygulama, kendi verisinin hangi bölümünün gecikince değersizleştiğini bilir; TCP bilemez.
Boyut ve Parçalama
UDP gövdeyi bölmez. Uygulama 3000 baytlık bir datagram gönderirse, bölme işi IP katmanına düşer ve Çerçeve, Paket, Segment dersindeki parçalama maliyeti doğar: parçalardan biri kaybolursa datagramın tamamı kaybolur.
Bu yüzden UDP kullanan protokoller datagram boyunu yol MTU’sunun altında tutar. Ethernet ve IPv4 için sınır bayttır; tünel bulunma olasılığına karşı daha güvenli bir eşik seçmek yaygın bir uygulamadır.
Kaynak Adresi Sahteciliği
UDP’de el sıkışma olmadığından, gönderenin adresi hiçbir aşamada doğrulanmaz. Kaynak adresi başkasına ait gösterilen bir datagram, yanıtın o adrese gitmesine yol açar.
Bunun ölçek sorunu, yanıtın istekten büyük olduğu protokollerde ortaya çıkar: küçük bir istek, hedefe büyük bir yanıt yönlendirir ve trafik çarpılarak yansıtılır. Karşı önlemler protokolün dışındadır:
- Kaynak adresi doğrulaması. Ağ operatörü, kendi ağından çıkan paketlerin kaynak adreslerinin o ağa ait olduğunu denetler. Sahte kaynaklı paket ağdan çıkamaz.
- Yanıt hızı sınırlaması. Aynı kaynağa verilen yanıt sayısı sınırlanır.
- Sorgu doğrulama. Sunucu, büyük yanıt vermeden önce isteğin gerçekten o adresten geldiğini küçük bir alışverişle sınar.
TCP’de aynı sahtecilik daha zordur: el sıkışmanın ikinci adımındaki sıra numarasını görmek gerekir ve numara rastgele seçilir. TCP dersinde belirtilen rastgelelik gereksiniminin gerekçelerinden biri budur.
Özet
- UDP başlığı 8 bayttır; sıra, onay, pencere ve bayrak alanları yoktur çünkü karşılık gelen düzenekler de yoktur.
- Teslim, sıra, yinelemesizlik, akış ve tıkanıklık denetimi güvenceleri verilmez; karşılığında durum tutulmaz ve tur beklenmez.
- UDP mesaj sınırını korur; TCP korumaz — TCP üzerinde mesaj taşıyan uygulama sınırı kendisi kodlamalıdır.
- Seçim ölçütü, geciken verinin uygulama için hâlâ değerli olup olmadığıdır.
- Sıra başı engellemesi, bağımsız akışların tek bir TCP bağlantısında birbirini bekletmesine yol açar; UDP’de bu engelleme yoktur.
- Uygulama katmanında yeniden deneme, sıra numarası ve hız denetimi kurulabilir; hız denetimi ihmal edilirse akış paylaşımı bozulur.
Sonraki Adım
İki protokolün de verimi aynı fiziksel gerçeklere çarpar: bir bit tel üzerine konması zaman alır, ışık sonlu hızda ilerler, kuyruklar bekletir. Sonraki ders bu bileşenleri ayırarak gecikmenin nereden geldiğini, bant genişliği ile gecikmenin çarpımının neden bir kapasite ölçüsü olduğunu ve bir aktarımın süresini belirleyenin çoğu zaman bant genişliği olmadığını hesapla gösterecek.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.