SDP — протокол описания мультимедийных сессий

Session Description Protocol (SDP) — это текстовый формат, предназначенный для описания параметров мультимедийной сессии. Он играет ключевую роль в современных системах видеосвязи (SIP-телефония, WebRTC и IP-видеонаблюдение). SDP не является протоколом передачи данных и не отвечает за доставку аудио или видео. Вместо этого он служит языком описания, который передаётся внутри других протоколов и позволяет участникам заранее договориться о том, как именно будет организована передача медиаданных.
Понимание SDP необходимо инженеру, поскольку этот формат используется повсеместно: от установки видеозвонка в браузере до настройки взаимодействия между IP-камерой и видеоконференц-системой. Благодаря своей простоте и открытости, SDP является важным инструментом диагностики и анализа.
Что такое SDP: назначение и место в стеке протоколов
SDP — это не протокол сигнализации, а формат описания сессии. Его задача — передать технические параметры медиасоединения: какие медиапотоки используются (аудио, видео), по каким адресам и портам, с какими кодеками и в каком направлении.
Где используется SDP?
SDP не работает автономно. Он всегда передаётся внутри других протоколов, которые отвечают за установление соединения:
- SIP (Session Initiation Protocol) — в теле сообщений
INVITEи200 OKпередаётся SDP, чтобы согласовать параметры вызова. - WebRTC — используется для обмена описаниями сессии между браузерами (в формате offer и answer).
- RTSP (в редких случаях) — может применяться для описания медиапотоков при инициализации стрима.
- IP-видеонаблюдение — некоторые камеры и платформы используют SDP для передачи параметров видеопотока при подключении к видеосерверу.
💡 Аналогия: Представьте, что вы собираетесь позвонить другу. Вы не можете начать разговор, пока не договоритесь: кто будет говорить, кто слушать, на каком языке, с какой скоростью и по какому каналу. SDP — это как технический меморандум, в котором всё это описано до начала разговора.
Структура SDP: основные поля и их значение
SDP-описание представляет собой последовательность текстовых строк, каждая из которых начинается с одной буквы, знака равенства и значения. Формат простой и легко читаемый, что делает его удобным для анализа.
Общая структура SDP включает глобальные параметры сессии и описание отдельных медиапотоков.
Основные поля SDP
| Поле | Назначение |
|---|---|
v= | Версия протокола SDP |
o= | Информация об инициаторе сессии |
s= | Тема (название) сессии |
c= | Сетевой адрес для медиапотоков |
t= | Время активности сессии (обычно t=0 0 для бессрочной) |
m= | Описание медиапотока (тип, порт, протокол, кодеки) |
a= | Дополнительные атрибуты (направление, кодеки, параметры) |
Разберём каждый элемент подробнее.
Поле v= — версия протокола
Пример:
v=0
Это поле указывает версию SDP. На практике всегда используется значение 0, так как спецификация SDP (RFC 4566) не претерпела изменений, требующих увеличения версии. Это поле присутствует для совместимости и всегда должно быть первым.
Поле o= — информация об инициаторе
Пример:
o=jdoe 2890844526 2890844526 IN IP4 192.0.2.1
Формат:
o=<username> <session-id> <version> <nettype> <addrtype> <unicast-address>
username— имя пользователя или идентификатор. Часто ставится-(не используется).session-id— уникальный идентификатор сессии. Изменяется при пересоздании сессии.version— версия описания сессии. Увеличивается при изменениях.nettype— тип сети. ОбычноIN(Internet).addrtype— тип адреса.IP4илиIP6.unicast-address— IP-адрес инициатора.
📌 Это поле помогает идентифицировать источник сессии и отслеживать изменения конфигурации.
Поле s= — тема сессии
Пример:
s=SDP Seminar
Указывает краткое название сессии. В реальных системах часто содержит имя вызова, идентификатор конференции или просто заглушку вроде Session. Не несёт технической нагрузки, но полезно для диагностики.
Поле c= — сетевой адрес
Пример:
c=IN IP4 192.0.2.1
Определяет сетевой адрес, по которому будут передаваться медиаданные. Если указано глобально (до блоков m=), действует для всех потоков. Может быть переопределён внутри каждого m=.
IN— тип сети (Internet).IP4илиIP6— версия IP.192.0.2.1— IP-адрес (часто публичный или NAT-преобразованный).
⚠️ Важно: если сессия проходит через NAT, в этом поле должен быть указан внешний (публичный) IP-адрес, иначе второй участник не сможет подключиться.
Блок m= — описание медиапотока
Пример:
m=audio 49170 RTP/AVP 0 8 9 101
Это ключевое поле SDP. Каждый медиапоток (аудио, видео, общий доступ к экрану) описывается отдельной строкой m=.
Формат:
m=<media> <port> <proto> <fmt> ...
media— тип медиа:audio,video,application(например, для DTMF),text.port— UDP-порт для приёма медиапотока. Обычно чётный (например, 49170). Следующий нечётный порт (49171) используется для RTCP.proto— транспортный протокол:RTP/AVP(RTP по UDP),RTP/SAVP(защищённый RTP),UDP/TLS/RTP/SAVPF(шифрование через DTLS).fmt— список поддерживаемых Payload Type (PT), идентификаторов кодеков.
💡 Payload Type (PT) — это числовое обозначение кодека в рамках сессии. Например,
0— это G.711 μ-law,8— G.711 A-law,101— часто используется для DTMF.
Поле a= — атрибуты: уточнение параметров
Атрибуты задаются строками a=... и могут быть глобальными (действуют на всю сессию) или локальными (применяются к конкретному m=).
Наиболее важные типы атрибутов:
1. a=rtpmap — мапинг кодека
Пример:
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
Формат:
a=rtpmap:<payload-type> <encoding-name>/<clock-rate>[/<encoding-params>]
PCMU— G.711 с кодированием μ-law, 8 кГц.PCMA— G.711 с кодированием A-law.G722— широкополосный аудиокодек.telephone-event— используется для передачи DTMF-сигналов.
📌 Без
rtpmapнельзя понять, какой кодек скрывается за числовым PT.
2. a=fmtp — параметры формата (format parameters)
Пример (для H.264):
a=fmtp:96 profile-level-id=42e01f;packetization-mode=1
Используется для передачи дополнительных параметров кодека, особенно для видео. В примере:
profile-level-id=42e01f— профиль и уровень H.264 (Baseline Profile, Level 3.1).packetization-mode=1— режим упаковки (обязателен для WebRTC).
❗ Несовпадение
profile-level-id— частая причина "нет видео" в SIP/WebRTC.
3. a=sendrecv, a=sendonly, a=recvonly — направление потока
Пример:
a=sendrecv
Определяет, как будет использоваться медиапоток:
sendrecv— двусторонняя передача (по умолчанию).sendonly— только передача (например, презентация).recvonly— только приём (например, слушатель в конференции).inactive— поток не используется.
💡 Это поле критично для правильной настройки дуплекса и управления потоками.
4. a=ice-ufrag, a=ice-pwd, a=candidate — параметры ICE
Пример:
a=ice-ufrag:UaDj
a=ice-pwd:WseZ1mZ2Rn5a6789012345678901234
a=candidate:1234567890 1 udp 2130706431 192.0.2.1 49170 typ host
Эти атрибуты используются в WebRTC и современных SIP-системах для обхода NAT:
ice-ufragиice-pwd— учетные данные для аутентификации ICE.candidate— сетевой кандидат (IP, порт, тип соединения), полученный через STUN/TURN.
🔄 ICE (Interactive Connectivity Establishment) — механизм, который позволяет установить прямое соединение между участниками, даже если они за NAT.
Пример полного SDP-описания
Ниже приведён пример SDP для аудио-видео вызова:
v=0
o=jdoe 2890844526 2890844526 IN IP4 192.0.2.1
s=SDP Example
c=IN IP4 192.0.2.1
t=0 0
m=audio 49170 RTP/AVP 0 8 9 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
m=video 51372 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=42e01f;packetization-mode=1
a=sendrecv
Разбор:
- Аудиопоток: порт 49170, кодеки G.711, G.722, DTMF.
- Видеопоток: порт 51372, H.264 с профилем Baseline.
- Оба потока — двусторонние (
sendrecv).
SDP в WebRTC и SIP: сходства и различия
| Характеристика | SIP | WebRTC |
|---|---|---|
| Передача SDP | В теле INVITE и 200 OK | Через сигнальный канал (WebSocket, HTTP) |
| Шифрование | SRTP (ключ через SDES или DTLS) | SRTP (ключ через DTLS) |
| NAT-обход | ICE, STUN, TURN (в атрибутах a=) | ICE, STUN, TURN (в атрибутах a=) |
| Динамические PT | Да | Да |
Использование rtpmap | Да | Да (но браузеры могут опускать стандартные кодеки) |
🔍 Важно: в WebRTC SDP генерируется автоматически браузером, но его можно модифицировать через JavaScript API (
RTCPeerConnection).
SDP как инструмент диагностики
Поскольку SDP передаётся в открытом виде, он является ключевым элементом при анализе проблем в видеосвязи.
Типичные проблемы, выявляемые по SDP:
| Проблема | Признак в SDP |
|---|---|
| Нет аудио/видео | Отсутствует соответствующий блок m= |
| Односторонний звук | a=sendonly на одной стороне, a=recvonly на другой |
| Несовместимость кодеков | Нет общих PT в списках m= |
| Проблемы с H.264 | Разные profile-level-id или packetization-mode |
| Проблемы с NAT | Отсутствуют a=candidate или не совпадают IP/порты |
🛠️ Совет: при отладке видеозвонка всегда проверяйте SDP в логах сигнализации (SIP-трафик или WebRTC-сообщения). Это первый шаг к пониманию, почему соединение не установилось.
Заключение: почему SDP важен для инженера
SDP — это мост между сигнализацией и медиатранспортом. Он позволяет участникам сессии точно согласовать:
- Какие медиапотоки используются,
- По каким адресам и портам,
- С какими кодеками и параметрами,
- В каком направлении.
Хотя SDP выглядит как простой текст, он несёт критически важную информацию, от которой зависит совместимость устройств, качество связи и возможность диагностики.