UDP (User Datagram Protocol), IP üzerinde çalışan ve veri birimleri gönderirken minimum gecikme sağlayan bağlantısız bir veri aktarım protokolüdür. TCP'nin aksine UDP, teslimatı, paket sırasını veya kopyalamaya karşı korumayı garanti etmez. IETF RFC 768 (2024)'e göre, UDP görüntülü aramalar, akış ve DNS sorguları sayesinde küresel internet trafiğinin %40'ından fazlasını işler.
Önemli Noktalar
UDP (User Datagram Protocol), TCP/IP modelinin taşıma katmanındaki temel protokollerden biridir ve 1980 yılında David Reed tarafından tasarlanmıştır. Minimum veri aktarım mekanizması sağlar: uygulama bir veri birimi gönderir ve protokol alıcıya ulaşıp ulaşmadığını izlemez.
UDP başlığı yalnızca dört alandan oluşur: kaynak bağlantı noktası, hedef bağlantı noktası, uzunluk ve sağlama toplamı. Her alan 2 bayt yer kaplar, bu nedenle toplam başlık boyutu 8 bayttır. Karşılaştırma için, seçenekleri olmayan bir TCP başlığı 20 bayt, seçeneklerle birlikte 60 bayta kadardır.
Protokol kendi seviyesinde parçalamayı desteklemez — bir veri birimi MTU'yu (Maximum Transmission Unit) aşarsa, IP seviyesinde parçalanır. Bir parça kaybolursa, tüm veri birimi atılır çünkü UDP tek tek parçaların yeniden iletilmesini isteyemez. Geliştiriciler veri birimi boyutunu kontrol etmelidir — mobil ağlar için MTU genellikle 1400 bayttır, bu nedenle maksimum boyut bu değeri aşmamalıdır.
UDP kullanan bir uygulama, SOCK_DGRAM türünde bir yuva oluşturur, bağlantı noktasını ve hedef IP adresini belirtir ve bir veri birimi gönderir. Protokol minimum bir başlık ekler ve paketi IP katmanına iletir. Alıcı kendi bağlantı noktasında dinler ve gelen veri birimlerinden verileri çıkarır.
UDP tıkanıklık kontrolü yapmaz — uygulama ağın desteklediği maksimum hızda veri birimleri gönderebilir. Bu, kanal tıkanıklığına yol açabilir, ancak gerçek zamanlı senaryolarda bu tür bir saldırganlık haklıdır: görüntülü arama için, olası kayıpları olan bir veri akışı, iletimi durdurmaktan daha önemlidir.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
Bu örnekte, UDP için bir SOCK_DGRAM yuvası oluşturulur. sendto yöntemi, bağlantı kurmadan bir veri birimi gönderir — yalnızca alıcının IP'sini ve bağlantı noktasını bilmek yeterlidir. Sunucu tarafındaki recvfrom yöntemi, yanıt için hem verileri hem de gönderenin adresini döndürür. Mobil platformlardaki UDP yuvaları benzer şekilde yapılandırılır ancak ek izinler gerektirir: iOS'ta şifrelenmemiş UDP bağlantıları için NSAppTransportSecurity eklenmelidir ve Android'de manifest dosyasında INTERNET izni gereklidir.
UDP'yi seçmek, hızın güvenilirlikten daha kritik olduğu senaryolarda haklıdır. Protokol, bağlantı kurma, onaylama ve yeniden iletim için zaman harcamaz — bu minimum gecikme sağlar, ancak geliştiricinin kayıpları bağımsız olarak ele almasını gerektirir.
| Avantajlar | Dezavantajlar |
|---|---|
| Düşük gecikme — el sıkışma yok | Teslimat garantisi yok |
| Daha küçük başlık — 8 bayt | Tıkanıklık kontrolü yok |
| Yayın ve çoklu yayın desteği | Olası paket kopyaları |
| Veri birimi bağımsızlığı — sıra yok | Veri birimi boyutu MTU ile sınırlı |
Mobil uygulamalarda UDP, UDP üzerine kayıp kontrolü, uyarlanabilir bit hızı ve titreme arabelleği ekleyen WebRTC gibi çerçeveler aracılığıyla kullanılır. Bu, çıplak protokolün dezavantajları olmadan hız avantajları sağlar.
UDP'nin bir diğer önemli yönü, tıkanıklık kontrolünün olmamasıdır. TCP'de, Slow Start ve Congestion Avoidance algoritmaları, ağ aşırı yüklenmesini önlemek için paket kaybında iletim hızını düşürür. UDP bu tür mekanizmalara sahip değildir, bu nedenle geliştiriciler kendi hız kontrol stratejilerini uygulamalıdır — örneğin, görüntülü aramalarda uyarlanabilir bit hızı veya oyun sunucularında aşırı ağ tıkanıklığını önlemek için hız sınırlama.
UDP, gecikme toleransının paket kaybı toleransından daha önemli olduğu senaryolarda vazgeçilmezdir. Mobil ve web geliştirmede protokolün ana uygulama alanlarını keşfedelim.
UDP üzerinde çalışan RTP ve RTSP protokolleri, gerçek zamanlı ses ve video akışlarını iletmek için kullanılır. WebRTC — tarayıcılarda ve mobil uygulamalarda görüntülü arama standardı — medya verileri için birincil taşıma olarak UDP'yi ve sinyalleme için TCP'yi kullanır. 30 fps videoda bir paket kaybı, yeniden iletim gecikmesinin aksine kullanıcı tarafından fark edilmez ve bu, görüntüde belirgin bir donmaya neden olur.
Çok oyunculu nişancı oyunları ve MOBA'lar, doğru senkronizasyon için 50 ms'nin altında gecikme gerektirir. UDP oyuncu konumlarını, atışları ve olayları TCP'den daha hızlı iletir ve paket kaybı basitçe yok sayılır — sonraki güncelleme 16–33 ms içinde gelir. Unity ve Unreal Engine dahil popüler oyun motorları, uygulama seviyesinde onaylar yoluyla kritik olaylar için ek güvenilirlikle kendi taşıma katmanları aracılığıyla UDP'yi kullanır.
DNS sorguları, bağlantı noktası 53'te UDP kullanır çünkü her sorgu tek bir küçük veri birimidir (genellikle 512 bayta kadar). Yanıt gelmezse, istemci bir zaman aşımından sonra sorguyu yeniden dener; bu, üç yönlü el sıkışmasıyla bir TCP bağlantısı kurmaktan daha hızlıdır. DHCP de UDP üzerinde çalışır çünkü istemcinin henüz bir IP adresi yoktur ve TCP bağlantısı kuramazken, yayın UDP paketleri yerel ağda bir DHCP sunucusu bulmayı sağlar.
UDP ve TCP arasındaki seçim, hız ve güvenilirlik arasında bir dengedir. Her protokol, görev sınıfı için idealdir ve farklılıklarını anlamak, mobil uygulamalarda ağ iletişimi tasarlarken doğru mimari kararlar almaya yardımcı olur.
| Kriter | UDP | TCP |
|---|---|---|
| Bağlantı kurma | Gerekmez | Üç yönlü el sıkışma |
| Başlık | 8 bayt | 20–60 bayt |
| Teslimat garantisi | Hayır | Evet, onayla |
| Sıralama | Hayır | Evet |
| Tıkanıklık kontrolü | Hayır | Evet (AIMD, Slow Start) |
| Kullanım alanları | Akış, oyunlar, DNS | Web, e-posta, dosyalar, API |
Mobil projeler genellikle hibrit bir yaklaşım kullanır: güvenilir istekler (kimlik doğrulama, veri yükleme) için TCP ve medya akışları için UDP. QUIC — UDP üzerinde çalışan Google'ın modern protokolü — UDP'nin hızını TCP'nin güvenilirliğiyle birleştirir ve halihazırda HTTP/3'te kullanılmaktadır.
İstemcilerden mesaj alan ve yanıt gönderen Python'da basit bir UDP sunucusuna bakalım. Sunucu, 8888 numaralı bağlantı noktasını dinler ve gelen veri birimlerini sonsuz bir döngüde işler.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP sunucusu 8888 bağlantı noktasında başlatıldı')
while True:
data, addr = server.recvfrom(1024)
print(f'{addr} adresinden alındı: {data.decode()}')
server.sendto(b'OK', addr)
Sunucu bir UDP yuvası oluşturur, 8888 bağlantı noktasına bağlanır ve gelen veri birimlerini bekler. recvfrom verileri ve istemcinin adresini döndürerek sendto aracılığıyla yanıt vermeyi sağlar. TCP'nin aksine, sunucu bağlantı durumunu korumaz — her veri birimi bağımsız olarak işlenir. Bu, UDP sunucularını ölçeklenebilir yapar: tek bir sunucu, her bir bağlantı için bellek ayırmadan milyonlarca istemciyi işleyebilir; bu, DNS sunucuları ve oyun eşleştirme sistemleri için önemlidir.
Mobil geliştirmede, UDP genellikle üst düzey kitaplıklar aracılığıyla kullanılır. Örneğin, iOS için CocoaAsyncSocket, eşzamansız olay işleme için temsilciler ve GCD ile UDP yuvaları sağlar. Android'de, DatagramSocket sınıfı standart java.net kitaplığının bir parçasıdır ve ek bağımlılık gerektirmez. Flutter için, yerel yuvaları yapılandırmadan veri birimleri göndermek ve almak için basit bir arayüz sağlayan udp paketi bulunur.
Birçok mobil ağ ve kurumsal güvenlik duvarının, özellikle 1024'ün üzerindeki bağlantı noktalarında UDP trafiğini engellediğini unutmamak önemlidir. Uygulamanız UDP kullanıyorsa, WebRTC'nin yaptığı gibi TCP'ye bir geri dönüş sağlamalı veya STUN sunucuları aracılığıyla protokol kullanılabilirliğini kontrol etmelisiniz. iOS'ta, sistem Network.framework'ü NWConnection ile hem TCP'yi hem de UDP'yi destekler ve kullanılabilirliğe bağlı olarak otomatik olarak en uygun protokolü seçer. Gerçek zamanlı uygulamalar için, paket kaybında akış kalitesini düşüren ve yüksek hata oranlarına sahip kararsız kanallarda bile sürekli oynatma sağlayan uyarlanabilir bit hızının uygulanması da önerilir.
Sıkça Sorulan Sorular
UDP bağlantı kurmaz ve paket teslimatını garanti etmez, bu da onu TCP'den daha hızlı yapar. UDP başlığı 8 bayt iken TCP 20–60 bayttır. UDP akış ve oyunlar için uygundur, TCP ise web istekleri ve dosya aktarımları içindir.
Veri birimi, UDP başlığı (kaynak bağlantı noktası, hedef bağlantı noktası, uzunluk, sağlama toplamı) olan bağımsız bir veri paketidir. Her veri birimi, öncekilerle ilişkisi olmadan bağımsız olarak işlenir. Veri birimi boyutu ağ MTU'su ile sınırlıdır ve belirtime göre 65507 bayta kadardır.
UDP, taşıma seviyesinde güvenilirlik sağlamaz — uygulama tarafından uygulanır. Geliştiriciler sıra numaraları, sağlama toplamları, yeniden iletim istekleri ve hata düzeltme ekler. FEC (Forward Error Correction), yeniden iletim olmadan kaybolan paketleri kurtarmaya olanak tanır.
UDP, veri bütünlüğünün kritik olduğu senaryolar için uygun değildir: dosya aktarımları, banka işlemleri, REST API'leri. Bu durumlarda, TCP her baytın doğru sırada ulaşmasını garanti eder. UDP ayrıca yüksek kayıp oranlarına sahip kararsız kanallarda önerilmez.
QUIC, UDP üzerinde çalışan bir taşıma protokolüdür, Google tarafından geliştirilmiş ve IETF tarafından RFC 9000 olarak standartlaştırılmıştır. UDP'nin hızını TCP'nin güvenilirliğiyle birleştirir, hat başı engellemesi olmadan çoğullamayı destekler ve yerleşik şifrelemeye sahiptir. HTTP/3, taşıma katmanı olarak QUIC kullanır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun