Кратко

  • Пример приёмника RTP помещал неизвестный SSRC на испытательный срок: одного правдоподобного пакета было мало, а короткий ряд соседних номеров давал слабое свидетельство непрерывности.
  • Огромный скачок сначала отвергался; приёмник запоминал ожидаемого преемника и открывал новую эпоху лишь после его прихода. Это защищало учёт потерь, но не удостоверяло отправителя.

Заголовок проходил проверку раньше источника

Приёмник впервые видит SSRC 0x4A17 и номер 41 900. Версия равна двум, payload type известен, длина согласуется с padding. Это может быть начало настоящего источника. Но возможны ошибочная доставка другому приложению, неверный контекст расшифрования или случайное совпадение нескольких проверяемых битов.

RFC 1889 описал эту бедность доказательства в 1996 году. RFC 3550 сохранил решение в 2003-м. Версия, тип, расширение, заполнение и длина отсекают невозможное, но для невиданного источника остаются слабыми проверками. Один дейтаграмм не приносит с собой прошлое.

Поэтому частью проверки становится время. Новый SSRC входит в probation и получает статус valid только после MIN_SEQUENTIAL последовательных номеров. При типичном значении два пакет 41 900 остаётся кандидатом, а 41 901 создаёт первую связь между наблюдениями.

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

Осторожность оплачивалась началом медиа

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

Поэтому числа в приложении — параметры примера, а не вечные требования. Ранее полученный valid RTCP даёт более сильный контекст. Предсказуемый шаг timestamp у конкретного формата добавляет проверку. Живой разговор и запись вправе выбрать разную цену запуска.

Слово probation сохраняет меру утверждения. Это локальное решение приёмника в условиях неопределённости, а не authentication, предоставленная отправителем.

Шестнадцатибитное число ходило по кругу

После допуска номера не становятся обычными целыми. За 65 535 следует ноль. Приёмник хранит максимум и число пройденных циклов, получая расширенный номер для отчётов RTCP.

Сеть меняет порядок. Немного меньший номер может быть поздним или дублированным; умеренно больший — указывать на пропуск. Пример RFC 3550 задаёт MAX_MISORDER 100 и MAX_DROPOUT 3 000.

Смысл дают сопутствующие предположения: пятьдесят пакетов в секунду, две секунды перестановки и минута выпадения. При другой частоте те же числа обозначают другое время. Перенести константу без модели времени — значит потерять политику.

Большому скачку требовался следующий свидетель

После 12 000 приходит 50 000. Немедленно записать разницу в потери — значит создать точную катастрофу без наблюдений. Сразу объявить restart — значит позволить одной аномалии написать биографию.

Алгоритм сначала отвергает скачок и сохраняет плохой номер плюс один в bad_seq. Если затем приходит 50 001, пара образует последовательное новое начало. Только тогда состояние инициализируется заново, а второй пакет становится первым принятым наблюдением новой эпохи.

Начальная probation спрашивает, заслуживает ли неизвестный SSRC долговременной памяти. Подтверждение скачка спрашивает, объясняет ли прежняя история известного SSRC нынешние пакеты. Обоим решениям нужна непрерывность, потому что явного сообщения о restart может не быть.

Сброс счётчика признавал неизвестный промежуток

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

Обычный расчёт уже сложнее процента. RFC 3550 определяет накопленную потерю как ожидаемые минус полученные, причём поздние и дублированные входят в полученные. Избыток копий может дать отрицательную потерю. RFC 3611 добавил трассы потерь и дубликатов и предложил отделять наблюдаемые события от их толкования.

Граница эпохи задаёт знаменатель. Продолжать один показатель через невидимое перерождение — не сохранять доказательство, а украшать незнание точностью.

RFC 3550 исправил пример, который легко копировать

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

Ошибка на единицу меняет ожидаемое число пакетов. Неясность bad_seq меняет, какой пакет подтверждает эпоху. Псевдокод приложения часто расходится шире, чем объяснение его пределов.

Устойчивая идея — не значения 2, 100 и 3 000, а явные состояния: кандидат, допустимая последовательность, терпимая задержка, подозрительный разрыв и подтверждённое новое начало.

Непрерывность не была подписью

Подделыватель может послать соседние номера; настоящий источник может провалиться из-за потери. RFC 3711 позднее определил SRTP для конфиденциальности, аутентификации сообщений и защиты от replay при надлежащих ключах. Это иной слой доказательства.

Даже SRTP не доказывает, что человек слушал или понял. RTP probation утверждает гораздо меньше. Первый номер предлагает историю, второй создаёт непрерывность; скачок приостанавливает старый счёт, преемник может открыть новый. Поле становится свидетельством только внутри состояния приёмника.

Источники