4.3. Compression de l'en-tête UDP
Ce document définit un format de compression pour les en-têtes UDP utilisant LOWPAN_NHC. Le format de compression UDP est indiqué à la Figure 14. Les bits 0 à 4 représentent l'ID NHC et '11110' indique le codage de compression d'en-tête UDP spécifique défini dans cette section.
4.3.1. Compression des ports UDP
Cette spécification permet de compresser une plage particulière de numéros de ports (0xf0b0 à 0xf0bf) à 4 bits. Il s'agit d'une compression sans état héritée de la [RFC4944], par opposition à une nouvelle compression avec état.
La plage de ports compressible à 4 bits n'est pas dans une plage réservée. Une implémentation de pile réseau conçue pour communiquer sur un 6LoWPAN devrait éviter d'utiliser ces ports comme ports dynamiques autant que possible.
Considérant que cela ne représente que 16 ports contigus, on peut s'attendre à ce que de nombreuses applications incompatibles utilisent la même valeur de numéros de port pour leurs propres besoins de bout en bout. Ainsi, un numéro de port dans la plage (0xf0b0 à 0xf0bf) fournit très peu d'informations sur l'application à l'extrémité distante.
La surcharge des ports 0xf0bX augmente le risque d'obtenir le mauvais type de charge utile et de mal interpréter le contenu par rapport aux ports réservés à l'IANA. En conséquence, il est recommandé que l'utilisation de ces ports soit associée à un mécanisme tel qu'un contrôle d'intégrité de message (MIC) de sécurité de couche de transport (TLS) [RFC5246] qui s'assure que le contenu est ce qui est attendu et est vérifié.
4.3.2. Compression de la somme de contrôle UDP
L'opération de somme de contrôle UDP est obligatoire avec IPv6 [RFC2460] pour tous les paquets. Pour cette raison, la [RFC4944] interdit la compression de la somme de contrôle UDP.
Avec cette spécification, un compresseur dans le point de terminaison de transport source PEUT (MAY) éluder la somme de contrôle UDP si elle est autorisée par la couche supérieure. Le compresseur NE DOIT PAS (MUST NOT) définir le bit C à moins d'avoir reçu une telle autorisation. Exiger une autorisation de couche supérieure garantit que le pair de transport prévu aura des moyens suffisants pour traiter toute corruption de données qui se produit avant d'atteindre la destination. La couche supérieure NE DOIT PAS (MUST NOT) fournir l'autorisation à moins que l'un des cas suivants ne soit satisfait :
Tunneling : Dans ce cas, 6LoWPAN est déployé comme un pseudo-bus de terrain sans fil en tunnelant des protocoles de terrain existants sur UDP. Si l'unité de données de protocole (PDU) tunnelée possède son propre adressage, sécurité et contrôle d'intégrité (par exemple, mode tunnel IPsec Encapsulating Security Payload [RFC4303] ou encapsulation IP sur UDP), le mécanisme de tunneling PEUT (MAY) autoriser l'élision de la somme de contrôle UDP afin d'économiser sur la surcharge d'encapsulation.
Contrôle d'intégrité de message (Message Integrity Check) : Dans ce cas, soit l'en-tête d'authentification IPsec [RFC4302], soit une autre forme de contrôle d'intégrité dans la charge utile UDP qui couvre au moins les mêmes informations que la somme de contrôle UDP (pseudo-en-tête, données) et a au moins la même force.
Pour aider à garantir que la somme de contrôle UDP sera correctement restaurée lors de l'expansion d'un paquet 6LoWPAN, un contrôle d'intégrité supplémentaire (par exemple, un contrôle d'intégrité de message de couche 2 (L2)) DOIT (MUST) être utilisé chaque fois que des trames de liaison transportant un datagramme UDP compressé qui élude la somme de contrôle sont transmises. Sans ce contrôle d'intégrité supplémentaire, un paquet UDP peut être livré à une destination non prévue car la corruption des données couvertes par le pseudo-en-tête peut passer inaperçue.
Un compresseur DOIT (MUST) vérifier la somme de contrôle UDP avant qu'elle ne soit éludée et DOIT (MUST) s'assurer que le contrôle d'intégrité supplémentaire est en place avant de vérifier et d'éluder la somme de contrôle. Si la vérification de la somme de contrôle UDP échoue, le compresseur DOIT (MUST) rejeter le paquet.
Un décompresseur qui étend un paquet 6LoWPAN avec le bit C défini DOIT (MUST) calculer la somme de contrôle UDP pour le compte du nœud source et placer cette valeur dans l'en-tête UDP restauré tel que spécifié dans les normes en vigueur [RFC0768], [RFC2460]. Le décompresseur DOIT (MUST) déterminer sans ambiguïté qu'un contrôle d'intégrité supplémentaire a été mis en place par le compresseur et vérifier le contrôle d'intégrité et DEVRAIT (SHOULD) le faire après avoir restauré la somme de contrôle UDP. Si le décompresseur ne peut pas déterminer sans ambiguïté la présence d'un contrôle d'intégrité ou si la vérification échoue, le décompresseur DOIT (MUST) rejeter le paquet.
L'ordre recommandé de calcul et de vérification de la somme de contrôle UDP et du contrôle d'intégrité supplémentaire garantit que les données ne sont jamais stockées non protégées en mémoire. En pratique, la séparation des fonctionnalités entre les couches peut empêcher l'ordre recommandé. Cependant, les implémenteurs devraient prendre note et comprendre les risques lors du traitement de données non protégées couvertes par le pseudo-en-tête.
Pour permettre aux nœuds intermédiaires de compresser la somme de contrôle UDP, un nœud de transfert PEUT (MAY) déduire une autorisation de couche supérieure pour un paquet entrant s'il a le bit C défini et qu'il peut déterminer sans ambiguïté qu'un contrôle d'intégrité couvrant les mêmes données que la somme de contrôle UDP était en place pendant que la somme de contrôle UDP était éludée. Un nœud de transfert NE DOIT PAS (MUST NOT) déduire une autorisation s'il ne peut pas déterminer sans ambiguïté la présence de et vérifier un contrôle d'intégrité pendant que la somme de contrôle UDP était éludée.
4.3.3. Format LOWPAN_NHC UDP
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 | 1 | 1 | 1 | 0 | C | P |
+---+---+---+---+---+---+---+---+
Figure 14 : Codage d'en-tête UDP
C : Checksum (Somme de contrôle) :
0: Tous les 16 bits de la somme de contrôle sont transportés en ligne.1: Tous les 16 bits de la somme de contrôle sont éludés. La somme de contrôle est récupérée en la recalculant au point de terminaison 6LoWPAN.
P : Ports :
00: Tous les 16 bits pour le port source et le port de destination sont transportés en ligne.01: Tous les 16 bits pour le port source sont transportés en ligne. Les 8 premiers bits du port de destination sont 0xf0 et éludés. Les 8 bits restants du port de destination sont transportés en ligne.10: Les 8 premiers bits du port source sont 0xf0 et éludés. Les 8 bits restants du port source sont transportés en ligne. Tous les 16 bits pour le port de destination sont transportés en ligne.11: Les 12 premiers bits du port source et du port de destination sont 0xf0b et éludés. Les 4 bits restants pour chacun sont transportés en ligne.
Les champs transportés en ligne (en partie ou en totalité) apparaissent dans le même ordre que dans le format d'en-tête UDP [RFC0768]. Le champ Longueur UDP DOIT (MUST) toujours être éludé et est déduit des couches inférieures à l'aide de l'en-tête de fragmentation 6LoWPAN ou de l'en-tête IEEE 802.15.4.