# Codage 64b/66b

Le codage 64b/66b (le terme « encodage », parfois utilisé, est impropre ; il provient d'une traduction erronée du mot anglais « encoding ») est un code en ligne qui transforme les données 64 bits en code en ligne 66 bits pour fournir suffisamment de changements d’état pour permettre une récupération du signal d'horloge raisonnable et l’alignement du flux de données sur le récepteur. Il est utilisé dans la mise en réseau et la transmission de données. Il a été défini par le groupe de travail IEEE 802.3 dans le cadre de l’amendement IEEE 802.3ae-2002 qui a introduit Ethernet 10 Gbit/s. Au moment du déploiement du codage 64b/66b, il permettait de transmettre l'Ethernet 10 Gb avec les mêmes lasers que ceux utilisés par SONET OC-192, plutôt que d’exiger des lasers 12,5 Gbit/s dont le déploiement n'était pas attendu avant plusieurs années.
La surcharge de protocole (en) d’un schéma de codage est le rapport entre le nombre de bits de la charge utile brute et le nombre de bits de la charge utile brute plus le nombre de bits de codage ajoutés. La surcharge du codage 64b/66b est de 2 bits de codage pour chaque 64 bits de charge utile, soit 3,125 %. Il s’agit d’une amélioration considérable par rapport à la surcharge de 25 % du schéma de codage 8b/10b utilisé précédemment, qui ajoutait 2 bits de codage à 8 bits de charge utile.
La surcharge peut être réduite en doublant la taille de la charge utile pour produire le codage 128b/130b utilisé par PCIe 3.0.

## Fonctionnement

Comme son nom l’indique, 64 bits de charge utile sont codés en tant qu’entité 66 bits. L’entité 66 bits est créée en préfixant l’un des deux préambules 2 bits possibles aux 64 bits de charge utile.
* Si le préambule est 01$_2$, les 64 bits de charge utile sont des données.
* Si le préambule est 10$_2$, les 64 bits de charge utile contiennent un champ Type de 8 bits et 56 bits d’informations et/ou de données de contrôle.
Les préambules 00$_2$ et 11$_2$ ne sont pas utilisés et indiquent une erreur s'ils apparaissent.
L’utilisation des préambules 01$_2$ et 10$_2$ garantit une transition de bits tous les 66 bits, ce qui signifie qu’un flux continu de 0 ou de 1 ne peut pas être une donnée valide. Cela permet également une synchronisation horloge/minuterie plus facile, car une transition doit être vue tous les 66 bits.
La charge utile 64 bits est ensuite brouillée à l’aide d’une fonction de brouilleur autosynchrone. Le brouillage n’a pas pour but de chiffrer les données, mais de s’assurer qu’une distribution relativement uniforme de 1 et de 0 se trouve dans les données transmises. Le brouilleur ne peut pas garantir que les données de sortie n’auront jamais une longue suite de 0 ou de 1, ou d’autres propriétés indésirables dans les communications, mais permet de fixer des limites statistiques fortes à la probabilité de tels événements. Les conceptions pratiques choisiront les paramètres du système de manière qu’une erreur de bit due à de longues suites soit extrêmement improbable. Cette méthode est différente de l’approche basée sur le livre de codes du codage 8b/10b.
Le codage et le brouillage sont normalement entièrement implémentés dans le matériel, le brouilleur utilisant un registre à décalage à rétroaction linéaire. Les couches supérieures de la pile logicielle n’ont pas besoin de savoir que la couche de liaison utilise ces méthodes.