# AVP DIAMETER, типы данных и Result-Code

> AVP (Attribute-Value Pairs) несут все данные DIAMETER. У каждого есть AVP Code, октет флагов (V — vendor, M — mandatory, P — reserved), длина, опциональный Vendor-Id и типизированное значение. Значения используют базовые типы, такие как Unsigned32, OctetString, Address, Time, Enumerated и Grouped. AVP Result-Code и Experimental-Result сообщают результаты.

- Канонический URL: https://www.broadnet.me/ru/reference/diameter-avps-and-message-format
- Язык: ru
- Последнее обновление: 2026-07-18
- Издатель: BroadNet (https://www.broadnet.me)

Анатомия AVP DIAMETER: код, флаги V/M/P, длина, опциональный Vendor-Id и данные; базовые типы данных (Enumerated, Unsigned32, OctetString, Address, Time); Grouped AVP; и модель ошибок Result-Code / Experimental-Result.

## Структура AVP

Каждая единица данных DIAMETER — идентичности, поля подписки, квоты, результаты — кодируется как AVP. AVP начинается с 32-битного AVP Code, затем следует октет флагов, 24-битная длина, охватывающая весь AVP, опциональный 32-битный Vendor-Id и значение, дополненное до границы в 4 октета. Сам AVP Code уникален в пространстве, управляемом IETF; когда установлен флаг V (Vendor-Specific), код интерпретируется в пространстве нумерации следующего за ним Vendor-Id — именно так 3GPP (Vendor-Id 10415) определяет сотни AVP, используемых S6a, Gx и Cx, не сталкиваясь с базовым протоколом.

*Формат 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)                |
```

## Флаги V, M и P

Три флага AVP определяют, как получатель должен обрабатывать AVP. V (Vendor-Specific) сигнализирует, что далее следует Vendor-Id и AVP Code принадлежит пространству этого вендора. M (Mandatory) — самый важный: если M установлен, а получатель не понимает AVP, он обязан отклонить всё сообщение с DIAMETER_AVP_UNSUPPORTED (5001), поэтому неверная установка M нарушает межсетевое взаимодействие, а вендорские AVP, которые реализация может безопасно проигнорировать, отправляются со сброшенным M. P изначально был маркером end-to-end безопасности; RFC 6733 упразднил это применение, и теперь бит зарезервирован и устанавливается в ноль.

*Биты флагов AVP*

| Флаг | Имя | Значение, если установлен |
|---|---|---|
| V | Vendor-Specific | Присутствует поле Vendor-Id; код находится в пространстве этого производителя |
| M | Обязательно | Получатель должен поддерживать его или отклонить сообщение (5001) |
| P | (зарезервировано) | Ранее — сквозная защита; упразднено RFC 6733, устанавливается в 0 |

## Базовые типы данных

Значения AVP строго типизированы. RFC 6733 определяет набор базовых типов и несколько производных типов, построенных на OctetString. Целочисленные и беззнаковые типы несут счётчики, идентификаторы и перечисления; OctetString несёт непрозрачные или структурированные двоичные данные; а производные типы добавляют семантику, которую реализация может проверять. Address кодирует IP-адрес с ведущим двухоктетным семейством адресов. Time — это 32-битный счётчик секунд в стиле NTP. Enumerated — это Integer32, значения которого именуются приложением. DiameterIdentity и DiameterURI несут FQDN и URI пиров.

*Распространённые типы данных AVP DIAMETER*

| Тип | Кодировка | Типовое использование |
|---|---|---|
| Unsigned32 / Integer32 | 32-битное целое число | Счётчики, квоты, Auth-Application-Id, Result-Code |
| Unsigned64 / Integer64 | 64-битное целое число | Объёмы в октетах, большие счётчики |
| OctetString | Непрозрачные октеты | Бинарные полезные нагрузки (векторы аутентификации, TPDU) |
| UTF8String | OctetString | Человекочитаемый текст (User-Name, название продукта) |
| Enumerated | Integer32 | Наборы именованных значений (например, RAT-Type, CC-Request-Type) |
| Address | OctetString + семейство | Адреса IPv4/IPv6 (Host-IP-Address, Framed-IP) |
| Время | Unsigned32 | Секунды с 1900 года (Event-Timestamp) |
| DiameterIdentity | OctetString | FQDN узла (Origin-Host, Destination-Host) |
| Grouped | Вложенные AVP | AVPs, содержащие другие AVPs |

## Grouped AVP

Grouped AVP имеет в качестве значения конкатенированный список других AVP — поэтому структурированные записи вкладываются друг в друга без новых правил кодирования. Subscription-Data в S6a, Charging-Rule-Install в Gx и Experimental-Result — все несут вложенные AVP внутри группы. Группировка рекурсивна: Grouped AVP может содержать другие Grouped AVP, и именно так полный профиль подписки LTE или набор правил PCC выражается одним AVP верхнего уровня. Каждый вложенный AVP сохраняет свой код, флаги и длину, поэтому получатель разбирает группу тем же механизмом, что и на верхнем уровне.

## Result-Code и Experimental-Result

DIAMETER сообщает результат запроса в ответе. Базовый AVP Result-Code (код 268) — это Unsigned32, сгруппированный по диапазонам по ведущей цифре: 1xxx — информационные, 2xxx — успех, 3xxx — протокольные ошибки (от прокси/ретранслятора), 4xxx — временные сбои, которые клиент может повторить, и 5xxx — постоянные сбои. Когда приложению нужна вендорская ошибка, которую базовый Result-Code выразить не может, оно использует AVP Experimental-Result (код 297) — Grouped AVP, несущий Vendor-Id и Experimental-Result-Code, — именно так 3GPP сигнализирует ошибки, такие как DIAMETER_ERROR_USER_UNKNOWN или DIAMETER_ERROR_ROAMING_NOT_ALLOWED.

*Диапазоны Result-Code и распространённые значения*

| Диапазон | Класс | Пример |
|---|---|---|
| 1xxx | Информационное | 1001 DIAMETER_MULTI_ROUND_AUTH |
| 2xxx | Успешно | 2001 DIAMETER_SUCCESS |
| 3xxx | Ошибка протокола (прокси) | 3002 UNABLE_TO_DELIVER, 3007 APPLICATION_UNSUPPORTED |
| 4xxx | Временная ошибка (повторная попытка) | 4181 AUTHENTICATION_DATA_UNAVAILABLE (3GPP) |
| 5xxx | Постоянный сбой | 5001 AVP_UNSUPPORTED, 5012 UNABLE_TO_COMPLY |

## Частые вопросы

### Что такое AVP в DIAMETER?

AVP (Attribute-Value Pair) — это единица данных в каждом сообщении DIAMETER. Она несёт AVP Code, октет флагов (V, M, P), длину, опциональный Vendor-Id и типизированное значение. Все идентичности, поля подписки, квоты и результаты кодируются как AVP, а сообщение — это заголовок, за которым следует их список.

### Что делает флаг M (Mandatory)?

Если флаг M установлен, а получатель не понимает данный AVP, он обязан отклонить всё сообщение с DIAMETER_AVP_UNSUPPORTED (5001). Поэтому AVP, которые пир может безопасно проигнорировать, отправляются со сброшенным M. Неправильное использование бита M — частая причина сбоев межсетевого взаимодействия между вендорами.

### Что такое Grouped AVP?

Grouped AVP — это AVP, значением которого является сам список AVP, что позволяет вкладывать структурированные записи. Subscription-Data, Charging-Rule-Install и Experimental-Result — это Grouped AVP. Группировка рекурсивна, поэтому полный профиль подписки LTE или набор правил PCC могут переноситься одним AVP верхнего уровня.

### Как идентифицируются вендорские AVP?

По флагу V плюс поле Vendor-Id. Когда V установлен, за длиной следует 32-битный Vendor-Id, и AVP Code интерпретируется в пространстве нумерации этого вендора. 3GPP использует Vendor-Id 10415 для определения AVP для S6a, Gx, Cx и других прикладных интерфейсов.

### В чём разница между Result-Code и Experimental-Result?

Result-Code (AVP 268) несёт базовые коды результата IETF, сгруппированные как 1xxx/2xxx/3xxx/4xxx/5xxx. Experimental-Result (AVP 297) — это Grouped AVP с Vendor-Id и Experimental-Result-Code, используемый, когда приложению нужна вендорская ошибка, например DIAMETER_ERROR_USER_UNKNOWN от 3GPP.

### Что означают диапазоны кодов результата DIAMETER?

1xxx — информационные, 2xxx — успех (2001 DIAMETER_SUCCESS), 3xxx — протокольная ошибка, обычно поднятая прокси, 4xxx — временный сбой, который клиент может повторить, и 5xxx — постоянный сбой. Ведущая цифра говорит клиенту, повторять ли, завершать с ошибкой или перенаправлять.

## Источники

- [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)

## См. также

- [Базовый протокол DIAMETER (RFC 6733)](https://www.broadnet.me/ru/reference/diameter-base-protocol)
- [DIAMETER против RADIUS](https://www.broadnet.me/ru/reference/diameter-vs-radius)
- [DIAMETER S6a/S6d к HSS](https://www.broadnet.me/ru/reference/diameter-s6a-s6d-hss)
- [Политика и тарификация DIAMETER Gx/Gy](https://www.broadnet.me/ru/reference/diameter-gx-gy-policy-charging)
- [Разработчикам](https://www.broadnet.me/ru/developers)
