User Datagram Protocol

User Datagram Protocol (UDP) és un protocol del nivell de transport del model OSI, basat en l'intercanvi de datagrames. UDP permet l'enviament de datagrames a través d'una xarxa sense que s'hagi establert prèviament una connexió, ja que el mateix datagrama incorpora suficient informació d'adreçament a la seva capçalera. Tampoc té control ni confirmació del flux, per tant els paquets es poden avançar els uns als altres. Tampoc no se sap si els paquets han arribat correctament, ja que no té cap confirmació d'entrega o recepció. El fet que no s'hagin de reconèixer tots els paquets rebuts (mitjançant ACK, és a dir, justificant de recepció), suposa un estalvi de dades (menys overhead) que el fa més àgil que altres protocols del mateix nivell de transport orientats a connexió, com és el cas de TCP. És per això que s'acostuma a fer servir quan és més important la rapidesa que la fiabilitat. Per exemple, per transmetre veu o vídeo, aplicacions on resulta més important transmetre amb velocitat que garantir el fet que arribin absolutament tots els bytes.
És també útil per a servidors que responen petites consultes d'un gran nombre de clients. A diferència de TCP, és compatible amb la difusió de paquets.
S'acostuma a fer servir per protocol DNS, DHCP, SNMP, NTP, BOOTP, TFTP i més, fins i tot per a alguns jocs amb connexió en línia.

La capçalera UDP consta de 4 camps. L'ús de dos d'ells és opcional en IPv4 (fons de color rosa en el quadre). En IPv6 només el port d'origen és opcional (vegeu més endavant).

 Port d'origen: Aquest camp identifica el port d'enviament quan significativa i s'ha d'assumir que el port de respondre a si és necessari. Si no s'utilitza, aleshores hauria de ser zero. Si el host d'origen és el client, el número de port és probable que sigui un número de port efímer. Si el host d'origen és el servidor, el número de port és probable que ja el coneguem.

 Port de destinació: Aquest camp identifica el port de destinació i és necessari. Amb aquest port passa el mateix que amb el port d'origen, si el client és el host de destí, probablement el port serà un número de port efímer i si el host de destí és el servidor, llavors el número de port probablement ja el coneguem.

 Longitud: Un camp de 16 bits que especifica la longitud en bytes del datagrama complet: capçalera i les dades. La longitud mínima és de 8 bytes, ja que és la longitud de la capçalera. La mida del camp estableix un límit teòric de 65.535 bytes (capçalera de 8 bytes + 65527 bytes de dades) d'un datagrama UDP. El límit pràctic per a la longitud de dades que ve imposada pel protocol IPv4 subjacent és 65.507 bytes.

 Checksum: El camp de control de 16 bits s'utilitza per a la comprovació d'errors de la capçalera i les dades. L'algorisme per calcular la suma de comprovació és diferent per al transport i la cita sobre IPv4 IPv6. Si la suma de comprovació s'ha omès en IPv4, el camp utilitza el valor de tots els zeros. Aquest camp no és opcional per a IPv6.

Alguns protocols d'aplicació habituals basats als datagrames UDP són:
 Protocol de configuració dinàmica de host (DHCP)
 Servei de noms de domini (DNS)
 Protocol d'hora de xarxa (NTP)
 Protocol trivial de transferència de fitxers (TFTP)

Descripció tècnica 
User Datagram Protocol (UDP) és un protocol mínim de nivell de transport orientat a missatges documentat en el RFC 768 de la IETF.

En la família de protocols d'Internet, UDP proporciona una senzilla interfície entre la capa de xarxa i la capa d'aplicació. UDP no atorga garanties per a l'entrega dels seus missatges i l'origen UDP no reté estats dels missatges UDP que han estat enviats a la xarxa. UDP només afegeix multiplexat d'aplicació i suma de verificació de la capçalera i la càrrega útil. Qualsevol tipus de garanties per la transmissió de la informació han de ser implementades en capes superiors.

Ports 
UDP utilitza ports per permetre la comunicació entre aplicacions. El camp de port té una longitud de 16 bits, de manera que el rang de valors vàlids va de 0 a 65.535. El port 0 està reservat, però és un valor permès com a port origen si el procés emissor no espera rebre missatges com a resposta.

