Кратко

  • RFC 3680 отделил состояние регистрации адреса от набора привязанных к нему контактов. Даже при отсутствии зарегистрированных контактов адрес имел определённое состояние init.
  • Многие уведомления могли содержать только изменившиеся контакты. Подписчик должен был применять версии по порядку и запрашивать полное обновление при обнаружении пропуска; это не доказывает присутствие человека, работу устройства или успешный вызов.

Пустой список контактов не означал отсутствия состояния. В модели RFC 3680 адрес записи (AoR) без привязанных контактов оставался в состоянии init. Автомат состояний относился к AoR; у каждого контакта был собственный автомат, существующий только пока контакт зарегистрирован.

Опубликованный в марте 2004 года RFC 3680 ввёл пакет событий SIP reg. Авторизованный подписчик отправлял SUBSCRIBE и получал сведения о регистрации в формате application/reginfo+xml. Первое уведомление могло содержать полное состояние, тогда как последующие обычно показывали лишь изменения. В документе указывались режим full или partial и версия: нулевая в начале подписки, затем увеличивающаяся на единицу для каждого документа в рамках этой подписки.

Частичные уведомления сокращали передачу, но требовали от клиента вести собственную таблицу. Неизменившиеся контакты не перечислялись заново, поэтому сообщения следовало последовательно объединять. Следующая версия обрабатывалась; более старая отбрасывалась. Если номер перескакивал вперёд, RFC 3680 рекомендовал обновить подписку, чтобы получить полное состояние. Без восстановления таблица могла выглядеть правдоподобно, уже не отражая пропущенное изменение.

Автомат AoR объясняет значение исчезновения последнего контакта. Первая регистрация переводила адрес из init в active; он оставался активным, пока был связан хотя бы один контакт. Когда последний истекал или удалялся, AoR переходил в terminated, а затем немедленно возвращался в init. О последнем переходе нельзя было сообщать в NOTIFY. Завершение самого контакта, напротив, могло быть передано как изменение его состояния. Связь исчезала, но состояние адреса оставалось определённым.

Active — это факт регистрации, а не характеристика человека. Состояние не доказывает, что пользователь сейчас на связи, устройство включено или запрос INVITE будет доставлен. В RFC 3856 для SIP Presence определён отдельный пакет событий. Регистрационные сведения могут быть исходными данными для формирования присутствия, но не заменяют его. И опубликованный стандарт не подтверждает, что конкретная реализация ему соответствует.

RFC 3680 сделал изменения регистрации наблюдаемыми для авторизованных подписчиков, определил состояние для пустого набора и предусмотрел синхронизацию после утраты части потока. Поэтому важно спрашивать не только «есть ли контакт?», но и «какой версии подписки соответствует это представление, не пропущено ли обновление и что именно доказывают регистрационные данные?»

Источники