Кратко

  • Поле Packet Number содержит только 1–4 младших байта полного номера и маскируется header protection.
  • Получатель выбирает полный кандидат около следующего ожидаемого значения, используя состояние того же packet-number space.
  • Повтор младших битов, скачок, переполнение или ошибка расшифрования сами по себе не доказывают потерю, повтор, атаку или ущерб приложению.

Пассивная запись часто превращает фрагмент протокольного состояния в мнимую последовательность. Один и тот же видимый 16-битный результат объявляют повтором, а числовой скачок — потерей миллионов пакетов. RFC 9000 и RFC 9001 требуют разделять три состояния: защищённые байты в проводном трафике, усечённое значение после снятия header protection и полный Packet Number, восстановленный получателем. Полный номер — целое от 0 до 2^62-1. Но в long header или short header передаются только 1–4 байта его младших битов. Длина поля также защищена.

Номер не является глобальным счётчиком соединения. QUIC использует три packet-number spaces: Initial, Handshake и application data; последнее включает 0-RTT и 1-RTT. В каждом пространстве отсчёт начинается с нуля. Номера отправки и приёма ведутся отдельно для каждого направления. Поэтому одинаковое число может относиться к разным пакетам. Пакеты Retry и Version Negotiation не содержат Packet Number и не подтверждаются обычными ACK.

Отправитель выбирает ширину кодирования с учётом состояния. Пока в данном пространстве не получен ACK, он использует полный номер. После ACK выбирается столько битов, чтобы покрыть более чем удвоенную разницу между отправляемым номером и Largest Acknowledged. Примеры RFC показывают алгоритм, в том числе на последовательных неподтверждённых номерах; это не эксплуатационные временные пороги и не гарантия для любого сильно задержанного пакета.

Получатель сначала снимает header protection. Только после этого становятся известны чистое усечённое значение и длина поля. Показанная процедура реконструкции использует три входа: наибольший номер, успешно обработанный в текущем пространстве, усечённое значение и длину. Следующее ожидаемое значение равно наибольшему успешно принятому номеру плюс один. В пределах окна кодирования выбирается ближайший кандидат. Пассивному наблюдателю без истории конечной точки этой информации не хватает.

Если пакет приходит после множества более высоких номеров, его младшие биты могут оказаться ближе к неправильному кандидату. Поэтому ошибка deprotection или аутентификации сама по себе не доказывает нарушение протокола или атаку. Восстановленный номер участвует в построении nonce AEAD; при снятии packet protection незашищённый заголовок вплоть до Packet Number аутентифицируется как associated data. Предположение о значении вне этой процедуры не является аутентифицированным декодированием.

Largest Acknowledged — отдельный тип доказательства. Это полное целое переменной длины, а не усечённое защищённое поле. ACK ranges описывают полученные и обработанные пакеты в packet-number space пакета, содержащего ACK. Они могут подтвердить факт на конечной точке, но не восстанавливают пропуски пассивной записи и не переносят смысл в другое пространство. Обработка дубликата начинается после снятия защиты и аутентифицированного восстановления номера. Совпадения младших битов недостаточно.

В журнале доказательств отдельно хранятся идентификатор и направление соединения, тип пакета и пространство, защищённые байты и полнота записи, контекст ключа и результат deprotection, длина и усечённое значение, максимальный обработанный номер, ожидание и окно, полный восстановленный номер и аутентификация, а также значения ACK и их пространство. Потеря, повторная передача, переупорядочивание, replay, injection, атака, влияние пути и доставка приложению требуют самостоятельных подтверждений. Пропуск может возникнуть из-за точки сбора, выборки, усечения, состояния расшифрования или реального трафика.

Эта граница отличается от spin-bit sampling в TR-038, key phase в TR-042, семантики ACK для приложения в TR-045, coalescing в TR-049 и PTO probing в TR-051.