Els ports de l'1 al 1023 s'anomenen ports "ben coneguts" i en sistemes operatius tipus Unix enllaçar amb un d'aquests ports requereix accés com a root.

Els ports del 1024 al 49151 són ports registrats.

Els ports del 49.152 al 65.535 són ports efímers i són utilitzats com a ports temporals, sobretot pels clients en comunicar-se amb els servidors.

Fiabilitat i solucions al control de congestions 
Les aplicacions UDP generalment han d'acceptar pèrdua, errors o duplicació de paquets. Algunes aplicacions com TFTP poden afegir mecanismes rudimentaris de fiabilitat a la capa d'aplicació si cal.
Més comunament, les aplicacions UDP no fan servir mecanismes de fiabilitat i fins i tot els hi poden fer nosa. Aplicacions de Streaming, jocs amb multi-jugadors en temps real i VoIP (veu sobre IP) són exemples d'aplicacions que sovint usen UDP. En aquestes aplicacions en particular la pèrdua de paquets generalment no és un problema fatal. Si una aplicació requereix un alt grau de fiabilitat, un protocol com el TCP s'hauria de fer servir en comptes de UDP.

Al contrari que TCP, les aplicacions basades en UDP no tenen necessàriament bons mecanismes de control ni per evitar congestions de xarxa. Aplicacions UDP que consumeixen una gran part de l'amplada de banda disponible podrien fer perillar l'estabilitat de la 'Internet, ja que freqüentment provoquen una càrrega que és inelàstica. Mecanismes basats en xarxa han estat proposats per minimitzar els efectes potencials del col·lapse per grans càrregues UDP incontrolades.
Elements de xarxa com encaminadors que fan servir encuament de paquets i tècniques per descartar són sovint l'única eina disponible per reduir el tràfic excessiu UDP.

Comparativa entre protocol UDP i TCP 
UDP: Proporciona un nivell de transport no fiable de datagrames, ja que afegeix poca informació necessària per a la comunicació extrem a extrem del paquet que envia al nivell inferior. s'utilitzen aplicacions com NFS (Network File System) i RCP (comandes per copiar fitxers entre ordinadors remots), però sobretot s'utilitza en tasques de control i en la transmissió d'àudio i vídeo a través d'una xarxa. No introdueix retards per establir una connexió, no manté l'estat de connexió algun i no realitza seguiment d'aquests paràmetres. Així, un servidor dedicat a una aplicació particular pot suportar més clients actius quan l'aplicació corre sobre UDP en lloc de sobre TCP.

TCP: És el protocol que proporciona un transport més fiable de flux de bits entre aplicacions. Està pensat per poder enviar grans quantitats d'informació de manera fiable, alliberant el programador de la dificultat de gestionar la fiabilitat de la connexió (retransmissions, pèrdues de paquets, duplicació de paquets)que gestiona el mateix protocol. Però la complexitat de la gestió de la fiabilitat té un cost en eficiència, ja que per portar les gestions anteriors cal afegir gran quantitat d'informació als paquets que envia. A causa del fet que els paquets per enviar tenen una mida màxima, com més informació afegeix el protocol per la seva gestió, menys informació provindrà de l'aplicació. El segment TCP té una sobrecàrrega de 20 bytes en cada segment, mentre que UDP només hi afegeix 8 bytes. Per això, quan és més important la velocitat que la fiabilitat, s'utilitza UDP. En canvi, TCP assegura la recepció en destí de la informació per transmetre.

Aplicacions 
Mentre que la quantitat total de trànsit UDP trobat en una xarxa típica sol ser de l'ordre de només un petit percentatge, nombroses aplicacions clau d'Internet utilitzen UDP, incloent-hi: el Domain Name System (DNS), on les consultes ha de ser ràpides i només consisteix en una petició única seguida d'un paquet de resposta única, el Simple Network Management Protocol (SNMP), el Dynamic Host Configuration Protocol (DHCP) i el Routing Information Protocol (RIP).

Trànsit de veu i de vídeo es transmeten generalment usant UDP. El vídeo en temps real i els protocols de streaming d'àudio estan dissenyats per manejar ocasionals paquets perduts, en lloc de grans paquets de retards en cas de pèrdua de paquets retransmesos. Com que tots dos TCP i UDP s'executen en la mateixa xarxa, moltes empreses estan descobrint un recent augment en el tràfic UDP d'aquestes aplicacions en temps real està obstaculitzant el desenvolupament de les aplicacions que utilitzen TCP, com a punt de venda, comptabilitat i sistemes de base de dades.

Quan detecta la pèrdua de paquets TCP, és portat cap enrere el seu "data rate usage". El desenvolupament de la qualitat per a les solucions del servei és crucial atès que les aplicacions de negoci són importants per a les empreses.

Transmissió de vídeo i veu 
UDP és generalment el protocol usat en la transmissió de vídeo i veu a través d'una xarxa. Això és perquè no hi ha temps per enviar de nou paquets perduts quan s'està escoltant algú o veient un vídeo en temps real (un petit sacrifici per tal de no repercutir en la sensació de 'temps real' de cara a l'usuari).

Ja que tant TCP com UDP circulen per la mateixa xarxa, en molts casos passa que l'augment del trànsit UDP danya el correcte funcionament de les aplicacions TCP. Per defecte, TCP passa a un segon lloc per deixar les dades en temps real utilitzar la major part de l'amplada de banda. El problema és que tots dos són importants per a la major part de les aplicacions, de manera que trobar l'equilibri entre ambdós és crucial (aquí és on es veu l'eficiència d'un programa o aplicació).

Codi d'exemple (Python 3.x) 
El següent codi d'exemple mostra com utilitzar el protocol UDP per una comunicació client/servidor:

Servidor:
import socketserver
print("Servidor iniciant...")
class MyUDPHandler(socketserver.BaseRequestHandler):
 def handle(self):
 data = self.request[0].strip()
 socket = self.request[1]
 print("%s Ha escrit:" % self.client_address[0])
 print(data)
 socket.sendto(data.upper(), self.client_address)
if __name__ == "__main__":
 HOST, PORT = "localhost", 9999
 server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
 server.serve_forever()

Client (Canvia "localhost" per l'adreça IP del servidor):
import socket
import sys
print("Client iniciant...")
HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
received = sock.recv(1024)

print("Enviat: %s" % data)
print("Rebut: %s" % received)

Codi d'exemple (C++) 
El següent codi mostra com es pot utilitzar el protocol UDP per una comunicació client/servidor:

Servidor:
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")

const int BufLen = 1024;

int main()
{
 	WSADATA wsaData;
 	SOCKET RecvSocket;
 	sockaddr_in RecvAddr;
 	int Puerto = 2345;
 	char RecvBuf[BufLen];
 	sockaddr_in SenderAddr;
 	int SenderAddrSize = sizeof(SenderAddr);
 	WSAStartup(MAKEWORD(2,2), &wsaData);
 	RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 	RecvAddr.sin_family = AF_INET;
 	RecvAddr.sin_port = htons(Puerto);
 	RecvAddr.sin_addr.s_addr = INADDR_ANY;
 	bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
 	recvfrom(RecvSocket,RecvBuf, BufLen,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);
	printf("%s\n",RecvBuf);
 	closesocket(RecvSocket);
 	WSACleanup();
}

Client (Canvia "127.0.0.1" per l'adreça IP del servidor):

#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
	WSADATA wsaData;
 	SOCKET SendSocket;
 	sockaddr_in RecvAddr;
	int Puerto = 2345;
 	char ip[] = "127.0.0.1";
 	char SendBuf[] = "Hola!!!!";
 	WSAStartup(MAKEWORD(2,2), &wsaData);
 	SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 	RecvAddr.sin_family = AF_INET;
 	RecvAddr.sin_port = htons(Puerto);
 	RecvAddr.sin_addr.s_addr = inet_addr(ip);
 	sendto(SendSocket,SendBuf,strlen(SendBuf)+1,0,(SOCKADDR *) &RecvAddr,sizeof(RecvAddr));
 	WSACleanup();
}

Vegeu també 
 Transmission Control Protocol
 Protocol d'Internet
 Protocol de comunicació

Protocols de xarxa