İçeriğe geç
academia.sh

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 1500208=14721500 - 20 - 8 = 1472 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat