UDP (User Datagram Protocol) — ett protokoll för dataöverföring utan anslutningsupprättande, som arbetar över IP och ger minimal fördröjning vid sändning av datagram. Till skillnad från TCP garanterar UDP inte leverans, paketordning eller skydd mot dubblering. Enligt data från IETF RFC 768 (2024), hanterar UDP mer än 40% av världens internettrafik tack vare videosamtal, streaming och DNS-frågor.
Huvudpunkter
UDP (User Datagram Protocol) — ett av de viktigaste protokollen i transportlagret i TCP/IP-modellen, utvecklat av David Reed 1980. Det ger en minimal mekanism för dataöverföring: applikationen skickar ett datagram och protokollet spårar inte om det har nått mottagaren.
UDP-headern består av endast fyra fält: källport, destinationsport, längd och checksumma. Varje fält upptar 2 byte, så den totala headerstorleken är 8 byte. Som jämförelse upptar TCP-headern utan alternativ 20 byte och med alternativ — upp till 60 byte.
Protokollet stöder inte fragmentering på sin egen nivå — om ett datagram överskrider MTU (Maximum Transmission Unit) fragmenteras det på IP-nivå. Vid förlust av ett fragment kasseras hela datagrammet eftersom UDP inte kan begära återsändning av enskilda fragment. Utvecklare måste kontrollera datagramstorleken — för mobila nätverk är MTU ofta 1400 byte, så den maximala storleken bör inte överstiga detta värde.
En applikation som använder UDP skapar en socket av typen SOCK_DGRAM, anger port och destinations-IP-adress och skickar ett datagram. Protokollet lägger till en minimal header och överför paketet till IP-lagret. Mottagaren lyssnar på sin port och extraherar data från inkommande datagram.
UDP utför ingen överbelastningskontroll — applikationen kan skicka datagram med maximal hastighet som nätverket stöder. Detta kan leda till överbelastning av kanalen, men i realtidsscenarier är sådan aggressivitet motiverad: för ett videosamtal är en dataström med möjliga förluster viktigare än att stoppa överföringen.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
I exemplet skapas en socket SOCK_DGRAM för UDP. Metoden sendto skickar ett datagram utan anslutningsupprättande — det räcker att känna till mottagarens IP och port. Metoden recvfrom på serversidan returnerar både data och avsändarens adress för svar. UDP-sockets på mobila plattformar konfigureras på liknande sätt men kräver ytterligare behörigheter: på iOS måste NSAppTransportSecurity läggas till för okrypterade UDP-anslutningar och på Android — INTERNET-behörigheten i manifestet.
Valet av UDP är motiverat i scenarier där hastighet är viktigare än tillförlitlighet. Protokollet slösar inte tid på anslutningsupprättande, bekräftelser och återsändningar — detta ger minimal fördröjning men kräver att utvecklaren hanterar förluster självständigt.
| Fördelar | Nackdelar |
|---|---|
| Låg fördröjning — ingen handshake | Ingen leveransgaranti |
| Mindre header — 8 byte | Ingen överbelastningskontroll |
| Stöd för broadcast och multicast | Möjliga paketduplikat |
| Datagramoberoende — inga köer | Datagramstorlek begränsad av MTU |
I mobila applikationer används UDP genom ramverk som WebRTC, som lägger till förlustkontroll, adaptiv bithastighet och jitterbuffert ovanpå UDP. Detta ger hastighetsfördelar utan nackdelarna med råprotokollet.
En annan viktig aspekt av UDP är avsaknaden av överbelastningskontroll. I TCP minskar algoritmerna Slow Start och Congestion Avoidance överföringshastigheten vid paketförlust för att inte överbelasta nätverket. UDP har inga sådana mekanismer, så utvecklare måste implementera sina egna hastighetskontrollstrategier — till exempel adaptiv bithastighet i videosamtal eller begränsning av hastighet på spelservrar för att förhindra överdriven överbelastning av nätverkskanalen.
UDP är oumbärligt i scenarier där tolerans för fördröjning är viktigare än tolerans för paketförlust. Låt oss undersöka de huvudsakliga tillämpningsområdena för protokollet inom mobil- och webbutveckling.
Protokollen RTP och RTSP, som arbetar över UDP, används för att överföra ljud- och videoströmmar i realtid. WebRTC — standarden för videosamtal i webbläsare och mobilappar — använder UDP som huvudtransport för mediadata och TCP för signalering. Förlusten av ett enda paket i en 30 fps-video är omärkbar för användaren, till skillnad från fördröjningen av återsändning som orsakar en märkbar frysning av bilden.
Flerspelarspel och MOBA kräver en fördröjning på mindre än 50 ms för korrekt synkronisering. UDP överför spelarpositioner, skott och händelser snabbare än TCP, och paketförlust ignoreras helt enkelt — nästa uppdatering kommer inom 16–33 ms. Populära spelmotorer, inklusive Unity och Unreal Engine, använder UDP genom sina egna transportlager med tillägg av tillförlitlighet för kritiska händelser via bekräftelser på applikationsnivå.
DNS-frågor använder UDP på port 53 eftersom varje fråga är ett litet datagram (vanligtvis upp till 512 byte). Om inget svar kommer upprepar klienten helt enkelt frågan efter en timeout, vilket är snabbare än att upprätta en TCP-anslutning med dess trestegshandskakning. DHCP fungerar också över UDP eftersom klienten ännu inte har en IP-adress och inte kan upprätta en TCP-anslutning, och broadcast-UDP-paket gör det möjligt att hitta en DHCP-server i det lokala nätverket.
Valet mellan UDP och TCP är en kompromiss mellan hastighet och tillförlitlighet. Varje protokoll är optimalt för sin uppgiftsklass och att förstå deras skillnader hjälper till att fatta rätt arkitektoniska beslut vid design av nätverksinteraktion i mobila applikationer.
| Kriterium | UDP | TCP |
|---|---|---|
| Anslutningsupprättande | Krävs inte | Trestegshandskakning |
| Header | 8 byte | 20–60 byte |
| Leveransgaranti | Nej | Ja, med bekräftelse |
| Sortering | Nej | Ja |
| Överbelastningskontroll | Nej | Ja (AIMD, Slow Start) |
| Användning | Streaming, spel, DNS | Webb, e-post, filer, API |
I mobilprojekt används ofta en hybridmetod: TCP för tillförlitliga förfrågningar (autorisering, dataladdning) och UDP för mediaströmmar. QUIC — det moderna Google-protokollet som arbetar över UDP — kombinerar UDP:s hastighet med TCP:s tillförlitlighet och används redan i HTTP/3.
Låt oss titta på en enkel UDP-server i Python som tar emot meddelanden från klienter och skickar svar. Servern lyssnar på port 8888 och bearbetar inkommande datagram i en oändlig loop.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP-servern startad på port 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'Mottaget från {addr}: {data.decode()}')
server.sendto(b'OK', addr)
Servern skapar en UDP-socket, binder till port 8888 och väntar på inkommande datagram. recvfrom returnerar data och klientens adress, vilket möjliggör svar via sendto. Till skillnad från TCP lagrar servern inte anslutningsstatus — varje datagram bearbetas oberoende. Detta gör UDP-servrar skalbara: en server kan hantera miljontals klienter utan att allokera minne för varje enskild anslutning, vilket är viktigt för DNS-servrar och spel-matchmaking-system.
Inom mobilutveckling används UDP ofta via bibliotek på hög nivå. Till exempel CocoaAsyncSocket för iOS tillhandahåller UDP-sockets med delegater och GCD för asynkron händelsehantering. På Android är klassen DatagramSocket en del av standardbiblioteket java.net och kräver inga extra beroenden. För Flutter finns paketet udp som ger ett enkelt gränssnitt för att skicka och ta emot datagram utan att konfigurera native sockets.
Det är viktigt att notera att många mobila nätverk och företagsbrandväggar blockerar UDP-trafik, särskilt på portar över 1024. Om din applikation använder UDP måste du tillhandahålla en fallback till TCP eller kontroll av protokolltillgänglighet via STUN-servrar, som WebRTC gör. På iOS stöder systemramverket Network.framework med NWConnection både TCP och UDP och väljer automatiskt det optimala protokollet baserat på tillgänglighet. För realtidsapplikationer rekommenderas också att implementera adaptiv bithastighet som minskar strömkvaliteten vid paketförlust och säkerställer kontinuitet i uppspelningen även på instabila kanaler med hög felfrekvens.
Vanliga frågor
UDP upprättar ingen anslutning och garanterar inte paketleverans, vilket gör det snabbare än TCP. UDP-header — 8 byte jämfört med 20–60 byte hos TCP. UDP passar för streaming och spel, TCP — för webbförfrågningar och filöverföring.
Ett datagram är ett oberoende datapaket med en UDP-header (källport, destinationsport, längd, checksumma). Varje datagram bearbetas oberoende, utan koppling till tidigare. Datagramstorleken begränsas av nätverkets MTU och enligt specifikation — upp till 65507 byte.
UDP tillhandahåller inte tillförlitlighet på transportnivå — den implementeras av applikationen. Utvecklare lägger till sekvensnummer, checksummor, upprepade förfrågningar och felkorrigering. FEC (Forward Error Correction) gör det möjligt att återställa förlorade paket utan återsändning.
UDP är inte lämpligt för scenarier där dataintegritet är kritisk: filöverföring, banktransaktioner, REST-API. I dessa fall garanterar TCP att varje byte anländer i rätt ordning. UDP rekommenderas inte heller på instabila kanaler med hög förlustnivå.
QUIC — ett transportprotokoll som fungerar över UDP, utvecklat av Google och standardiserat av IETF som RFC 9000. Det kombinerar UDP:s hastighet med TCP:s tillförlitlighet, stöder multiplexering utan blockering och inbyggd kryptering. HTTP/3 använder QUIC som transportlager.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också