# User Datagram Protocol

Le User Datagram Protocol (UDP, en français protocole de datagramme utilisateur) est un des principaux protocoles de télécommunication utilisés par Internet. Il fait partie de la couche transport du modèle OSI, quatrième couche de ce modèle, comme TCP. Il a été défini en 1980 par David P. Reed (en) et est détaillé dans la RFC 768.
Le rôle de ce protocole est de permettre la transmission de données (sous forme de datagrammes) de manière très simple entre deux entités, chacune étant définie par une adresse IP et un numéro de port. Aucune communication préalable n'est requise pour établir la connexion, au contraire de TCP (qui utilise le procédé de handshaking). UDP utilise un mode de transmission sans connexion.
L'intégrité des données est assurée par une somme de contrôle sur l'en-tête. L'utilisation de cette somme est cependant facultative en IPv4 mais obligatoire avec IPv6. Si un hôte n'a pas calculé la somme de contrôle d'un datagramme émis, la valeur de celle-ci est fixée à zéro. La somme de contrôle inclut également les adresses IP de la source et de la destination.
À cause de l'absence du mécanisme d'établissement de liaison (handshaking), ce protocole expose le programme qui l'utilise aux problèmes éventuels de fiabilité du réseau ; ainsi, il n'existe pas de garantie de protection quant à la livraison, l'ordre d'arrivée, ou la duplication éventuelle des datagrammes. Si des fonctionnalités de correction d'erreur sont requises, alors une application peut se tourner vers les protocoles TCP ou SCTP qui sont conçus à cet effet. UDP est donc adapté à un usage pour lequel la détection et la correction d'erreurs ne sont pas nécessaires, ou sont effectuées directement par l'application.
La nature du protocole UDP le rend utile pour transmettre rapidement de petites quantités de données, depuis un serveur vers de nombreux clients ou bien dans des cas où la perte éventuelle d'un datagramme est préférée à l'attente de sa retransmission. Le DNS, la voix sur IP ou les jeux en ligne sont des utilisations typiques de ce protocole.

## Propriétés

UDP est un protocole de la couche de transport documenté dans la RFC 768. Il ne fournit pas de garantie au protocole de la couche supérieure quant à la livraison du message. De plus, la couche UDP ne retient pas d'information quant à l'état des messages UDP une fois envoyés. Pour ces raisons, on désigne UDP comme un protocole de transmission non fiable.
Une liste de propriétés rendent UDP particulièrement adapté à certaines applications.
* Il est orienté transaction, et donc adapté aux protocoles simples de type requête-réponse tels le DNS ou le NTP.
* Il fournit des datagrammes, utiles pour modéliser d'autres protocoles tel que le tunnelage IP (en) ou le Remote procedure call, ainsi que le Network File System.
* Il est très simple, ce qui le rend adapté pour l'amorçage d'une machine cliente depuis le réseau (bootstrapping) ou d'autres usages sans pile de protocoles complète, tels DHCP et le protocole simplifié de transferts de fichiers (TFTP).
* Il est dit sans état, ce qui est utile dans des cas où de nombreux clients sont présents, telles les applications de streaming (La télévision IP, par exemple).
* L'absence de délai de retransmission en fait un protocole utile pour les applications en temps réel. Quelques exemples de ces applications sont la voix sur IP, les jeux en ligne, et de nombreux protocoles construits sur base du Real Time Streaming Protocol.
* Il fonctionne efficacement dans des communications unidirectionnelles et est donc adapté pour diffuser des informations comme dans le service discovery (en) ou le protocole d'information de routage.

## Structure d'un datagramme UDP

Le paquet UDP est encapsulé dans un paquet IP. Il comporte un en-tête suivi des données proprement dites à transporter.
| En-tête IP | En-tête UDP | Données |
L'en-tête d'un datagramme UDP est plus simple que celui de TCP :
| Port Source (16 bits) | Port Destination (16 bits) | Longueur (16 bits) | Somme de contrôle (16 bits) | Données (longueur variable) | Données (longueur variable) |
Il contient les quatre champs suivants :

### Port Source

    indique depuis quel port le paquet a été envoyé.

### Port de Destination

    indique à quel port le paquet doit être envoyé.

### Longueur

    indique la longueur totale (exprimée en octets) du segment UDP (en-tête et données). La longueur minimale est donc de 8 octets (taille de l'en-tête).

### Somme de contrôle

    celle-ci permet de s'assurer de l'intégrité du paquet reçu quand elle est différente de zéro. Elle est calculée sur l'ensemble de l'en-tête UDP et des données, mais aussi sur un pseudo en-tête (extrait de l'en-tête IP) Note : la présence de ce pseudo en-tête, interaction entre les deux couches IP et UDP, est une des raisons qui font que le modèle TCP/IP ne s'applique pas parfaitement au modèle OSI.
La table suivante décrit les champs utilisés pour le calcul de la somme de contrôle UDP sur IPv4 (les indices négatifs correspondent au pseudo en-tête IP) :
| + | Bits 0 - 7 | Bits 0 - 7 | Bits 0 - 7 | Bits 0 - 7 | Bits 0 - 7 | Bits 0 - 7 | Bits 0 - 7 | Bits 0 - 7 | 8 - 15 | 8 - 15 | 8 - 15 | 8 - 15 | 8 - 15 | 8 - 15 | 8 - 15 | 8 - 15 | 16 - 23 | 16 - 23 | 16 - 23 | 16 - 23 | 16 - 23 | 16 - 23 | 16 - 23 | 16 - 23 | 24 - 31 | 24 - 31 | 24 - 31 | 24 - 31 | 24 - 31 | 24 - 31 | 24 - 31 | 24 - 31 |
| -96 | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source | Adresse Source |
| -64 | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination | Adresse Destination |
| -32 | Zéros | Zéros | Zéros | Zéros | Zéros | Zéros | Zéros | Zéros | Protocole | Protocole | Protocole | Protocole | Protocole | Protocole | Protocole | Protocole | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP | Taille UDP |
| 0 | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Source | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination | Port Destination |
| 32 | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Longueur | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle | Somme de contrôle |
| 64 | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données | Données |
Le numéro de protocole assigné à UDP est le 17 (décimal).

## Utilisation

Il est utilisé quand il est nécessaire soit de transmettre des données très rapidement, et où la perte d'une partie de ces données n'a pas grande importance, ce sont surtout les cas où les requêtes vont dans les deux sens (de client à serveur et inversement) en direct. Soit de transmettre des petites quantités de données, là où la connexion « 3-WAY » TCP serait inutilement coûteuse en ressources.
Par exemple, dans le cas de la transmission de la voix sur IP, la perte occasionnelle d'un paquet est tolérable dans la mesure où il existe des mécanismes de substitution des données manquantes, par contre la rapidité de transmission est un critère primordial pour la qualité d'écoute.
Il est également utilisé pour émettre des données à plusieurs récepteurs simultanément (multicast, broadcast), la connexion TCP n'étant que point-à-point.
Exemples d'utilisation :
* Les protocoles DHCP/BOOTP, DNS, SNMP, TFTP, xPL
* Le streaming ;
* Les jeux en réseau (exemple : jeux de tir à la première personne) ;
* Visioconférences, Appel vidéo (Zoom, Skype etc.)