Salut à tous, voici un petit topic sur les jumbo frames et le MTU pour bien mettre au clair ce point car les infos sur le sujet sont très rares et presque exclusivement en anglais.
Tout ceux qui ont déjà été trifouiller dans les drivers de leur carte Ethernet gigabit ou qui ont un switch Ethernet gigabit ont probablement déjà lu le terme de "jumbo frame" ou de "MTU".
Pour expliquer ces deux termes rappelons déjà le fonctionnement de l'Ethernet. Depuis sa création, l'Ethernet utilise des trames (frames en anglais) pour faire communiquer en réseau des équipement, ce sont des sortes de paquets. Chaque donnée qui doit être envoyée par un équipement sur un réseau Ethernet doit utiliser ce format:
Toutes les valeurs sont en octet
le préambule de synchronisation n'est qu'une suite de 0 et 1 pour synchroniser les horloges des switchs et cartes Ethernet ainsi que pour signifier le début d'une trame, vient ensuite l'adresse MAC de destination puis celle de source de la trame, deux octets permettent d'indiquer le type de donnée transportée (IP dans 99% des cas, parfois IPv6 ou encore IPX), viennent ensuite les données et pour finir 4 octets de checksum afin de vérifier que les données ne sont pas corrompues.
Pour mesurer la taille d'une trame Ethernet on mesure depuis l'adresse MAC source jusqu'au checksum inclus (on ignore le préambule). Depuis toujours la norme Ethernet indique qu'une trame doit mesurer entre 64 et 1518 octets, donc cela permet de transporter de 46 à 1500 octets de données.
Le MTU (Maximum Transfert Unit) c'est tout simplement le nombre d'octet maximum de données que l'on peut transporter en une fois sur un média réseau, donc en l'occurrence il est de 1500 pile pour l'Ethernet.
Jusque là rien de bien compliqué, le problème c'est que pour permettre la compatibilité avec les anciens équipements Ethernet ces valeurs n'ont jamais changé ainsi que ce soit en 100Base-TX, en 1000Base-T voir même en 10GBase-CX4 (10gbits/s) les trames doivent toujours avoir une taille entre 64 et 1518 octets soit un MTU de 1500 octets.
Le truc c'est que pour chaque trame envoyée le CPU doit faire l'encapsulation (c'est-à-dire construire la trame), dans les années 1990 avec du 10Base2 ou 10Base-T (10mbits/s) cela ne posait pas vraiment de problème car pour atteindre les 10mbits/s il suffisait d'envoyer environ 820 trames par secondes, ce qui, même pour les CPU de l'époque, n'était pas vraiment un soucis. En revanche de nos jour pour saturer une interface Ethernet gigabit il faut envoyer environ 82345 trames par secondes, un travail monumentale même pour les CPU de nos jours, sans compter que le CPU n'a pas que cela à faire puisqu'il faut également traiter les données elle-mêmes (pour les stocker sur le disque dur par exemple). Résultat lorsque vous faites un transfert entre deux PC en gigabit, a moins d'avoir deux bêtes de courses, vous dépasserez rarement les 600mbits/s et en plus le CPU sera très utilisé. (ce phénomène est aggravé sur les petits boitiers NAS qui ont un CPU peu performant)
C'est la qu'interviennent les jumbo frames. Les jumbo frames c'est tout simplement des trames de plus de 1518 octets. Malheureusement il n'existe aucun standard, ainsi même si la taille maximal d'une jumbo frame est généralement de 9000 c'est rarement le cas en pratique et dépend de l'implémentation de chaque constructeur. En gros en utilisant des jumbo frames on divise l'utilisation CPU par 6 pour un débit égale, et lorsque le CPU limitait le débit, le débit max est augmenté.
Malheureusement pour pouvoir utiliser les jumbo frames, il faut que tous les éléments de la chaine par lesquels passent les trames soient compatibles et correctement configurés. Il faut donc des cartes réseaux compatibles avec les jumbo frame correctement configurés et un (ou plusieurs) switchs compatible.
Mise en place des jumbo frames
Bon, vous avez au moins deux PC avec des cartes réseaux gigabit et un switch gigabit compatible et vous souhaitez activer les jumbo frames, voilà comment procéder.
Pour commencer je vous conseil de mesurer le débit actuel afin de comparer. Utilisez l'excelent utilitaire iperf (distribué avec presque toute les distrib linux, on peut également télécharger une version pour windows). Lancer iperf avec la commande "iperf -s" sur un PC et "iperf -c ip.de.l'autre.pc -w2M -r" sur l'autre. Vous obtiendrez le débit utile entre les deux PC dans chaque sens.
Activez maintenant les jumbo frames dans la configuration de votre carte réseau en prenant la valeur maximale pour commencer :
Il faut maintenant tester si votre switch passe bien les jumbo frames de la taille que vous avez selectionnée. Pour cela lançons un invite de commande et utilisons la commande ping.
Lancez la commande ping suivante : ping ip.de.l'autre.pc -f -l 8000
Dans cet exemple vous envoyez un ping avec 8000 octets de données, tout en le forçant a n'utiliser qu'une seul trame (-f). Le but de la manœuvre est d'augmenter la valeur jusqu'à ce que le message suivant apparaisse "Le paquet doit être fragmenté mais paramétré DF." la dernière valeur fonctionnelle avant ce message correspond à votre nouveau MTU – 28 octets, par exemple sur une carte sans jumbo frame la dernière valeur possible du ping avant le message "Le paquet doit être fragmenté mais paramétré DF." est de 1500 – 28 = 1472 octets. Notez cette valeur cela pourra être utile pour faire une liste des MTU de différentes cartes réseau. Ma Realtek 8168D par exemple à un MTU de 9202 lorsque le drivers est sur 9KB (soit une trame maximal de 9220 octets (MTU+18))
Maintenant il faut vérifier le ping avec la dernière valeur avant le message "Le paquet doit être fragmenté mais paramétré DF.", si le ping fonctionne alors c'est tout bon, vous pouvez dès à présent profiter des jumbo frames lors de transferts de fichiers entre les deux PC par exemple. (faites un test iperf!)
En revanche si le ping affiche "Délai d'attente de la demande dépassé." il y a un surement problème qu'il faut absolument résoudre (ou désactiver à nouveau les jumbo frames sur les cartes) sous peine de diminuer fortement les performances. Pour cela commencez par vérifier le MTU de l'autre PC, si celui-ci est identique ou supérieur au premier PC, le problème vient du ou des switchs par lequels passent la trame, si le MTU est inférieur, faites un ping avec le MTU le plus faible des deux PC, si ce ping fonctionne c'est tout bon, sinon cela ne peut-être que le switch qui bloque les trames.
Si le problème vient effectivement du ou des switchs, il faut effectuer des ping en diminuant progressivement la valeur jusqu'à ce que le ping passe (message du genre "Réponse de 192.168.1.1 : octets=1476 temps=1 ms TTL=64" ), vous connaitrez ainsi le MTU de votre switch, si ce dernier est situé aux environs de 1500 alors le switch ne supporte pas les jumbo frames. Sinon si la valeur est élevée mais un peu inférieur à celle des cartes, il suffit de diminuer le MTU des cartes dans les drivers afin de passer en dessous du MTU du ou des switchs.
Dans mon cas par exemple mes cartes ayant un MTU de 9202 et mon swicth un MTU de 9198, j'ai du baisser d'un cran le MTU dans les drivers pour le mettre sur 8KB (soit un MTU mesuré de 8178)
Voilà maintenant vous pouvez profitez pleinement de votre réseau gigabit et faire des transferts dépassant les 100mo/s comme celui-ci tout en ayant un taux d'utilisation du CPU assez faible.
Dernière chose en passant, vous pouvez avoir des PC avec les jumbo frames et d'autres sans sur le même réseau sans soucis car lors du démarrage de la connexion TCP les PC échangent leurs MSS (qui est l'équivalent du MTU mais au niveau IP). Actuellement sur mon réseau j'ai par exemple 2 PC avec les jumbo activées et 3 PC sans ainsi que la Livebox (qui ne supporte évidemment pas les jumbo) sans aucun soucis à déclarer.