9.9. UDP – bir paket gönder, en iyisini um¶
UDP, yani Kullanıcı Veri Birimi Protokolü (User Datagram Protocol), taşıma katmanının sunduğu iki hizmetin daha basit olanıdır. Her UDP gönderimi bir veri birimi (datagram)‘dir – bir IP ve bir porta adreslenmiş, kendi başına ağa bırakılan, kendi kendine yeten bir bayt yığını. Protokol, yapabiliyorsa onu teslim eder; yapamıyorsa yeniden denemez, göndereni uyarmaz ve veri birimleri arasında herhangi bir sıralamayı korumaz.
9.9.1. UDP’nin IP’ye eklediği şeyler¶
UDP, IP üzerinde ince bir katmandır. Ham IP teslimatına üç şey ekler:
Her iki uçta da port numaraları, böylece bir veri birimi hedef ana bilgisayardaki yalnızca ana bilgisayara değil, doğru programa teslim edilebilir (bkz. Portlar).
Alıcının tam olarak kaç bayt yük (payload) okuyacağını bilmesi için bir uzunluk alanı.
Üstbilgi ve yük üzerinde küçük bir sağlama toplamı (checksum), böylece alıcı bozuk bir veri birimini tespit edip atabilir.
Hepsi bu kadar. IP’nin yaptığı ya da yapmadığı her şeyi UDP korur. Veri birimleri yeniden denenmez. Sırasız varabilirler. Altta yatan ağın gariplikleri nedeniyle çoğaltılabilirler. Ağ tıkalıysa, hedefteki arabellek doluysa ya da aradaki yönlendiricilerden biri öyle karar verirse sessizce düşürülebilirler.
Her UDP veri birimi bağımsız olarak gönderilir. Biri yolda kaybolursa, ne gönderene ne de alıcıya hiçbir şey bildirilmez – boşluk sessizdir.¶
9.9.2. Kim neden kullanmak ister¶
UDP bu kadar güvenilmezse, neden var olsun ki? Üç neden.
Hız ve ek yük. Bir UDP gönderimi, dışarı çıkan tek bir pakettir; el sıkışma yok, onaylar yok, sürdürülecek bağlantı durumu yok. Gecikme ve bant genişliği maliyeti asgari düzeydedir.
Bağımsız mesajlar. Bazı trafik, her mesajın taze bir anlık görüntü olduğu ve eskisinin değersiz olduğu bir durum güncellemeleri akışıdır. Her saniye “hâlâ hayattayım, işte güncel okumam” diye yayın yapan bir kamera, kaybolan okumaları tekrar oynatmayı değil, her yeni okumayı teslim etmeyi önemser.
Çoklu yayın (Multicast). Tek bir UDP veri birimi aynı anda birçok alıcıya gönderilebilir. (TCP bunu yapamaz; her TCP bağlantısı tam olarak iki uç nokta arasındadır.) Hizmet keşfi, birçok dinleyiciye telemetri, video akışı için kullanışlıdır.
Ağın iyi olduğu ve gönderenin kayba toleransının yüksek olduğu yerlerde, UDP doğru cevaptır. Teslimat ve sıralamanın garanti edilmesi gereken yerlerde, UDP’nin ya üzerine başka bir güvenilirlik katmanına ihtiyacı vardır ya da uygulamanın bunun yerine doğrudan TCP kullanması gerekir.
9.9.3. Ne zaman kullanılmamalı¶
Tersini de açıkça belirtmekte fayda var. UDP şu durumlarda yanlış seçimdir:
Her bayt önemli olduğunda. Yapılandırma verileri, kod güncellemeleri, imzalı işlemler – eksik bir baytın sonucu yanlış kıldığı her durum.
Sıra önemli olduğunda. UDP veri birimi 2, veri birimi 1’den önce varabilir.
Mesaj büyük olduğunda. Büyük yükler, uygulama tarafından daha küçük veri birimlerine bölünmek zorundadır; taşıma katmanı bunu yapmaz. Herhangi bir parça kaybolursa, mesajın tamamı eksik olur.
Bunlardan herhangi biri geçerliyse, bunun yerine TCP’ye başvurun.
9.9.4. Bir kamera üzerinde somut örnekler¶
Gerçek hayatta UDP trafiğinin kamera tarafındaki örnekleri:
Keşif. Bir kamera, başlangıçta yerel ağa “burada kim var” diye bir veri birimi yayınlar; diğer cihazlar yanıt verir.
Telemetri. Saniyede bir kez, kamera güncel sensör okumalarını içeren küçük bir veri birimini bir toplayıcıya gönderir. Ara sıra bir örneği kaybetmek önemli değildir çünkü zaten bir saniye içinde bir sonrakisi gelir.
Zaman senkronizasyonu. Ağ zaman protokolü olan NTP, UDP üzerinde çalışır. İstemci küçük bir istek gönderir, sunucu güncel zamanla yanıt verir; yanıt kaybolursa, istemci daha sonra yeniden sorar.
DNS aramaları. Ağa “bu ad hangi IP’ye eşleniyor?” diye sormak UDP üzerinde çalışır. (Adlar ve DNS sayfasında ele alınmıştır.)
Veri birimi gönderme ve alma için Python API’si, taşıma katmanı hikâyesinin geri kalanı yerine oturduktan sonra UDP soketleri sayfasındadır.