# AVP Diameter, types de données et Result-Code

> Les AVP (Attribute-Value Pairs) transportent toutes les données Diameter. Chacun comporte un AVP Code, un octet d'indicateurs (V vendor, M mandatory, P réservé), une longueur, un Vendor-Id optionnel et une valeur typée. Les valeurs utilisent des types de base tels que Unsigned32, OctetString, Address, Time, Enumerated et Grouped. Les AVP Result-Code et Experimental-Result rapportent les résultats.

- URL canonique: https://www.broadnet.me/fr/reference/diameter-avps-and-message-format
- Langue: fr
- Dernière mise à jour: 2026-07-18
- Éditeur: BroadNet (https://www.broadnet.me)

L'anatomie d'un AVP Diameter : code, indicateurs V/M/P, longueur, Vendor-Id optionnel et données ; les types de données de base (Enumerated, Unsigned32, OctetString, Address, Time) ; les AVP Grouped ; et le modèle d'erreur Result-Code / Experimental-Result.

## Structure d'un AVP

Chaque donnée Diameter — identités, champs d'abonnement, quotas, résultats — est codée sous forme d'AVP. Un AVP commence par un AVP Code de 32 bits, puis un octet d'indicateurs, une longueur de 24 bits couvrant l'ensemble de l'AVP, un Vendor-Id optionnel de 32 bits, et la valeur complétée jusqu'à une frontière de 4 octets. L'AVP Code seul est unique au sein de l'espace géré par l'IETF ; lorsque l'indicateur V (Vendor-Specific) est positionné, le code est au contraire interprété dans l'espace de numérotation du Vendor-Id qui suit — c'est ainsi que le 3GPP (Vendor-Id 10415) définit les centaines d'AVP utilisés par S6a, Gx et Cx sans entrer en collision avec le protocole de base.

*Format d'AVP RFC 6733*

```text
0                   1                   2                   3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         AVP Code (32)                      |
| V M P r r r r r|                AVP Length (24)            |
|              Vendor-Id (32)  — present only if V=1          |
|    Data ...  (padded to a 4-octet boundary)                |
```

## Les indicateurs V, M et P

Trois indicateurs d'AVP régissent la manière dont un récepteur doit traiter l'AVP. V (Vendor-Specific) signale qu'un Vendor-Id suit et que l'AVP Code appartient à l'espace de ce fournisseur. M (Mandatory) est le plus important : si M est positionné et que le récepteur ne comprend pas l'AVP, il doit rejeter le message entier avec DIAMETER_AVP_UNSUPPORTED (5001) — un positionnement erroné de M casse donc l'interfonctionnement, et les AVP fournisseur qu'une implémentation peut ignorer sans risque sont envoyés avec M effacé. P était à l'origine un marqueur de sécurité de bout en bout ; la RFC 6733 a rendu cet usage obsolète et le bit est désormais réservé et mis à zéro.

*Bits d'indicateurs d'AVP*

| Indicateur | Nom | Signification lorsque défini |
|---|---|---|
| V | Vendor-Specific | Un champ Vendor-Id est présent ; le code se trouve dans l'espace de ce fournisseur |
| M | Obligatoire | Le destinataire doit le comprendre ou rejeter le message (5001) |
| P | (réservé) | Anciennement sécurité de bout en bout ; obsolète selon la RFC 6733, désormais à 0 |

## Types de données de base

Les valeurs d'AVP sont fortement typées. La RFC 6733 définit un ensemble de types de base et plusieurs types dérivés construits à partir d'OctetString. Les types entiers et non signés portent des compteurs, des identifiants et des énumérations ; OctetString porte des données binaires opaques ou structurées ; et les types dérivés ajoutent une sémantique qu'une implémentation peut valider. Address code une adresse IP précédée d'une famille d'adresses sur deux octets. Time est un compteur de secondes de 32 bits de type NTP. Enumerated est un Integer32 dont les valeurs sont nommées par l'application. DiameterIdentity et DiameterURI portent les FQDN et URI des pairs.

*Types de données d'AVP Diameter courants*

| Type | Encodage | Utilisation type |
|---|---|---|
| Unsigned32 / Integer32 | Entier 32 bits | Compteurs, quotas, Auth-Application-Id, Result-Code |
| Unsigned64 / Integer64 | Entier 64 bits | Volumes d'octets, grands compteurs |
| OctetString | Octets opaques | Charges utiles binaires (vecteurs d'authentification, TPDU) |
| UTF8String | OctetString | Texte lisible par l'humain (User-Name, nom du produit) |
| Enumerated | Integer32 | Ensembles de valeurs nommés (par exemple RAT-Type, CC-Request-Type) |
| Address | OctetString + famille | Adresses IPv4/IPv6 (Host-IP-Address, Framed-IP) |
| Heure | Unsigned32 | Secondes écoulées depuis 1900 (Event-Timestamp) |
| DiameterIdentity | OctetString | FQDN du pair (Origin-Host, Destination-Host) |
| Grouped | AVP imbriqués | AVPs qui contiennent d'autres AVPs |

## AVP Grouped

Un AVP Grouped a pour valeur une liste concaténée d'autres AVP — les enregistrements structurés s'imbriquent ainsi proprement sans nouvelles règles de format. Subscription-Data dans S6a, Charging-Rule-Install dans Gx et Experimental-Result portent tous des sous-AVP au sein d'un groupe. Le regroupement est récursif : un AVP Grouped peut contenir d'autres AVP Grouped, ce qui permet d'exprimer un profil d'abonnement LTE complet ou un ensemble de règles PCC sous forme d'un unique AVP de premier niveau. Chaque AVP contenu conserve son propre code, ses indicateurs et sa longueur, de sorte qu'un récepteur analyse le groupe avec le même mécanisme qu'au premier niveau.

## Result-Code et Experimental-Result

Diameter rapporte le résultat d'une requête dans la réponse. L'AVP Result-Code de base (code 268) est un Unsigned32 réparti en plages selon le premier chiffre : 1xxx informationnel, 2xxx succès, 3xxx erreurs protocolaires (émanant d'un proxy/relais), 4xxx échecs transitoires que le client peut réessayer, et 5xxx échecs permanents. Lorsqu'une application a besoin d'une erreur spécifique à un fournisseur que le Result-Code de base ne peut exprimer, elle utilise l'AVP Experimental-Result (code 297) — un AVP Grouped portant un Vendor-Id ainsi qu'un Experimental-Result-Code — c'est ainsi que le 3GPP signale des erreurs comme DIAMETER_ERROR_USER_UNKNOWN ou DIAMETER_ERROR_ROAMING_NOT_ALLOWED.

*Plages de Result-Code et valeurs courantes*

| Plage | Classe | Exemple |
|---|---|---|
| 1xxx | Informationnel | 1001 DIAMETER_MULTI_ROUND_AUTH |
| 2xxx | Succès | 2001 DIAMETER_SUCCESS |
| 3xxx | Erreur de protocole (proxy) | 3002 UNABLE_TO_DELIVER, 3007 APPLICATION_UNSUPPORTED |
| 4xxx | Défaillance transitoire (nouvelle tentative) | 4181 AUTHENTICATION_DATA_UNAVAILABLE (3GPP) |
| 5xxx | Échec permanent | 5001 AVP_UNSUPPORTED, 5012 UNABLE_TO_COMPLY |

## Questions fréquentes

### Qu'est-ce qu'un AVP dans Diameter ?

Un AVP (Attribute-Value Pair) est l'unité de données de chaque message Diameter. Il porte un AVP Code, un octet d'indicateurs (V, M, P), une longueur, un Vendor-Id optionnel et une valeur typée. Toutes les identités, les champs d'abonnement, les quotas et les résultats sont codés sous forme d'AVP, et un message est un en-tête suivi d'une liste de ceux-ci.

### Que fait l'indicateur M (Mandatory) ?

Si l'indicateur M est positionné et que le récepteur ne comprend pas cet AVP, il doit rejeter le message entier avec DIAMETER_AVP_UNSUPPORTED (5001). Les AVP qu'un pair peut ignorer sans risque sont donc envoyés avec M effacé. Un mauvais usage du bit M est une cause fréquente d'échecs d'interfonctionnement entre fournisseurs.

### Qu'est-ce qu'un AVP Grouped ?

Un AVP Grouped est un AVP dont la valeur est elle-même une liste d'AVP, ce qui permet d'imbriquer des enregistrements structurés. Subscription-Data, Charging-Rule-Install et Experimental-Result sont des AVP Grouped. Le regroupement est récursif, de sorte qu'un profil d'abonnement LTE complet ou un ensemble de règles PCC peut être porté par un unique AVP de premier niveau.

### Comment les AVP spécifiques à un fournisseur sont-ils identifiés ?

Par l'indicateur V associé à un champ Vendor-Id. Lorsque V est positionné, un Vendor-Id de 32 bits suit la longueur et l'AVP Code est interprété dans l'espace de numérotation de ce fournisseur. Le 3GPP utilise le Vendor-Id 10415 pour définir les AVP de S6a, Gx, Cx et des autres interfaces applicatives.

### Quelle est la différence entre Result-Code et Experimental-Result ?

Result-Code (AVP 268) porte les codes de résultat de base de l'IETF regroupés en 1xxx/2xxx/3xxx/4xxx/5xxx. Experimental-Result (AVP 297) est un AVP Grouped comportant un Vendor-Id et un Experimental-Result-Code, utilisé lorsqu'une application a besoin d'une erreur spécifique à un fournisseur telle que DIAMETER_ERROR_USER_UNKNOWN du 3GPP.

### Que signifient les plages de result-code de Diameter ?

1xxx est informationnel, 2xxx est un succès (2001 DIAMETER_SUCCESS), 3xxx est une erreur protocolaire généralement levée par un proxy, 4xxx est un échec transitoire que le client peut réessayer, et 5xxx est un échec permanent. Le premier chiffre indique au client s'il doit réessayer, échouer ou rerouter.

## Sources

- [IETF RFC 6733 — Diameter Base Protocol (AVPs, section 4)](https://datatracker.ietf.org/doc/html/rfc6733)
- [3GPP TS 29.272 — S6a/S6d AVP definitions](https://www.3gpp.org/dynareport/29272.htm)

## Voir aussi

- [Protocole de base Diameter (RFC 6733)](https://www.broadnet.me/fr/reference/diameter-base-protocol)
- [Diameter et RADIUS comparés](https://www.broadnet.me/fr/reference/diameter-vs-radius)
- [Diameter S6a/S6d vers le HSS](https://www.broadnet.me/fr/reference/diameter-s6a-s6d-hss)
- [Politique et taxation Diameter Gx/Gy](https://www.broadnet.me/fr/reference/diameter-gx-gy-policy-charging)
- [Développeurs](https://www.broadnet.me/fr/developers)
