UDP (User Datagram Protocol) — kapcsolat nélküli adatátviteli protokoll, amely IP felett működik és minimális késleltetést biztosít a datagramok küldésekor. A TCP-vel ellentétben az UDP nem garantálja a kézbesítést, a csomagok sorrendjét vagy a duplikáció elleni védelmet. A IETF RFC 768 (2024) adatai szerint az UDP a világ internetes forgalmának több mint 40%-át dolgozza fel videohívásoknak, streamelésnek és DNS-lekérdezéseknek köszönhetően.
Főbb pontok
UDP (User Datagram Protocol) — a TCP/IP modell szállítási rétegének egyik kulcsfontosságú protokollja, amelyet David Reed fejlesztett ki 1980-ban. Minimális adatátviteli mechanizmust biztosít: az alkalmazás elküld egy datagramot, és a protokoll nem követi, hogy az eljutott-e a címzetthez.
Az UDP fejléc mindössze négy mezőből áll: forrásport, célport, hossz és ellenőrző összeg. Minden mező 2 bájtot foglal el, így a fejléc teljes mérete 8 bájt. Összehasonlításképpen: a TCP fejléc opciók nélkül 20 bájtot, opciókkal pedig akár 60 bájtot is elfoglalhat.
A protokoll nem támogatja a fragmentációt a saját szintjén — ha a datagram meghaladja az MTU-t (Maximum Transmission Unit), az IP szinten fragmentálódik. Egy fragmentum elvesztésekor a teljes datagram elvetésre kerül, mivel az UDP nem tudja kérni az egyes fragmentumok újraküldését. A fejlesztőknek ellenőrizniük kell a datagram méretét — mobil hálózatok esetén az MTU gyakran 1400 bájt, ezért a maximális méret nem haladhatja meg ezt az értéket.
Az UDP-t használó alkalmazás létrehoz egy SOCK_DGRAM típusú socketet, megadja a cél portot és IP-címet, majd elküldi a datagramot. A protokoll minimális fejlécet ad hozzá, és továbbítja a csomagot az IP rétegnek. A fogadó a saját portján figyel, és kinyeri az adatokat a beérkező datagramokból.
Az UDP nem végez torlódásvezérlést — az alkalmazás a hálózat által támogatott maximális sebességgel küldhet datagramokat. Ez a csatorna túlterheléséhez vezethet, de valós idejű forgatókönyvek esetén az ilyen agresszivitás indokolt: egy videohívásnál fontosabb az adatfolyam az esetleges veszteségekkel, mint az adatátvitel leállítása.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
A példában egy SOCK_DGRAM socket jön létre az UDP számára. A sendto metódus kapcsolat létrehozása nélkül küldi el a datagramot — elég ismerni a fogadó IP-címét és portját. A recvfrom metódus a szerver oldalon mind az adatokat, mind a feladó címét visszaadja a válaszhoz. Az UDP socketek mobilos platformokon hasonlóan konfigurálhatók, de további engedélyeket igényelnek: iOS-en hozzá kell adni az NSAppTransportSecurity-t a titkosítatlan UDP kapcsolatokhoz, Androidon pedig az INTERNET engedélyt a manifestben.
Az UDP választása olyan forgatókönyvekben indokolt, ahol a sebesség fontosabb a megbízhatóságnál. A protokoll nem veszteget időt kapcsolatépítésre, visszaigazolásokra és újraküldésekre — ez minimális késleltetést biztosít, de megköveteli a fejlesztőtől a veszteségek önálló kezelését.
| Előnyök | Hátrányok |
|---|---|
| Alacsony késleltetés — nincs handshake | Nincs kézbesítési garancia |
| Kisebb fejléc — 8 bájt | Nincs torlódásvezérlés |
| Broadcast és multicast támogatás | Csomagok duplikálódhatnak |
| Datagramok függetlensége — nincsenek sorok | A datagram mérete korlátozott az MTU által |
Mobilalkalmazásokban az UDP-t olyan keretrendszereken keresztül használják, mint a WebRTC, amelyek az UDP fölé veszteségvezérlést, adaptív bitsebességet és jitter puffert adnak. Ez a sebesség előnyeit nyújtja a nyers protokoll hátrányai nélkül.
Az UDP másik fontos aspektusa a torlódásvezérlés hiánya. A TCP-ben a Slow Start és Congestion Avoidance algoritmusok csökkentik az átviteli sebességet csomagvesztés esetén, hogy ne terheljék túl a hálózatot. Az UDP nem rendelkezik ilyen mechanizmusokkal, ezért a fejlesztőknek saját sebességvezérlési stratégiákat kell implementálniuk — például adaptív bitsebességet videohívásokban vagy sebességkorlátozást játékszervereken a hálózati csatorna túlzott túlterhelésének megelőzésére.
Az UDP nélkülözhetetlen olyan forgatókönyvekben, ahol a késleltetési tolerancia fontosabb, mint a csomagvesztési tolerancia. Vizsgáljuk meg a protokoll fő alkalmazási területeit a mobil- és webfejlesztésben.
Az RTP és RTSP protokollok, amelyek az UDP felett működnek, valós idejű audio- és videófolyamok továbbítására szolgálnak. WebRTC — a böngészők és mobilalkalmazások videohívásainak szabványa — az UDP-t használja fő szállítási csatornaként a médiaadatokhoz, a TCP-t pedig a jelzéshez. Egyetlen csomag elvesztése egy 30 fps-es videóban észrevehetetlen a felhasználó számára, ellentétben az újraküldés késleltetésével, amely a kép észrevehető lefagyását okozza.
A többjátékos lövöldözős játékok és MOBA-k 50 ms-nál kisebb késleltetést igényelnek a megfelelő szinkronizációhoz. UDP gyorsabban továbbítja a játékosok pozícióit, lövéseit és eseményeit, mint a TCP, a csomagvesztést pedig egyszerűen figyelmen kívül hagyják — a következő frissítés 16–33 ms múlva érkezik. A népszerű játékmotorok, beleértve az Unity-t és az Unreal Engine-t, az UDP-t saját szállítási rétegeiken keresztül használják, megbízhatóságot adva a kritikus eseményekhez alkalmazási szintű visszaigazolásokkal.
A DNS-lekérdezések az UDP-t használják a 53-as porton, mivel minden lekérdezés egy kis datagram (általában 512 bájtig). Ha nem érkezik válasz, az ügyfél egyszerűen megismétli a lekérdezést időtúllépés után, ami gyorsabb, mint egy TCP-kapcsolat létrehozása a háromlépéses kézfogással. DHCP szintén UDP felett működik, mivel az ügyfélnek még nincs IP-címe, és nem tud TCP-kapcsolatot létesíteni, a broadcast UDP-csomagok pedig lehetővé teszik a DHCP-szerver megtalálását a helyi hálózaton.
Az UDP és TCP közötti választás kompromisszum a sebesség és a megbízhatóság között. Minden protokoll optimális a saját feladatköréhez, és különbségeik megértése segít a helyes architekturális döntések meghozatalában a mobilalkalmazások hálózati interakcióinak tervezésekor.
| Szempont | UDP | TCP |
|---|---|---|
| Kapcsolat létesítése | Nem szükséges | Háromlépéses kézfogás |
| Fejléc | 8 bájt | 20–60 bájt |
| Kézbesítési garancia | Nem | Igen, visszaigazolással |
| Sorrendezés | Nem | Igen |
| Torlódásvezérlés | Nem | Igen (AIMD, Slow Start) |
| Alkalmazás | Streaming, játékok, DNS | Web, e-mail, fájlok, API |
Mobil projektekben gyakran hibrid megközelítést alkalmaznak: TCP a megbízható kérésekhez (hitelesítés, adatbetöltés) és UDP a médiafolyamokhoz. QUIC — a modern Google protokoll, amely UDP felett működik — egyesíti az UDP sebességét a TCP megbízhatóságával, és már használatos a HTTP/3-ban.
Vizsgáljuk meg egy egyszerű UDP szervert Pythonban, amely üzeneteket fogad az ügyfelektől és válaszokat küld. A szerver a 8888-as porton figyel, és a beérkező datagramokat egy végtelen ciklusban dolgozza fel.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP szerver elindult a 8888-as porton')
while True:
data, addr = server.recvfrom(1024)
print(f'Fogadva erről: {addr}: {data.decode()}')
server.sendto(b'OK', addr)
A szerver létrehoz egy UDP socketet, bindol a 8888-as porthoz, és várja a beérkező datagramokat. recvfrom visszaadja az adatokat és az ügyfél címét, lehetővé téve a választ sendto segítségével. A TCP-vel ellentétben a szerver nem tárolja a kapcsolat állapotát — minden datagram függetlenül kerül feldolgozásra. Ez skálázhatóvá teszi az UDP szervereket: egyetlen szerver milliónyi ügyfelet képes kiszolgálni anélkül, hogy memóriát foglalna minden egyes kapcsolathoz, ami fontos a DNS szerverek és játék matchmaking rendszerek számára.
Mobilfejlesztésben az UDP-t gyakran magas szintű könyvtárakon keresztül használják. Például a CocoaAsyncSocket iOS-hez UDP socketeket biztosít delegáltakkal és GCD-vel az aszinkron eseményfeldolgozáshoz. Androidon a DatagramSocket osztály a szabványos java.net könyvtár része, és nem igényel további függőségeket. A Flutter számára létezik az udp csomag, amely egyszerű felületet biztosít datagramok küldéséhez és fogadásához natív socketek konfigurálása nélkül.
Fontos megjegyezni, hogy sok mobil hálózat és vállalati tűzfal blokkolja az UDP forgalmat, különösen az 1024 feletti portokon. Ha alkalmazása UDP-t használ, gondoskodni kell TCP-re való visszaesésről vagy a protokoll elérhetőségének ellenőrzéséről STUN szervereken keresztül, ahogyan a WebRTC teszi. iOS-en a rendszer Network.framework keretrendszere NWConnection-nel támogatja mind a TCP-t, mind az UDP-t, automatikusan kiválasztva az optimális protokollt az elérhetőség alapján. Valós idejű alkalmazásokhoz adaptív bitsebesség bevezetése is ajánlott, amely csökkenti a folyam minőségét csomagvesztés esetén, biztosítva a lejátszás folytonosságát még instabil, magas hibaszintű csatornákon is.
Gyakran ismételt kérdések
Az UDP nem hoz létre kapcsolatot és nem garantálja a csomagok kézbesítését, ami gyorsabbá teszi a TCP-nél. UDP fejléc — 8 bájt szemben a TCP 20–60 bájtjával. UDP streaminghez és játékokhoz alkalmas, TCP — webes kérésekhez és fájlátvitelhez.
A datagram — egy független adatcsomag UDP fejléccel (forrásport, célport, hossz, ellenőrző összeg). Minden datagram függetlenül kerül feldolgozásra, kapcsolat nélkül az előzőekkel. A datagram mérete korlátozott a hálózat MTU-ja által, és specifikáció szerint akár 65507 bájt is lehet.
Az UDP nem biztosít megbízhatóságot a szállítási rétegben — azt az alkalmazás implementálja. A fejlesztők sorszámokat, ellenőrző összegeket, ismételt kéréseket és hibajavítást adnak hozzá. FEC (Forward Error Correction) lehetővé teszi az elveszett csomagok helyreállítását újraküldés nélkül.
Az UDP nem alkalmas olyan forgatókönyvekhez, ahol az adatintegritás kritikus: fájlátvitel, banki tranzakciók, REST-API. Ezekben az esetekben a TCP garantálja, hogy minden bájt a megfelelő sorrendben érkezik meg. Az UDP instabil, magas veszteségi szintű csatornákon sem ajánlott.
A QUIC — egy szállítási protokoll, amely UDP felett működik, a Google fejlesztette és az IETF szabványosította RFC 9000-ként. Egyesíti az UDP sebességét a TCP megbízhatóságával, támogatja a blokkolás nélküli multiplexelést és a beépített titkosítást. HTTP/3 a QUIC-et használja szállítási rétegként.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is