UDP (User Datagram Protocol) — протокол за пренос података без успостављања везе, који ради преко IP-а и обезбеђује минимално кашњење при слању датаграма. За разлику од TCP-а, UDP не гарантује испоруку, редослед пакета или заштиту од дуплирања. Према подацима IETF RFC 768 (2024), UDP обрађује више од 40% светског интернет саобраћаја захваљујући видео позивима, стримингу и DNS упитима.
Главне тачке
UDP (User Datagram Protocol) — један од кључних протокола транспортног слоја TCP/IP модела, који је развио Дејвид Рид 1980. године. Он пружа минимални механизам за пренос података: апликација шаље датаграм, а протокол не прати да ли је стигао до примаоца.
Заглавље UDP-а се састоји од само четири поља: изворни порт, одредишни порт, дужина и контролна сума. Свако поље заузима 2 бајта, тако да је укупна величина заглавља 8 бајтова. За поређење, TCP заглавље без опција заузима 20 бајтова, а са опцијама — до 60 бајтова.
Протокол не подржава фрагментацију на свом нивоу — ако датаграм премашује MTU (Maximum Transmission Unit), фрагментира се на IP нивоу. При губитку једног фрагмента, цео датаграм се одбацује, јер UDP не може да захтева поновно слање појединачних фрагмената. Програмери морају да контролишу величину датаграма — за мобилне мреже MTU је често 1400 бајтова, тако да максимална величина не би требало да прелази ову вредност.
Апликација која користи UDP креира сокет типа SOCK_DGRAM, наводи порт и одредишну IP адресу и шаље датаграм. Протокол додаје минимално заглавље и прослеђује пакет IP слоју. Прималац ослушкује свој порт и издваја податке из пристиглих датаграма.
UDP не врши контролу загушења — апликација може да шаље датаграме максималном брзином коју мрежа подржава. То може довести до преоптерећења канала, али у сценаријима реалног времена таква агресивност је оправдана: за видео позив је важнији ток података са могућим губицима него заустављање преноса.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
У примеру се креира сокет SOCK_DGRAM за UDP. Метода sendto шаље датаграм без успостављања везе — довољно је знати IP и порт примаоца. Метода recvfrom на страни сервера враћа и податке и адресу пошиљаоца за одговор. UDP сокети на мобилним платформама се конфигуришу слично, али захтевају додатне дозволе: на iOS-у је потребно додати NSAppTransportSecurity за нешифроване UDP везе, а на Android-у — дозволу INTERNET у манифесту.
Избор UDP-а је оправдан у сценаријима где је брзина критичнија од поузданости. Протокол не троши време на успостављање везе, потврде и поновна слања — то даје минимално кашњење, али захтева од програмера самостално руковање губицима.
| Предности | Недостаци |
|---|---|
| Мало кашњење — без handshake-а | Нема гаранције испоруке |
| Мање заглавље — 8 бајтова | Нема контроле загушења |
| Подршка за broadcast и multicast | Могући дупликати пакета |
| Независност датаграма — без редова | Величина датаграма ограничена MTU-ом |
У мобилним апликацијама UDP се примењује кроз фрејмворке попут WebRTC-а, који додају преко UDP-а контролу губитака, адаптивни битрејт и jitter бафер. Ово даје предности брзине без недостатака сировог протокола.
Још један важан аспект UDP-а је одсуство контроле загушења. У TCP-у, алгоритми Slow Start и Congestion Avoidance смањују брзину преноса при губитку пакета како не би преоптеретили мрежу. UDP нема такве механизме, па програмери морају да имплементирају сопствене стратегије контроле брзине — на пример, адаптивни битрејт у видео позивима или rate limiting на серверима игара ради спречавања прекомерног оптерећења мрежног канала.
UDP је незаменљив у сценаријима где је толеранција на кашњење важнија од толеранције на губитак пакета. Размотримо главне области примене протокола у мобилном и веб развоју.
Протоколи RTP и RTSP, који раде преко UDP-а, користе се за пренос аудио и видео токова у реалном времену. WebRTC — стандард за видео позиве у прегледачима и мобилним апликацијама — користи UDP као главни транспорт за медијске податке, а TCP за сигнализацију. Губитак једног пакета у видеу од 30 fps је неприметан за корисника, за разлику од кашњења поновног слања које изазива приметно замрзавање слике.
Вишекорисничке пуцачине и MOBA захтевају кашњење мање од 50 ms за правилну синхронизацију. UDP преноси позиције играча, пуцњеве и догађаје брже од TCP-а, а губитак пакета се једноставно игнорише — следеће ажурирање ће стићи за 16–33 ms. Популарни гејм енџини, укључујући Unity и Unreal Engine, користе UDP кроз сопствене транспортне слојеве са додавањем поузданости за критичне догађаје путем потврда на нивоу апликације.
DNS упити користе UDP на порту 53, јер је сваки упит један мали датаграм (обично до 512 бајтова). Ако одговор не стигне, клијент једноставно понавља упит након тајм-аута, што је брже од успостављања TCP везе са трофазним руковањем. DHCP такође ради преко UDP-а, јер клијент још увек нема IP адресу и не може да успостави TCP везу, а broadcast UDP пакети омогућавају проналажење DHCP сервера у локалној мрежи.
Избор између UDP-а и TCP-а је компромис између брзине и поузданости. Сваки протокол је оптималан за своју класу задатака, а разумевање њихових разлика помаже у доношењу правих архитектонских одлука при пројектовању мрежне интеракције у мобилним апликацијама.
| Критеријум | UDP | TCP |
|---|---|---|
| Успостављање везе | Није потребно | Трофазно руковање |
| Заглавље | 8 бајтова | 20–60 бајтова |
| Гаранција испоруке | Не | Да, са потврдом |
| Поређење | Не | Да |
| Контрола загушења | Не | Да (AIMD, Slow Start) |
| Примена | Стриминг, игре, DNS | Веб, имејл, фајлови, API |
У мобилним пројектима се често користи хибридни приступ: TCP за поуздане захтеве (ауторизација, учитавање података) и UDP за медијске токове. QUIC — савремени Google протокол који ради преко UDP-а — комбинује брзину UDP-а са поузданошћу TCP-а и већ се користи у HTTP/3.
Размотримо једноставан UDP сервер у Python-у који прима поруке од клијената и шаље одговоре. Сервер ослушкује порт 8888 и обрађује пристигле датаграме у бесконачној петљи.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP сервер је покренут на порту 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'Примљено од {addr}: {data.decode()}')
server.sendto(b'OK', addr)
Сервер креира UDP сокет, везује се за порт 8888 и чека пристигле датаграме. recvfrom враћа податке и адресу клијента, што омогућава одговор путем sendto. За разлику од TCP-а, сервер не чува стање везе — сваки датаграм се обрађује независно. То чини UDP сервере скалабилним: један сервер може да обрађује милионе клијената без издвајања меморије за сваку појединачну везу, што је важно за DNS сервере и системе за мечмејкинг у играма.
У мобилном развоју, UDP се често користи преко библиотека високог нивоа. На пример, CocoaAsyncSocket за iOS пружа UDP сокетове са делегатима и GCD-ом за асинхрону обраду догађаја. На Android-у класа DatagramSocket је део стандардне библиотеке java.net и не захтева додатне зависности. За Flutter постоји пакет udp, који пружа једноставан интерфејс за слање и пријем датаграма без конфигурисања нативних сокетова.
Важно је напоменути да многе мобилне мреже и корпоративни фајерволови блокирају UDP саобраћај, посебно на портовима изнад 1024. Ако ваша апликација користи UDP, потребно је предвидети fallback на TCP или проверу доступности протокола путем STUN сервера, као што то ради WebRTC. На iOS-у системски фрејмворк Network.framework са NWConnection подржава и TCP и UDP, аутоматски бирајући оптимални протокол на основу доступности. За апликације реалног времена такође се препоручује имплементација адаптивног битрејта, који смањује квалитет тока при губитку пакета, обезбеђујући континуитет репродукције чак и на нестабилним каналима са високим нивоом грешака.
Често постављана питања
UDP не успоставља везу и не гарантује испоруку пакета, што га чини бржим од TCP-а. UDP заглавље — 8 бајтова насупрот 20–60 бајтова код TCP-а. UDP је погодан за стриминг и игре, TCP — за веб захтеве и пренос датотека.
Датаграм — самостални пакет података са UDP заглављем (изворни порт, одредишни порт, дужина, контролна сума). Сваки датаграм се обрађује независно, без везе са претходним. Величина датаграма је ограничена MTU-ом мреже и по спецификацији — до 65507 бајтова.
UDP не обезбеђује поузданост на транспортном нивоу — њу имплементира апликација. Програмери додају редне бројеве, контролне суме, поновне захтеве и корекцију грешака. FEC (Forward Error Correction) омогућава опоравак изгубљених пакета без поновног слања.
UDP није погодан за сценарије где је интегритет података критичан: пренос датотека, банкарске трансакције, REST-API. У овим случајевима TCP гарантује да ће сваки бајт стићи у правилном редоследу. UDP се такође не препоручује на нестабилним каналима са високим нивоом губитака.
QUIC — транспортни протокол који ради преко UDP-а, развијен од стране Google-а и стандардизован од IETF-а као RFC 9000. Он комбинује брзину UDP-а са поузданошћу TCP-а, подржава мултиплексирање без блокирања и уграђено шифровање. HTTP/3 користи QUIC као транспортни слој.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође