User Datagram Protocol
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).
Alguns protocols d'aplicació habituals basats als datagrames UDP són:
Descripció tècnicaUser 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. PortsUDP 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 congestionsLes 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 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 TCPUDP: 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. AplicacionsMentre 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 veuUDP é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é |