<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="IPv6 and UDP Checksums for Tunneled Packets" status="standards" num="6935" wg="6man">
<authors><author>M. Eubanks (AmericaFree.TV LLC)</author><author>P. Chimento (Johns Hopkins University Applied Physics Laboratory</author><author>M. Westerlund (Ericsson)</author></authors>
<rfcdate><month>April</month><year>2013</year></rfcdate>
<date>2013-05-01</date>
<content>
<p>Ne dites plus qu'en <wikipedia>IPv6</wikipedia>, la
<wikipedia>somme de contrôle</wikipedia> est toujours obligatoire dans
les en-têtes des paquets <wikipedia name="User Datagram Protocol">UDP</wikipedia>. Depuis ce <rfc
num="6935"/>, ce n'est plus vrai dans tous les cas. Lors de
l'encapsulation de paquets dans un <wikipedia name="Tunnel (réseau informatique)">tunnel</wikipedia> UDP,
on a désormais le droit de ne pas mettre de somme de contrôle dans les
paquets UDP, essentiellement pour des raisons de performance.</p>
<p>Le principal demandeur de cette modification était le protocole
<wikipedia name="Locator/Identifier Separation Protocol">LISP</wikipedia> (<rfc num="9300" local="true"/>), qui
dépend énormement de <wikipedia name="Tunnel (réseau informatique)">tunnels</wikipedia>
<wikipedia name="User Datagram Protocol">UDP</wikipedia>. Même si le calcul de la <wikipedia>somme de contrôle</wikipedia> Internet est rapide (<rfc num="1071"
local="true"/>), comme ce calcul peut se faire des millions de fois par
seconde pour un routeur très actif, on peut chercher à
l'économiser. D'autant plus qu'il n'est pas forcément utile puisque, dans le cas
d'un tunnel, le protocole qui circule dans le tunnel est déjà protégé
par une somme de contrôle. À noter que d'autres protocoles que LISP
(comme ceux utilisés pour le
<foreign><wikipedia>multicast</wikipedia></foreign>) peuvent
bénéficier de cette nouvelle indulgence. Mais elle ne s'applique pas
aveuglément à tout UDP (comme l'avaient proposé certains au début de
la discussion), uniquement aux tunnels.</p>
<p>La norme actuelle sur IPv6, le <rfc num="2460" local="true"/>,
imposait (dans sa section 8.1) une somme de contrôle pour les paquets
UDP (en <wikipedia>IPv4</wikipedia>, elle était facultative). En
effet, IPv6 n'a pas de somme de contrôle dans la <wikipedia>couche 3</wikipedia> (contrairement à son prédecesseur).</p>
<p>Ce <wikipedia name="Request for comments">RFC</wikipedia> est un produit du groupe de travail
<wikipedia name="Internet Engineering Task Force">IETF</wikipedia> <link
url="http://tools.ietf.org/wg/6man">6man</link>, qui produit
inlassablement d'<link url="/search?pattern=6man">innombrables RFC</link> pour combler tous les petits
problèmes qui trainent encore dans IPv6 et sont révélés par son
utilisation dans le vrai monde.</p>
<p>Notez bien que cette dispense de somme de contrôle n'est pas
générale : elle concerne les cas où il y a un tunnel et où il utilise
UDP. Pourquoi UDP, alors qu'il existe des protocoles de tunnel qui
s'en dispensent ? Parce que l'Internet est hélas de plus en plus
ossifié, et que des
<foreign><wikipedia xml:lang="en" name="Middlebox">middleboxes</wikipedia></foreign> stupides et
boguées sont partout sur le trajet des pauvres paquets. Les techniques
de tunnel directement sur IP (comme l'excellent <wikipedia
name="Generic Routing Encapsulation">GRE</wikipedia> du <rfc
num="2784" local="false"/>) sont souvent bloquées, alors qu'UDP passe
partout. On aura donc un protocole X (<wikipedia name="Locator/Identifier Separation Protocol">LISP</wikipedia> ou
un autre) à l'intérieur du tunnel et de l'UDP à
l'extérieur. Hier, cet UDP à l'extérieur était forcément protégé par
une somme de contrôle. Pour un routeur qui sert de terminaison à des
dizaines de milliers de tunnels (ce qui n'aurait rien d'étonnant avec
LISP), calculer et vérifier ces sommes peut être très
douloureux. D'autant plus que le protocole X a souvent sa propre somme
de contrôle : ne serait-ce pas mieux pour tout le monde que le tunnel
soit non sécurisé, ses éventuelles corruptions de paquets étant
détectées par le protocole X uniquement ?</p>
<p>La section 4 discute plus en détail de certains aspects du
problème mais il vaut mieux consulter le <rfc num="6936"
local="true"/> pour tout savoir. Cet autre RFC précise notamment dans
quels cas supprimer la somme de contrôle est une bonne idée et dans
quels cas il vaut mieux la garder. La section 4 de notre RFC note
particulièrement que les paquets de <emphasis>contrôle</emphasis> du
tunnel, ceux qui servent à la signalisation, devraient rester protégés
(s'ils sont corrompus, le tunnel peut cesser de fonctionner,
c'est-à-dire que la corruption d'<emphasis>un</emphasis> paquet va affecter d'autres
paquets). 
Notons que certains protocoles de tunnel comme GRE n'ont aucun
mécanisme de contrôle. Lorsqu'il y en a un, il est souvent utilisé
pour établir un contexte au début, avec choix des paramètres pour le
tunnel : ce peut être le bon moment pour négocier le non-usage des
sommes de contrôle sur les paquets de données.
</p>
<p>Autre piège rigolo : certaines
<foreign><wikipedia xml:lang="en" name="Middlebox">middleboxes</wikipedia></foreign> vont tiquer en
voyant les paquets UDP sans somme de contrôle (bien que, normalement,
la somme de contrôle soit de bout en bout et ne regarde pas ces
équipements intermédiaires). Bien que ce soit
désormais légal, il va falloir attendre longtemps avant que tous ces
engins soient mis à jour (section 4.3). En attendant ce jour, il est prudent que le
tunnel détecte les problèmes en envoyant des paquets avec et sans
somme de contrôle au début : si seuls les premiers passent, c'est
qu'on a une <foreign>middlebox</foreign> agressive sur le trajet et
qu'il faut renoncer à appliquer ce <rfc num="6935"/>. Le test est
d'ailleurs à répéter de temps en temps : la route peut changer et on
peut donc se retrouver soudain à traverser une nouvelle
<foreign>middlebox</foreign>.</p>
<p>La section 4.1 conseille également de tenter de détecter la
corruption avant de décapsuler, par exemple en examinant l'adresse IP
source, pour minimiser le risque d'envoyer au protocole encapsulé un
paquet reçu corrompu. Mais cette détection ne marchera pas à tous les
cas (sinon, on pourrait supprimer les sommes de contrôle dans tous les
cas) et le protocole encapsulé doit donc être robuste et réagit
proprement lorsque ces paquets corrompus sont injectés dans un flux
existant (section 4.2).</p>
<p>La section 5 contient la nouvelle norme pour les sommes de contrôle
UDP. Elle remplace le texte du <rfc num="2460" local="true"/> (qui
disait que la somme de contrôle UDP était toujours obligatoire en
IPv6) par un texte plus nuancé : par <emphasis>défaut</emphasis>, la somme de contrôle <emphasis>doit</emphasis>
être calculée et mise dans le paquet. Mais on <emphasis>peut</emphasis> s'en dispenser dans
le cas de <emphasis>tunnels</emphasis> (et uniquement celui-ci), sur le paquet
extérieur. Le protocole à l'intérieur du paquet (qui n'est pas
forcément de l'UDP et même pas forcément de l'IPv6) doit rester
protégé par sa propre somme de contrôle. Cela ne doit s'appliquer que pour une liste explicite de
ports (ceux utilisés par le tunnel) et pas pour tout le trafic UDP de
la machine. Et le tout doit se faire en lisant le <rfc num="6936" local="true"/> qui précise les conditions d'application de
cette nouvelle règle.</p>
<p>Les curieux et les chercheurs en informatique noteront que la
section 6 liste des points qui mériteraient davantage d'étude. Ainsi,
il n'y a pas eu d'étude systématique de la corruption de paquets sur
l'Internet depuis <wikipedia>2000</wikipedia> et personne ne sait donc
trop si c'est un phénomène fréquent ou pas. Cette section note aussi
qu'il existe en théorie une meilleure solution pour les tunnels,
<wikipedia xml:lang="en">UDP Lite</wikipedia> (<rfc num="3828" local="true"/>), mais que sa
probabilité de passer les <foreign>middleboxes</foreign> est plus
faible que celle d'UDP.</p>
<p>Plusieurs des mises en œuvre de <wikipedia name="Locator/Identifier Separation Protocol">LISP</wikipedia>
envoient déjà des paquets UDP sans somme de contrôle (ou plus
exactement avec une somme à zéro).</p>
</content>
</rfcdesc>
