Кратко

  • RFC 3388 превратил строки SDP в именованных участников исполнимых отношений, но считал весь слой группировки недействительным, если хотя бы одна строка не имела уникального и стабильного mid.
  • Спецификация сохраняла базовые описания медиа, отделяя пригодность отдельных записей от полномочия синхронизировать, выбирать или копировать их по неполному набору отношений.

В описании сеанса есть четыре строки m=. Каждая содержит допустимый адрес, порт и формат. Три строки имеют mid, четвёртая — нет. Группа ссылается только на две именованные строки, поэтому легко решить, что безымянная запись к ней не относится и не мешает работе.

RFC 3388 запрещал такой вывод. Если в описании применялась группировка, идентификатор требовался у каждой строки, даже не включённой в конкретную группу. Одна пропущенная метка означала, что никакие группы выполнять нельзя. Сами медиа не исчезали. Полномочие заявленных отношений исчезало.

Документ вышел в декабре 2002 года на Standards Track и устранял ограничение Session Description Protocol. SDP умел перечислять несколько аудио-, видео- и иных описаний, но не имел общего способа показать, какие из них нужно воспроизводить синхронно и какие назначения вместе представляют один логический экземпляр медиа.

Расширение добавило ключ и отношение. Медиальный атрибут a=mid присваивал строке уникальный в пределах описания токен. Сеансовый атрибут a=group связывал токены зарегистрированной семантикой. Первыми семантиками стали LS для синхронизации воспроизведения и FID для идентификации потока через несколько сессий.

LS был исполнимым требованием, а не подписью к диаграмме. Приложение должно было восстановить временную связь медиа и синхронизировать вывод. В RTP сведения RTCP могли сопоставить разные шкалы времени с общей опорной точкой; иной транспорт нуждался в другом механизме. Группа объявляла обязанность, но не содержала измерений часов и не доказывала результат у пользователя.

FID влиял на назначения. Сотовому терминалу могли требоваться разные порты для кодеков, использующих разные радиоканалы. Голос мог поступать одному устройству, а события DTMF — отдельному серверу. Если активный кодек поддерживали несколько членов, отправитель должен был посылать копии в соответствующие RTP-сессии.

Поэтому ошибка отношения не ограничивалась классификацией. Подмена FID могла направить копию медиа по произвольному адресу, о чём предупреждал раздел безопасности. Целостность сигнализации защищала не красоту документа, а право его рёбер управлять передачей.

Правила идентичности были намеренно строгими. Каждый mid должен был быть уникален. Если группа упоминала неизвестный токен, всю строку группы игнорировали, словно её не было. Нельзя было взять только понятную часть и предположить, что остальное несущественно.

Полное покрытие всех m=-строк закрывало ещё одну лазейку. Безымянная строка могла быть независимой. Но она могла остаться после обрезки сообщения, сбоя генератора или потери ключа связи. По локальному виду получатель не отличал эти причины. Отказ от всех групп сохранял неопределённость вместо того, чтобы превращать её в выдуманное отношение.

В SIP offer/answer требовалась также стабильность имени. RFC 3264 продолжал сопоставлять первую строку предложения с первой строкой ответа, вторую со второй. mid не отменял это порядковое правило. Имя в ответной позиции должно было совпадать с предложением. Если оно менялось, все mid и group игнорировались.

Так спецификация не позволяла приложению выбрать удобную правду. Следование переставленным меткам молча изменило бы соответствие, согласованное порядком. Сохранение порядка вместе с противоречивой группой создало бы другие отношения. Базовый сеанс оставался, а несогласованная надстройка теряла силу.

Ответ служил квитанцией принятия. Понимающий семантику участник возвращал ту же группу или её подмножество. Если строка отклонялась нулевым портом, её имя следовало удалить из ответной группы. Реальным отношением сеанса становилось не всё пожелание автора предложения, а подтверждённое множество.

Отвечающая сторона не могла начать новую группировку прямо в ответе. После него не было сообщения, в котором инициатор подтвердил бы новое отношение. Для собственной инициативы требовалось последующее предложение. Ограничение касалось не статуса сторон, а наличия наблюдаемой положительной приёмки.

Совместимость со старыми узлами сохраняла ещё одну границу доказательства. RFC 3388 не вводил SIP-заголовок Require. Узел, не знающий group и mid, игнорировал их по обычным правилам SDP. Он мог считать члены FID отдельными потоками, работать как микшер, отвергнуть сеанс или вызвать повторную попытку с более простым описанием.

Успешный диалог SIP поэтому не подтверждал выполнение группы. Он мог подтвердить только базовый сеанс. Совместимость позволяла продолжить связь, но не превращала молчание старого узла в согласие с новой семантикой.

Первоначальное RFC разрешало строке участвовать в группах с разными семантиками, но запрещало несколько групп одной семантики. RFC 5888 впоследствии заменил RFC 3388 и снял это ограничение после опыта внедрения. Необходимость полного и согласованного пространства имён сохранилась; избыточно узкая кардинальность — нет.

Принцип Running-Code Primacy Лу Хэна помогает увидеть подходящий общий слой. Конечная точка может детерминированно проверить уникальность, полное покрытие, существование ссылок, устойчивость по позициям и подтверждённое членство. Для совместимости не требуется централизовать внутреннюю архитектуру, алгоритм синхронизации или способ обработки кодеков.

Minimum Initial Specification проводит соседнюю границу. Общими должны стать ключ соединения, зарегистрированная семантика и правило приёмки. Восстановление времени, локальная реализация и будущие решения остаются у участников. Реестр согласует язык взаимодействия, но не становится свидетелем фактического исполнения.

Историческая ценность RFC 3388 — в разделении двух видов валидности. Набор записей может быть полностью пригоден сам по себе и одновременно не давать достоверного набора отношений. Сохранить строки и отказаться от отношений — не потеря строгости, а точное ограничение последствий ошибки.

Одной пропавшей метки хватало, чтобы отменить все группы, потому что частично угаданные отношения могли применить правильное действие к неверному медиа. Спецификация предпочла отсутствие автоматизации неправомерной уверенности: потоки могли жить дальше, а неподтверждённая связь — нет.

Источники