Кратко
- RFC 5118 сохраняет точные тестовые сообщения через
allOneLineи встроенный кодированный архив: визуальная строка на странице не заменяет байты fixture. - Неизменный вход может получить иной разбор после обновления. Синтаксически допустимый URI способен включить предполагаемый порт в последнюю пару октетов IPv6 и назвать другой адрес.
- Для сравнения нужны отдельно хеш входа, версия, дерево, ожидаемые host и port, пересланные байты, следующий hop, SIP-транзакция, диалог, media и пользовательский результат.
Лаборатория сохранила архив, но обновила parser. Оба запуска получили одни байты. Старый build терпел скобки в Via received; новый отказал. Или оба приняли URI, но один нормализовал лишнее двоеточие перед пересылкой, а другой сохранил его.
Хеш не подвёл. Он ответил только на свой вопрос: вход одинаков. Поведение принадлежит исполняемому коду, конфигурации и контексту.
Страница не является fixture
Длинные SIP-поля не помещались в ширину RFC. Конвенция allOneLine, взятая из RFC 4475, задаёт точную сборку переносов. RFC 5118 добавляет кодированный архив с побитно точными примерами.
Копирование из HTML может вставить пробел, изменить конец строки или нарушить Content-Length. Harness, который заранее исправляет текст, запускает другой тест. Поэтому источник, извлечение, размер и хеш фиксируются до запуска.
Эта дисциплина не превращает corpus в сертификат. Документ Informational, не нормативен для SIP и прямо не обещает полноты. Одни сообщения нагружают только parser, другие — приложение над ним. Результат относится к названному build и настройкам.
Зелёное дерево с другой целью
Строка sip:[2001:db8::10:5070] может быть грамматически корректной. Но если автор хотел host 2001:db8::10 и port 5070, он закрыл скобки слишком поздно. Parser включает 5070 в IPv6 address; отдельного порта нет.
Проверенный erratum 1311 уточняет термин: значение становится последней парой октетов, а не одним октетом. Предполагаемая форма — sip:[2001:db8::10]:5070.
Два запуска могут вернуть success, но построить разные компоненты для двух строк и выбрать разные sockets. Намерение не выводится из успешного синтаксиса. Оно должно храниться отдельно и сравниваться с деревом и реальным назначением.
Другой пример без обязательных скобок вокруг IPv6 в SIP URI должен получить 400. Corpus различает строгую недействительность, допустимую неожиданную семантику и ограниченную совместимость.
Исключение received меняется вместе с политикой
В RFC 3261 Via sent-by использует IPv6 reference со скобками, а received — голый IPv6 address. RFC 5118 зафиксировал разногласия реализаций и рекомендовал принимать received в обеих формах, но отправлять без скобок.
Это направленное правило. Оно позволяет старому вводу войти и не заставляет следующий hop повторять отклонение. После обновления политика может исчезнуть или расшириться. Поэтому важен не только исход, но и имя исключения, поле, полученный компонент и сериализованный выход.
Глобальное удаление скобок повредит SIP URI. Абсолютный strict mode повредит известной совместимости. Управление должно видеть конкретное исключение, а не маркетинговую шкалу strict/liberal.
Контекст адреса переживает нормализацию
В SIP URI IPv6 заключён в скобки; в SDP connection line — нет. Примеры смешивают IPv4 и IPv6 в Via, используют разные семейства для аудио и видео и помещают IPv4-mapped IPv6 в signaling и SDP.
Единая колонка «address» теряет правило контейнера. Middleware, нормализующий только строку, может исправить header и сломать body. Исходное поле и production должны оставаться рядом со значением.
RFC 5118 также рассматривает лишнее двоеточие, допустимое через путь ABNF. Получатель может проявить robustness, но forwarder должен убрать лишний знак. Parse входа и custody выхода проверяются независимо.
Версия является частью доказательства
Сравнивать только accept/reject недостаточно. Новая версия может сохранить статус, но изменить границы host-port, форму IPv4-mapped address или сериализацию. Следующий hop увидит другую реальность.
Нужен структурный diff: компоненты, offsets, применённые исключения, нормализованный вывод и выбранный адрес. Если правила зависят от feature flag или транспорта, они входят в receipt.
После parser остаются routing policy, transaction response, dialog, SDP reachability, media и пользовательская цель. Успех ранней ступени не доказывает позднюю. Успешный звонок тоже не доказывает одинаковые parse trees: fallback мог скрыть различие.
Неизменный тест — якорь, а не власть
Стабильный архив позволяет увидеть, что изменил running code. Это его сила. Но архив не решает, какое поведение допустимо в каждой сети, и не измеряет весь production traffic.
Минимальный общий слой должен хранить точный стимул и ожидаемые локальные свойства. Решение принять исключение, переписать output, откатить версию или изолировать peer принадлежит оператору, который несёт последствия.
RFC 5118 показывает правильную скромность теста: он делает seam наблюдаемым, не объявляя себя всей системой. Именно так неизменная запись служит реальности, а не заменяет её.
Источники
- https://www.rfc-editor.org/rfc/rfc5118.html
- https://www.rfc-editor.org/rfc/rfc5118.txt
- https://www.rfc-editor.org/info/rfc5118
- https://www.rfc-editor.org/errata/rfc5118
- https://datatracker.ietf.org/doc/rfc5118/
- https://datatracker.ietf.org/doc/rfc5118/history/
- https://www.rfc-editor.org/rfc/rfc4475.html
- https://www.rfc-editor.org/rfc/rfc3261.html
- https://www.rfc-editor.org/rfc/rfc3986.html
- https://www.rfc-editor.org/rfc/rfc4291.html
- https://www.rfc-editor.org/rfc/rfc5952.html
- https://www.rfc-editor.org/rfc/rfc8200.html
- https://www.rfc-editor.org/rfc/rfc1122.html
- https://www.rfc-editor.org/rfc/rfc5234.html
- https://heng.lu/minimum-initial-specification-localized-future-decision-voluntary-adoption-internet-coordination-system/
- https://heng.lu/on-reality-layers-symbolic-power-and-why-clarity-feels-so-hostile/
- https://heng.lu/running-code-primary-the-patch-needed-to-preserve-the-internet-original-design/
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
