UDP (User Datagram Protocol) — əlaqə qurulmadan məlumat ötürmə protokolu, IP üzərində işləyir və datagram göndərərkən minimal gecikmə təmin edir. TCP-dən fərqli olaraq, UDP çatdırılma, paket sırası və ya təkrarlanmadan qorunma zəmanəti vermir. IETF RFC 768 (2024) məlumatlarına görə, UDP videozənglər, streaming və DNS sorğuları hesabına dünya internet trafikinin 40%-dən çoxunu emal edir.
Əsas məqamlar
UDP (User Datagram Protocol) — TCP/IP modelinin nəqliyyat təbəqəsinin əsas protokollarından biri, 1980-ci ildə Devid Rid tərəfindən işlənib hazırlanmışdır. O, minimal məlumat ötürmə mexanizmi təmin edir: tətbiq datagram göndərir və protokol onun alıcıya çatıb-çatmadığını izləmir.
UDP başlığı cəmi dörd sahədən ibarətdir: mənbə portu, təyinat portu, uzunluq və yoxlama cəmi. Hər bir sahə 2 bayt tutur, buna görə də başlığın ümumi ölçüsü 8 baytdır. Müqayisə üçün, TCP başlığı opsiyasız 20 bayt, opsiyalarla isə 60 bayta qədər tutur.
Protokol öz səviyyəsində fraqmentasiyanı dəstəkləmir — datagram MTU-nu (Maximum Transmission Unit) aşarsa, IP səviyyəsində fraqmentləşir. Bir fraqment itirildikdə bütün datagram ləğv edilir, çünki UDP ayrı-ayrı fraqmentlərin təkrar göndərilməsini tələb edə bilmir. Tərtibatçılar datagramın ölçüsünü nəzarət etməlidirlər — mobil şəbəkələr üçün MTU tez-tez 1400 bayt təşkil edir, buna görə də maksimum ölçü bu dəyərdən çox olmamalıdır.
UDP istifadə edən tətbiq SOCK_DGRAM tipli soket yaradır, təyinat portu və IP-ünvanı göstərir və datagram göndərir. Protokol minimal başlıq əlavə edir və paketi IP səviyyəsinə ötürür. Qəbul edən öz portunu dinləyir və gələn datagramlardan məlumatları çıxarır.
UDP sıxlıq nəzarətini həyata keçirmir — tətbiq şəbəkənin dəstəklədiyi maksimum sürətlə datagram göndərə bilər. Bu, kanalın həddindən artıq yüklənməsinə səbəb ola bilər, lakin real vaxt ssenarilərində belə aqressivlik əsaslandırılır: videozəng üçün ötürmənin dayandırılmasından daha çox mümkün itkilərlə məlumat axını vacibdir.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
Nümunədə UDP üçün SOCK_DGRAM soketi yaradılır. sendto metodu əlaqə qurulmadan datagram göndərir — alıcının IP və portunu bilmək kifayətdir. Server tərəfində recvfrom metodu həm məlumatları, həm də cavab üçün göndərənin ünvanını qaytarır. Mobil platformalarda UDP soketləri oxşar şəkildə konfiqurasiya olunur, lakin əlavə icazələr tələb olunur: iOS-da şifrələnməmiş UDP birləşmələri üçün NSAppTransportSecurity əlavə etmək, Android-də isə manifestdə INTERNET icazəsi vermək lazımdır.
UDP seçimi sürətin etibarlılıqdan daha vacib olduğu ssenarilərdə əsaslandırılır. Protokol əlaqə qurulmasına, təsdiqləmələrə və təkrar göndərmələrə vaxt itirmir — bu minimal gecikmə verir, lakin tərtibatçıdan itkilərin müstəqil idarə edilməsini tələb edir.
| Üstünlüklər | Çatışmazlıqlar |
|---|---|
| Aşağı gecikmə — handshake yoxdur | Çatdırılma zəmanəti yoxdur |
| Kiçik başlıq — 8 bayt | Sıxlıq nəzarəti yoxdur |
| Broadcast və multicast dəstəyi | Paket təkrarlanması mümkündür |
| Datagramların müstəqilliyi — növbələr yoxdur | Datagram ölçüsü MTU ilə məhdudlaşır |
Mobil tətbiqlərdə UDP WebRTC kimi freymvorklar vasitəsilə tətbiq olunur, onlar UDP üzərində itki nəzarəti, adaptiv bitrate və jitter buferi əlavə edir. Bu, xam protokolun çatışmazlıqları olmadan sürət üstünlükləri verir.
UDP-nin digər vacib aspekti sıxlıq nəzarətinin olmamasıdır. TCP-də Slow Start və Congestion Avoidance alqoritmləri paket itkisi zamanı ötürmə sürətini azaldır ki, şəbəkəni yükləməsin. UDP-nin belə mexanizmləri yoxdur, buna görə də tərtibatçılar öz sürət nəzarəti strategiyalarını tətbiq etməlidirlər — məsələn, videozənglərdə adaptiv bitrate və ya oyun serverlərində şəbəkə kanalının həddindən artıq yüklənməsinin qarşısını almaq üçün rate limiting.
UDP gecikmə tolerantlığının paket itkisi tolerantlığından daha vacib olduğu ssenarilərdə əvəzolunmazdır. Protokolun mobil və veb inkişafda əsas tətbiq sahələrinə baxaq.
UDP üzərində işləyən RTP və RTSP protokolları real vaxtda audio və video axınlarının ötürülməsi üçün istifadə olunur. WebRTC — brauzerlərdə və mobil tətbiqlərdə videozənglər üçün standart — media məlumatları üçün UDP-ni əsas nəqliyyat kimi, siqnalizasiya üçün isə TCP-ni istifadə edir. 30 fps videoda bir paketin itkisi istifadəçi üçün nəzərə çarpmır, təkrar göndərmə gecikməsindən fərqli olaraq, bu görüntünün nəzərə çarpan donmasına səbəb olur.
Çoxoyunçulu atıcılar və MOBA düzgün sinxronizasiya üçün 50 ms-dən az gecikmə tələb edir. UDP oyunçuların mövqelərini, atışları və hadisələri TCP-dən daha sürətli ötürür, paket itkisi isə sadəcə nəzərə alınmır — növbəti yeniləmə 16–33 ms sonra gələcək. Məşhur oyun mühərrikləri, o cümlədən Unity və Unreal Engine, UDP-ni öz nəqliyyat təbəqələri vasitəsilə istifadə edir və kritik hadisələr üçün tətbiq səviyyəsində təsdiqləmələrlə etibarlılıq əlavə edir.
DNS sorğuları 53-cü portda UDP-dən istifadə edir, çünki hər sorğu bir kiçik datagramdır (adətən 512 bayta qədər). Cavab gəlməzsə, müştəri sadəcə vaxt aşımından sonra sorğunu təkrarlayır, bu da üç mərhələli əl sıxması ilə TCP bağlantısı qurmaqdan daha sürətlidir. DHCP də UDP üzərində işləyir, çünki müştərinin hələ IP-ünvanı yoxdur və TCP bağlantısı qura bilməz, geniş yayım UDP paketləri isə lokal şəbəkədə DHCP serverini tapmağa imkan verir.
UDP və TCP arasında seçim sürət və etibarlılıq arasında kompromisdir. Hər protokol öz sinif tapşırıqları üçün optimaldır və onların fərqlərini anlamaq mobil tətbiqlərdə şəbəkə qarşılıqlı əlaqəsini layihələndirərkən düzgün arxitektura qərarları qəbul etməyə kömək edir.
| Meyar | UDP | TCP |
|---|---|---|
| Əlaqənin qurulması | Tələb olunmur | Üç mərhələli əl sıxması |
| Başlıq | 8 bayt | 20–60 bayt |
| Çatdırılma zəmanəti | Yox | Bəli, təsdiqləmə ilə |
| Sıralama | Yox | Bəli |
| Sıxlıq nəzarəti | Yox | Bəli (AIMD, Slow Start) |
| Tətbiq | Streaming, oyunlar, DNS | Veb, email, fayllar, API |
Mobil layihələrdə tez-tez hibrid yanaşma istifadə olunur: TCP etibarlı sorğular üçün (avtorizasiya, məlumat yükləmə) və UDP media axınları üçün. QUIC — UDP üzərində işləyən müasir Google protokolu — UDP sürətini TCP etibarlılığı ilə birləşdirir və artıq HTTP/3-də istifadə olunur.
Python-da müştərilərdən mesajları qəbul edən və cavab göndərən sadə UDP serverinə baxaq. Server 8888 portunu dinləyir və gələn datagramları sonsuz dövrədə emal edir.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP serveri 8888 portunda işə salındı')
while True:
data, addr = server.recvfrom(1024)
print(f'{addr} ünvanından alındı: {data.decode()}')
server.sendto(b'OK', addr)
Server UDP soketi yaradır, 8888 portuna bağlanır və gələn datagramları gözləyir. recvfrom məlumatları və müştərinin ünvanını qaytarır, bu da sendto vasitəsilə cavab verməyə imkan verir. TCP-dən fərqli olaraq, server bağlantı vəziyyətini saxlamır — hər datagram müstəqil emal olunur. Bu, UDP serverlərini miqyaslana bilən edir: bir server milyonlarla müştərini emal edə bilər, hər bir ayrıca bağlantı üçün yaddaş ayırmadan, bu DNS serverləri və oyun matçmeikinq sistemləri üçün vacibdir.
Mobil inkişafda UDP tez-tez yüksək səviyyəli kitabxanalar vasitəsilə istifadə olunur. Məsələn, iOS üçün CocoaAsyncSocket UDP soketlərini deleqatlar və GCD ilə asinxron hadisə emalı üçün təmin edir. Android-də DatagramSocket sinfi standart java.net kitabxanasına daxildir və əlavə asılılıqlar tələb etmir. Flutter üçün udp paketi mövcuddur ki, bu da nativ soketləri konfiqurasiya etmədən datagram göndərmək və qəbul etmək üçün sadə interfeys təmin edir.
Qeyd etmək vacibdir ki, bir çox mobil şəbəkələr və korporativ firevollər UDP trafikini bloklayır, xüsusən 1024-dən yuxarı portlarda. Tətbiqiniz UDP istifadə edirsə, TCP-yə fallback və ya WebRTC-nin etdiyi kimi STUN serverləri vasitəsilə protokolun əlçatanlığının yoxlanılması nəzərdə tutulmalıdır. iOS-da sistem freymvorku Network.framework NWConnection ilə həm TCP, həm də UDP-ni dəstəkləyir, əlçatanlığa əsasən avtomatik olaraq optimal protokolu seçir. Real vaxt tətbiqləri üçün həmçinin paket itkisi zamanı axın keyfiyyətini azaldan, hətta yüksək səhv səviyyəsi olan qeyri-sabit kanallarda belə davamlı oynatma təmin edən adaptiv bitrate tətbiq etmək tövsiyə olunur.
Tez-tez verilən suallar
UDP əlaqə qurmur və paketlərin çatdırılmasına zəmanət vermir, bu da onu TCP-dən daha sürətli edir. UDP başlığı — 8 bayt, TCP-də isə 20–60 bayt. UDP streaming və oyunlar üçün uyğundur, TCP — veb sorğular və fayl ötürülməsi üçün.
Datagram — UDP başlığı (mənbə portu, təyinat portu, uzunluq, yoxlama cəmi) olan müstəqil məlumat paketidir. Hər datagram əvvəlkilərlə əlaqəsi olmadan müstəqil emal olunur. Datagram ölçüsü şəbəkənin MTU-su ilə məhdudlaşır və spesifikasiyaya görə 65507 bayta qədərdir.
UDP nəqliyyat səviyyəsində etibarlılığı təmin etmir — onu tətbiq həyata keçirir. Tərtibatçılar sıra nömrələri, yoxlama cəmləri, təkrar sorğular və səhv korreksiyası əlavə edir. FEC (Forward Error Correction) itirilmiş paketləri təkrar göndərmədən bərpa etməyə imkan verir.
UDP məlumat bütövlüyünün kritik olduğu ssenarilər üçün uyğun deyil: fayl ötürülməsi, bank əməliyyatları, REST-API. Bu hallarda TCP hər baytın düzgün qaydada çatacağına zəmanət verir. UDP həmçinin yüksək itki səviyyəsi olan qeyri-sabit kanallarda tövsiyə edilmir.
QUIC — UDP üzərində işləyən, Google tərəfindən hazırlanmış və IETF tərəfindən RFC 9000 kimi standartlaşdırılmış nəqliyyat protokoludur. O, UDP sürətini TCP etibarlılığı ilə birləşdirir, bloklamadan multipleksləşdirmə və daxili şifrələmə dəstəkləyir. HTTP/3 nəqliyyat səviyyəsi kimi QUIC-dən istifadə edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun