L'unité utilisée est la trame (Frame). Chaque trame est délimitée par deux fanions identiques (en notation binaire: 01111110).
Fanion (Flag)
Le fanion est un délimiteur de trame pour la synchronisation. Sa valeur est pour HDLC :
01111110 ( binaire )
7E (hexadécimal)
Les trames HDLC peuvent être envoyées les unes derrière les autres : dans ce cas, le fanion de fin de la première trame peut être mis en commun et servir de fanion de début pour la trame suivante.
Adresse (Address)
L'adresse est celle du destinataire à qui est envoyée la trame. Cette adresse était utilisée lorsque la communication était de type maître-esclave, l'adresse étant celle de l'esclave. En communication point-à-point, elle n'est pas utilisée.
Commande (Control)
Ce champ permet de distinguer 3 types de trames :
- trame d'information (données) : (lien)[ Ns ][P/F][ Nr ]
- trame de supervision : (lien)(lien)[__][P/F][ Nr ]
- trame non numérotée : (lien)(lien)[__][P/F][___]
Le bit P/F signifie Poll/Final (Invitation à émettre/Fin). Il est dit positionné s'il a la valeur 1. Par convention, le bit positionné vaut P si la trame est une commande et F si la trame est une réponse. L'émission d'une commande avec P=1 exige une réponse immédiate (avec F = 1). À la réception d'une trame avec le bit P/F positionné, le bit vaut F si on attend une réponse à une commande déjà envoyée et il vaut P si aucune commande n'a été envoyée.
Dans les trames d'information (data), Ns est le numéro de la trame courante. Nr est le numéro de la trame d'information attendue ; il acquitte les trames de numéro inférieur à Nr.
N.B : les bits du champ de commande, décrits ci-dessus, sont écrits dans l'ordre dans lequel ils sont envoyés sur la couche physique, c’est-à-dire le bit de poids faible en premier et le bit de poids fort en dernier.
Données
Ce champ optionnel de longueur variable contient les données à envoyer. Le nombre de bits à expédier n'a pas à être un multiple de 8: comme ce champ n'a pas besoin d'être aligné du point de vue octet, il n'est pas nécessaire d'ajouter de bits de bourrage à la fin.
FCS
Frame Check Sequence : le FCS est un code ajouté après les données pour détecter d'éventuelles erreurs de transmission. Il est codé habituellement sur 16 bits, mais après négociation entre les deux interlocuteurs, il peut être sur 32 bits.
Cette séquence correspond au CRC calculé sur les champs adresse + commande + données.
Un exemple d'implémentation en C du codage/décodage du FCS est proposé dans la RFC 1662 (PPP in HDLC-like framing).
Transparence
Pour que les fanions servent de délimiteurs, il est indispensable que la valeur de celui-ci ne se trouve pas dans les données transportées entre le début et la fin. Pour cela, les données seront modifiées pour éliminer les séquences de bits 01111110 (7Eh). Il y a deux méthodes: la méthode par bit et la méthode par octet.
La première méthode (appelée bourrage de bit, Bit stuffing en anglais) est la plus courante: il s'agit d'éviter de rencontrer six bits consécutifs de valeur 1. Lors de l'écriture de la trame, si les données contiennent 5 bits successifs à la valeur 1, un 0 est automatiquement ajouté après.
La deuxième méthode (appelée bourrage d'octet) utilise un caractère d'échappement, de valeur hexadécimal CE. Si parmi les octets à envoyer, on rencontre la valeur du fanion (7E), alors cet octet est remplacé par les deux octets suivants: CE puis 5E. Du coup, il s'agit de s'assurer que la valeur de l'octet d'échappement ne se trouve pas dans les données, si on le rencontre, l'octet CE est alors remplacé par les octets CE et 9E.
Ainsi il n'y a pas, avant transmission, de confusion possible entre données et fanions de début/fin.