Протокол туннелирования GPRS
Протокол туннелирования GPRS (англ. GPRS Tunnelling Protocol, GTP) — это группа коммуникационных протоколов на основе IP, используемых для передачи данных в рамках общего пакетного радиосервиса (GPRS) в радиосетях GSM, UMTS, LTE (3GPP Long Term Evolution) и 5G NR. В архитектуре 3GPP интерфейсы на основе GTP и прокси-мобильного IPv6 (Proxy Mobile IPv6) определены для различных точек взаимодействия сетевых элементов[1].
GTP состоит из отдельных протоколов: GTP-C, GTP-U и GTP' (GTP prime).
GTP-C применяется во внутренней сети ядра GPRS для сигнализации между узлами поддержки шлюза GPRS (GGSN) и обслуживающими узлами поддержки GPRS (SGSN). Это позволяет, например, активировать для абонента сессию передачи данных (активация PDP-контекста), деактивировать её, изменять параметры качества обслуживания или обновлять сессию при переходе абонента между разными SGSN.
GTP-U используется для передачи пользовательских данных внутри ядра сети GPRS, а также между радиодоступом (RAN) и ядром. Форматы транспортируемых данных могут быть представлены пакетами IPv4, IPv6 или PPP.
GTP' (GTP prime) использует ту же структуру сообщений, что и GTP-C/GTP-U, но служит независимым задачам. В частности, применяется для передачи платёжных данных от функции сбора расчётной информации (CDF) к шлюзу расчёта (CGF). Чаще всего это означает отправку информации с множества сетевых элементов, таких как GGSN, на централизованный сервер для последующей обработки в биллинговой системе оператора.
Различные варианты GTP реализуются на контроллерах радиосети (RNC), SGSN, GGSN и CGF внутри сетей 3GPP. Мобильные станции GPRS (MS) подключаются к SGSN, не взаимодействуя с GTP напрямую.
GTP может работать через протоколы UDP или TCP. Однако использование UDP является либо рекомендованным, либо обязательным, за исключением туннелирования X.25 в версии 0. GTP версии 1 работает только через UDP.
Заголовки GTPv1 включают следующие поля:[1]
| + | 0-2 | 3 | 4 | 5 | 6 | 7 | 8-15 | 16-23 | 24-31 | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Версия | Тип протокола | Зарезервировано | Флаг расширения | Флаг номера последовательности | Флаг номера N‑PDU | Тип сообщения | Длина сообщения | ||||||||||||||||||||||||
| 32 | Идентификатор конечной точки туннеля (TEID) | |||||||||||||||||||||||||||||||
| 64 | Номер последовательности | Номер N‑PDU | Тип следующего расширенного заголовка | |||||||||||||||||||||||||||||
- Версия
- 3-битное поле. Для GTPv1 значение 1.
- Тип протокола (PT)
- 1 бит, различает GTP (1) и GTP' (0).
- Зарезервировано
- 1 бит, должен быть 0.
- Флаг расширения (E)
- есть ли следующий расширенный заголовок.
- Флаг номера последовательности (S)
- наличие поля номера последовательности.
- Флаг номера N‑PDU (PN)
- наличие поля N‑PDU.
- Тип сообщения
- 8 бит, определяет тип сообщения GTP (описано в 3GPP TS 29.060, секция 7.1).
- Длина сообщения
- 16 бит, длина полезных данных в байтах (не включая обязательный 8-байтный заголовок GTP), включает все дополнительные поля.
- Идентификатор конечной точки туннеля (TEID)
- 32 бита (4 октета), используется для мультиплексирования различных соединений в одном туннеле GTP.
- Номер последовательности
- (опционально) 16 бит; присутствует, если один из флагов E, S, PN установлен; интерпретируется, только если установлен S.
- Номер N‑PDU
- (опционально) 8 бит; существует при наличии любого из флагов E, S, PN; интерпретируется при PN.
- Тип следующего расширенного заголовка
- (опционально) 8 бит; существует при E, S или PN, используется только если E.
Следующие расширенные заголовки организованы так:
| + | Биты 0-7 | 8-23 | 24-31 | |||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Длина расширения | Содержимое | ||||||||||||||||||||||||||||||
| … | … | |||||||||||||||||||||||||||||||
| … | Содержимое | Следующий расшир. заголовок | ||||||||||||||||||||||||||||||
- Длина расширения
- 8 бит, указывает длину всего расширенного заголовка (включая все поля) в блоках по 4 октета.
- Содержимое
- данные расширенного заголовка.
- Следующий расширенный заголовок
- 8 бит, указывает тип следующего расширения либо 0, если такового нет (возможна цепочка расширенных заголовков).
Также известен как развитый GTP или eGTP. Заголовки GTPv2-C содержат следующие поля:[2]
| + | Бит 0-2 | 3 | 4 | 5-7 | 8-15 | 16-23 | 24-31 | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Версия | Флаг наложения сообщений (P) | Флаг TEID (T) | Зарезервировано | Тип сообщения | Длина сообщения | ||||||||||||||||||||||||||
| 32 | TEID (присутствует только при T=1) | |||||||||||||||||||||||||||||||
| 64 (32 если TEID отсутствует) | Номер последовательности | Зарезервировано | ||||||||||||||||||||||||||||||
Протокола GTPv2-U не существует, в LTE используется GTPv1-U.
- Версия
- 3-м битное поле (значение 2 для GTPv2)
- Флаг наложения сообщений (P)
- если выставлен, к сообщению добавляется ещё одно GTP-C сообщение.
- Флаг TEID
- если установлен, поле TEID присутствует между длиной сообщения и номером последовательности; обязательно почти для всех сообщений.
- Длина сообщения
- указывает длину сообщения в октетах, исключая обязательные 4 октета заголовка GTP-C; TEID (если есть) и номер последовательности включены в подсчёт.
Кроме формата сообщений, все версии GTP используют общий механизм для проверки доступности соединений между GSN. Для этого используются два типа сообщений — echo request (запрос эха) и echo response (ответ эха).
Каждые 60 секунд (или иным заданным интервалом) GSN может отправлять echo request всем активным соседям. Если ответ не поступает, соединение считается потерянным и удаляется.
За исключением этих двух, общих сообщений для всех версий GTP не существует, что по сути делает каждую разновидность GTP отдельным протоколом[3].
GTP-C — протокол управления
GTP-C — это управляющая часть протокола GTP. Когда абонент запрашивает активацию PDP-контекста, SGSN отправляет управляющее сообщение GTP-C типа «create PDP context request» на GGSN с деталями запроса. GGSN отвечает соответствующим сообщением, содержа либо параметры активированного PDP-контекста, либо причину отказа. Используется UDP-порт 2123.
Протокол eGTP-C (GTPv2-C) отвечает за создание, поддержку и удаление туннелей на нескольких интерфейсах Sx. Он обеспечивает маршрутизацию по управляющей плоскости, управление туннелями и мобильноcть абонентов, а также поддерживает перенаправление сообщений пересылки и перенос контекста в ходе хендовера LTE.
GTP-U — туннелирование пользовательских данных
GTP-U — это сравнительно простой протокол туннелирования IP, позволяющий создавать множество туннелей между каждой парой сетевых узлов. В UMTS для каждого PDP-контекста пользователя формируется отдельный туннель, также возможны дополнительные туннели для соединений с различными требованиями QoS.
Туннели идентифицируются уникальным (предпочтительно криптографическим) идентификатором TEID в каждом сообщении GTP-U. Качественная энтропия в TEID повышает защищённость от некоторых атак. Тем не менее стандарт 3GPP требует, чтобы весь трафик GTP, включая данные пользователя, передавался только внутри защищённых частных сетей, не подключённых напрямую к Интернету. Работа осуществляется через UDP-порт 2152.
Протокол GTPv1-U используется для обмена пользовательскими данными по туннелям между P-GW и eNodeB c учётом каждой конечной точки UE по интерфейсам S1-U и S5/S8.
GTP' — передача платёжных данных
Протокол GTP' служит для передачи расчётных данных к функции шлюза расчётов (CGF). Использует TCP и UDP-порт 3386.
Внутри ядра сети GPRS
GTP является основным протоколом, применяемым в ядре сети GPRS. Он обеспечивает мобильность пользователей GSM/UMTS-сети с сохранением подключения к Интернету: пользователь перемещается, а IP-сессия остаётся связанной с одним GGSN. Данные пользователя проходят от текущего SGSN к обслуживающему GGSN для данной сессии. Ядро сети использует три разновидности GTP:
- GTP-U — для передачи пользовательских данных по отдельным туннелям PDP-контекстов;
- GTP-C — для:
- создания и удаления PDP-контекстов;
- проверки доступности GSN;
- обновления состояния при перемещении абонента между SGSN;
- GTP' — для передачи расчётных данных между GSN и функцией расчёта.
SGSN и GGSN (совместно — GSN) принимают управляющие GTP-сообщения по UDP-порту 2123, а данные пользователя через порт 2152. Это может происходить как в одной сети, так и через границы сетей — например, в случае международного роуминга посредством GPRS Roaming Exchange (GRX).
Функция шлюза расчёта (CGF) слушает сообщения GTP' от GSN на портах TCP/UDP 3386. Ядро сети передаёт ей время активации PDP-контекста и объём пользовательского трафика. Однако такая передача внутри одной сети часто реализована не по стандарту, зависит от вендора и может использовать проприетарные протоколы и кодировку.
Использование на интерфейсе IuPS
GTP-U применяется на интерфейсе IuPS между ядром GPRS и радиосетью (RAN), но GTP-C здесь не используется. Для установления туннелей GTP-U между SGSN и контроллером радиосети (RNC) используется протокол RANAP.
Стек протоколов
| Прикладные протоколы |
| IP (пользовательские данные) |
| GTP |
| UDP |
| IP |
| Уровень 2 (например, WAN или Ethernet) |
Протокольный стек GTP-U |
GTP может быть реализован на базе UDP или TCP. Версия 1 GTP работает только на UDP.
По состоянию на 2018 год определены три версии: 0, 1 и 2. Версии 0 и 1 существенно отличаются по структуре. В версии 0 сигнальный и туннелирующий протоколы объединены на одном порту, в версиях 1 и 2 сигнальный (GTP-C) и пользовательский (GTP-U) протоколы разделены. Версия 2 отличается от версии 1 только в части GTP-C (благодаря расширениям для поддержки EPS в 3GPP).
GTP-U используется для транспортировки пользовательских данных от контроллера радиосети (RNC) к SGSN в сетях UMTS. Сигнализация при этом выполняется по RANAP, а не через GTP-C.
Исторические версии GTP
Исходная версия протокола (версия 0) значительно отличается от современных версий (1 и 2):
- идентификатор туннеля был неслучайным;
- существовала поддержка передачи X.25;
- фиксированный порт 3386 использовался для всех функций (в отличие от GTPv1, где он остался только для расчёта);
- был разрешён транспорт через TCP (опционально), а не только UDP;
- поля, связанные с абонентской подпиской (например, качество обслуживания), были ограничены.
Нерандомизированный TEID в версии 0 был уязвим — злоумышленник, попавший в сеть или к партнёрам по роумингу, мог атаковать платформу передачи данных. Версия 0 постепенно вытесняется версией 1 почти во всех сетях. Использование отдельных портов для разных версий позволяет блокировать старую версию на маршрутизаторах.
Стандартизация GTP
Первоначально GTP был стандартизирован обществом ETSI (стандарт GSM 09.60)[4]. С переходом к стандарту UMTS сопровождение GTP было передано 3GPP, которая поддерживает актуальную версию стандарта 29.060[5]. Форматы сообщений расчёта стандартизированы в 3GPP TS 32.295.
Поздние редакции TS 29.060 декларируют отказ от поддержки совместимости между версиями GTPv0/v1[6], то есть нет отката к более ранней версии, если GSN не поддерживает новую.
GTPv2 (для усовершенствованных пакетных сервисов) был представлен в черновиках в начале 2008 года и окончательно утверждён в декабре того же года. Новая версия поддерживает откат к GTPv1 по механизму «Версия не поддерживается», но не поддерживает работы с GTPv0.
Примечания
Литература
- GSM standard 09.60, ETSI, 1996—1998, стандарт, охватывающий начальную (0) версию GTP.
- 3GPP TS 29.060 V6.9.0 (2005-06), 3rd Generation Partnership Project, Sophia Antipolis, Франция, 2005—06. Основной стандарт, определяющий варианты GTP версии 1.
- 3GPP TS 32.295 V6.1.0 (2005-06), 3rd Generation Partnership Project, Sophia Antipolis, Франция, 2005—06. Стандарт использования GTP для расчётов.
- 3GPP TS 29.274 V8.1.0 (2009-03), 3rd Generation Partnership Project, Sophia Antipolis, Франция, 2009—03. GTPv2 для развитого GPRS.


