4. Message Formats (Formats de message)
-
Message Formats (Formats de message)
Cette section décrit les formats de message utilisés par BGP.
Les messages BGP sont envoyés via des connexions TCP. Un message n'est traité qu'après avoir été entièrement reçu. La taille maximale d'un message est de 4096 octets. Toutes les implémentations doivent (REQUIRED) prendre en charge cette taille maximale de message. Le plus petit message pouvant être envoyé se compose d'un en-tête BGP sans partie de données (19 octets).
Tous les champs multi-octets sont en ordre d'octets réseau (network byte order).
4.1. Message Header Format (Format d'en-tête de message)
Chaque message possède un en-tête de taille fixe. Il peut y avoir ou non une partie de données suivant l'en-tête, selon le type de message. La disposition de ces champs est illustrée ci-dessous:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
- + | |
-
| Marker |
- + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length | Type | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Marker:
Ce champ de 16 octets est inclus pour la compatibilité; il doit (MUST) être défini sur tous les uns.
Length:
Cet entier non signé de 2 octets indique la longueur totale du message, y compris l'en-tête en octets. Ainsi, il permet de localiser le (champ Marker du) message suivant dans le flux TCP. La valeur du champ Length doit (MUST) toujours être au moins 19 et ne pas dépasser 4096, et peut (MAY) être encore davantage contrainte, selon le type de message. Le "bourrage" (padding) de données supplémentaires après le message n'est pas autorisé. Par conséquent, le champ Length doit (MUST) avoir la plus petite valeur requise, compte tenu du reste du message.
Type:
Cet entier non signé de 1 octet indique le code de type du message. Ce document définit les codes de type suivants:
1 - OPEN 2 - UPDATE 3 - NOTIFICATION 4 - KEEPALIVE
[RFC2918] définit un code de type supplémentaire.
4.2. OPEN Message Format (Format de message OPEN)
Après l'établissement d'une connexion TCP, le premier message envoyé par chaque partie est un message OPEN. Si le message OPEN est acceptable, un message KEEPALIVE confirmant l'OPEN est renvoyé.
En plus de l'en-tête BGP de taille fixe, le message OPEN contient les champs suivants:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+ | Version | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | My Autonomous System | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Hold Time | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | BGP Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Opt Parm Len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Optional Parameters (variable) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version:
Cet entier non signé de 1 octet indique le numéro de version du protocole du message. Le numéro de version BGP actuel est 4.
My Autonomous System:
Cet entier non signé de 2 octets indique le numéro de système autonome (Autonomous System number) de l'émetteur.
Hold Time:
Cet entier non signé de 2 octets indique le nombre de secondes que l'émetteur propose pour la valeur du Hold Timer. À la réception d'un message OPEN, un haut-parleur BGP doit (MUST) calculer la valeur du Hold Timer en utilisant la plus petite de son Hold Time configuré et du Hold Time reçu dans le message OPEN. Le Hold Time doit (MUST) être soit zéro, soit au moins trois secondes. Une implémentation peut (MAY) rejeter les connexions sur la base du Hold Time.
La valeur calculée indique le nombre maximal de secondes pouvant s'écouler entre la réception de messages KEEPALIVE et/ou UPDATE successifs de l'émetteur.
BGP Identifier:
Cet entier non signé de 4 octets indique l'identifiant BGP (BGP Identifier) de l'émetteur. Un haut-parleur BGP donné définit la valeur de son identifiant BGP sur une adresse IP attribuée à ce haut-parleur BGP. La valeur de l'identifiant BGP est déterminée au démarrage et est la même pour chaque interface locale et chaque pair BGP.
Optional Parameters Length:
Cet entier non signé de 1 octet indique la longueur totale du champ Optional Parameters en octets. Si la valeur de ce champ est zéro, aucun paramètre optionnel n'est présent.
Optional Parameters:
Ce champ contient une liste de paramètres optionnels, dans laquelle chaque paramètre est codé sous forme de triplet <Parameter Type, Parameter Length, Parameter Value>.
0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... | Parm. Type | Parm. Length | Parameter Value (variable) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
Parameter Type est un champ d'un octet qui identifie sans ambiguïté les paramètres individuels. Parameter Length est un champ d'un octet qui contient la longueur du champ Parameter Value en octets. Parameter Value est un champ de longueur variable qui est interprété en fonction de la valeur du champ Parameter Type.
[RFC3392] définit le paramètre optionnel Capabilities.
La longueur minimale du message OPEN est de 29 octets (en-tête de message inclus).
4.3. UPDATE Message Format (Format de message UPDATE)
Les messages UPDATE sont utilisés pour transférer des informations de routage entre les pairs BGP. Les informations contenues dans le message UPDATE peuvent être utilisées pour construire un graphe décrivant les relations entre les différents systèmes autonomes. En appliquant des règles à discuter, les boucles d'informations de routage et certaines autres anomalies peuvent être détectées et supprimées du routage inter-AS.
Un message UPDATE est utilisé pour annoncer des routes réalisables partageant des attributs de chemin communs à un pair, ou pour retirer plusieurs routes non réalisables du service (voir 3.1). Un message UPDATE peut (MAY) simultanément annoncer une route réalisable et retirer plusieurs routes non réalisables du service. Le message UPDATE inclut toujours l'en-tête BGP de taille fixe, et inclut également les autres champs, comme indiqué ci-dessous (notez que certains des champs affichés peuvent ne pas être présents dans chaque message UPDATE):
+-----------------------------------------------------+ | Withdrawn Routes Length (2 octets) | +-----------------------------------------------------+ | Withdrawn Routes (variable) | +-----------------------------------------------------+ | Total Path Attribute Length (2 octets) | +-----------------------------------------------------+ | Path Attributes (variable) | +-----------------------------------------------------+ | Network Layer Reachability Information (variable) | +-----------------------------------------------------+
Withdrawn Routes Length:
Cet entier non signé de 2 octets indique la longueur totale du champ Withdrawn Routes en octets. Sa valeur permet de déterminer la longueur du champ Network Layer Reachability Information, comme spécifié ci-dessous.
Une valeur de 0 indique qu'aucune route n'est retirée du service et que le champ WITHDRAWN ROUTES n'est pas présent dans ce message UPDATE.
Withdrawn Routes:
Il s'agit d'un champ de longueur variable contenant une liste de préfixes d'adresse IP pour les routes qui sont retirées du service. Chaque préfixe d'adresse IP est codé sous forme de 2-tuple de la forme <length, prefix>, dont les champs sont décrits ci-dessous:
+---------------------------+ | Length (1 octet) | +---------------------------+ | Prefix (variable) | +---------------------------+
L'utilisation et la signification de ces champs sont les suivantes:
a) Length:
Le champ Length indique la longueur en bits du préfixe d'adresse IP. Une longueur de zéro indique un préfixe qui correspond à toutes les adresses IP (avec le préfixe lui-même de zéro octet).
b) Prefix:
Le champ Prefix contient un préfixe d'adresse IP, suivi du nombre minimum de bits de fin nécessaires pour que la fin du champ tombe sur une limite d'octet. Notez que la valeur des bits de fin n'est pas pertinente.
Total Path Attribute Length:
Cet entier non signé de 2 octets indique la longueur totale du champ Path Attributes en octets. Sa valeur permet de déterminer la longueur du champ Network Layer Reachability comme spécifié ci-dessous.
Une valeur de 0 indique que ni le champ Network Layer Reachability Information ni le champ Path Attribute ne sont présents dans ce message UPDATE.
Path Attributes:
Une séquence de longueur variable d'attributs de chemin est présente dans chaque message UPDATE, à l'exception d'un message UPDATE qui ne contient que les routes retirées. Chaque attribut de chemin est un triplet <attribute type, attribute length, attribute value> de longueur variable.
Attribute Type est un champ de deux octets composé de l'octet Attribute Flags, suivi de l'octet Attribute Type Code.
0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Attr. Flags |Attr. Type Code| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Le bit de poids fort (bit 0) de l'octet Attribute Flags est le bit Optional. Il définit si l'attribut est optionnel (s'il est défini sur 1) ou bien connu (s'il est défini sur 0).
Le deuxième bit de poids fort (bit 1) de l'octet Attribute Flags est le bit Transitive. Il définit si un attribut optionnel est transitif (s'il est défini sur 1) ou non transitif (s'il est défini sur 0).
Pour les attributs bien connus, le bit Transitive doit (MUST) être défini sur 1. (Voir la section 5 pour une discussion sur les attributs transitifs.)
Le troisième bit de poids fort (bit 2) de l'octet Attribute Flags est le bit Partial. Il définit si les informations contenues dans l'attribut transitif optionnel sont partielles (si définies sur 1) ou complètes (si définies sur 0). Pour les attributs bien connus et les attributs optionnels non transitifs, le bit Partial doit (MUST) être défini sur 0.
Le quatrième bit de poids fort (bit 3) de l'octet Attribute Flags est le bit Extended Length. Il définit si la longueur de l'attribut (Attribute Length) est d'un octet (s'il est défini sur 0) ou de deux octets (s'il est défini sur 1).
Les quatre bits de poids faible de l'octet Attribute Flags ne sont pas utilisés. Ils doivent (MUST) être zéro lors de l'envoi et doivent (MUST) être ignorés lors de la réception.
L'octet Attribute Type Code contient le code de type d'attribut. Les codes de type d'attribut actuellement définis sont discutés dans la section 5.
Si le bit Extended Length de l'octet Attribute Flags est défini sur 0, le troisième octet de l'attribut de chemin contient la longueur de la valeur d'attribut en octets.
Si le bit Extended Length de l'octet Attribute Flags est défini sur 1, les troisième et quatrième octets de l'attribut de chemin contiennent la longueur de la valeur d'attribut en octets.
Les octets de longueur restants contiennent la valeur d'attribut spécifique au type d'attribut particulier.
Network Layer Reachability Information (NLRI):
Un champ de longueur variable contient une liste de préfixes d'adresse IP pour les routes annoncées. Chaque préfixe d'adresse IP est codé sous forme de 2-tuple <length, prefix> dans le même format que celui décrit pour Withdrawn Routes.
La longueur minimale d'un message UPDATE est de 23 octets -- 19 octets d'en-tête fixe + 2 octets de Withdrawn Routes Length + 2 octets de Total Path Attribute Length.
4.4. KEEPALIVE Message Format (Format de message KEEPALIVE)
BGP envoie des messages KEEPALIVE pour confirmer que les pairs sont accessibles. BGP utilise également les messages UPDATE pour confirmer que les pairs sont en vie. L'envoi d'un message UPDATE réinitialise le Hold Timer.
Un message KEEPALIVE se compose uniquement d'un en-tête de 19 octets.
4.5. NOTIFICATION Message Format (Format de message NOTIFICATION)
Un message NOTIFICATION est envoyé lorsqu'une condition d'erreur est détectée. La connexion BGP est fermée immédiatement après l'envoi du message NOTIFICATION.
En plus de l'en-tête BGP de taille fixe, le message NOTIFICATION contient les champs suivants:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Error code | Error subcode | Data (variable) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Error Code:
Cet entier non signé de 1 octet indique le type d'erreur signalée. Les codes d'erreur suivants sont définis:
1 - Message Header Error (Erreur d'en-tête de message) 2 - OPEN Message Error (Erreur de message OPEN) 3 - UPDATE Message Error (Erreur de message UPDATE) 4 - Hold Timer Expired (Expiration du temporisateur Hold) 5 - Finite State Machine Error (Erreur de machine à états finis) 6 - Cease (Cessation)
Error Subcode:
Cet entier non signé de 1 octet fournit des informations d'erreur plus spécifiques. Chaque code d'erreur peut avoir son propre ensemble de valeurs pour le sous-code d'erreur. Si aucun sous-code d'erreur n'est spécifié, une valeur de 0 doit (MUST) être utilisée.
Message Header Error Subcodes:
1 - Connection Not Synchronized (Connexion non synchronisée) 2 - Bad Message Length (Longueur de message incorrecte) 3 - Bad Message Type (Type de message incorrect)
OPEN Message Error Subcodes:
1 - Unsupported Version Number (Numéro de version non pris en charge) 2 - Bad Peer AS (AS de pair incorrect) 3 - Bad BGP Identifier (Identifiant BGP incorrect) 4 - Unsupported Optional Parameter (Paramètre optionnel non pris en charge) 5 - [Deprecated] - [Déprécié] 6 - Unacceptable Hold Time (Temps d'attente inacceptable)
UPDATE Message Error Subcodes:
1 - Malformed Attribute List (Liste d'attributs mal formée) 2 - Unrecognized Well-known Attribute (Attribut bien connu non reconnu) 3 - Missing Well-known Attribute (Attribut bien connu manquant) 4 - Attribute Flags Error (Erreur de drapeaux d'attribut) 5 - Attribute Length Error (Erreur de longueur d'attribut) 6 - Invalid ORIGIN Attribute (Attribut ORIGIN invalide) 7 - [Deprecated] - [Déprécié] 8 - Invalid NEXT_HOP Attribute (Attribut NEXT_HOP invalide) 9 - Optional Attribute Error (Erreur d'attribut optionnel) 10 - Invalid Network Field (Champ réseau invalide) 11 - Malformed AS_PATH (AS_PATH mal formé)
Data:
Ce champ de longueur variable est utilisé pour diagnostiquer la condition d'erreur déterminée par les champs Error Code et Error Subcode. La longueur de ce champ peut être calculée à partir du champ Length du message NOTIFICATION. Le contenu de ce champ dépend du code d'erreur et du sous-code d'erreur.
La longueur minimale d'un message NOTIFICATION est de 21 octets (sans données).