Назад в Центр знаний
Отпечатки

WebRTC: жизненный цикл ICE-пула и время

Разделите предварительный сбор ICE-кандидатов, их передачу и перезапуск; отсутствие события не доказывает отсутствие прежней сетевой активности.

BotBrowser Team

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Пул ICE-кандидатов влияет на время возможной работы, но не объединяет сбор, события страницы, локальное описание и последующий перезапуск в одно наблюдение. Тихий журнал не доказывает отсутствие прежней активности сервера. BotBrowser документирует адресные политики WebRTC, но не гарантирует настройку размера пула или отмену прежней активности.

Четыре этапа WebRTC: предварительный сбор, передача при локальном описании, расход пула в первом обмене и поздний перезапуск с новой согласуемой сессией

Кратко

  • Ненулевой iceCandidatePoolSize запрашивает предварительный сбор, но не подтверждает готовность пула.
  • setLocalDescription() обозначает этап передачи кандидатов, а не время первого сетевого действия.
  • Начальный пул применяется в первом обмене; restartIce() запрашивает новое согласование и не отменяет прошлую активность.

Посмотреть видео

Это видео на английском разбирает тот же вопрос, что и статья: в трассе WebRTC несколько часов, поэтому настроенный размер пула, событие кандидата в странице, локальное описание и серверный журнал нельзя заменить одним моментом «ICE начался». Показан контролируемый локальный стенд в Ubuntu Chrome: peer connection создаётся с ненулевым размером пула, а позднее изменение возвращает InvalidModificationError; второй зонд считает события кандидатов внутри заявленного окна и читает состояние сбора. Счёт остаётся наблюдением страницы, а не серверным журналом; видео не утверждает, что измерялся реальный сайт, и не заявляет, что BotBrowser управляет размером пула. Аудио на английском.

Содержание

BotBrowser документирует адресные политики WebRTC для управляемых сессий, но не гарантирует настройку размера пула или отмену прежней активности. Руководство по предотвращению утечек WebRTC описывает типы кандидатов и адресные политики, а руководство по mDNS-кандидатам объясняет представление host-кандидата. Здесь рассматривается время наблюдения отдельных этапов ICE.

Как время меняет вопрос приватности

В трассе WebRTC может быть несколько временных точек: создание peer connection, необязательный предварительный сбор кандидатов, вызов локального описания, передача событий кандидатов странице, обмен offer/answer и последующий перезапуск ICE. Если считать всё единым моментом «начала ICE», важные различия исчезают. Рекомендация WebRTC определяет iceCandidatePoolSize как размер заранее собираемого пула; значение по умолчанию равно нулю. Ненулевое значение запрашивает пул, но не является записью с отметками времени о том, что получила страница.

Граница APIЗаписатьНе делать вывод
RTCPeerConnection(configuration)Запрошенный iceCandidatePoolSize и начало записиЧто предварительный сбор завершён
setLocalDescription()Время вызова и переданные событияЧто сеть заработала именно тогда
restartIce()Запрос перезапуска и следующее согласованиеЧто начальный пул восстановлен

Событие страницы описывает видимую приложению точку передачи. Оно не задаёт время каждой DNS-, STUN- или TURN-операции, которая могла произойти раньше. Важен и обратный случай: отсутствие события кандидата в журнале приложения само по себе не доказывает отсутствия прежнего сбора или активности сервера. Запись могла начаться поздно, приложение могло отфильтровать собственный журнал, а наблюдение могло поступить с другого уровня. Это причины обозначить границы свидетельств, а не придумывать пропущенное событие.

При разрешённой проверке приватности или совместимости разделяйте четыре наблюдения:

  • Настроенный размер пула и время фиксации этой конфигурации.
  • Сетевую активность из отдельного разрешённого серверного журнала, если он есть.
  • События кандидатов, переданные приложению, с указанным окном записи.
  • Локальное описание и этап offer/answer, записанные приложением.

Эти записи отвечают на разные вопросы. Настройка показывает запрос приложения. Событие показывает передачу скрипту. Локальное описание показывает данные, переданные приложением API согласования. Серверный журнал показывает наблюдение конкретного сервера. Ни одна запись сама по себе не доказывает, что политика адресов применялась до всех значимых сетевых действий. Перед сравнением отметок времени укажите часы и точку наблюдения каждого источника.

Пул также не равен видимому странице числу кандидатов. Настроенный размер не доказывает, что реализация успела собрать столько пригодных кандидатов до следующего вызова. RFC 9429 прямо учитывает исчерпание пула, если нужны дополнительные компоненты ICE или времени на сбор не хватило; тогда остальные кандидаты собираются обычным способом. Поэтому значение настройки, число событий страницы и содержимое локального описания нельзя считать взаимозаменяемыми измерениями.

Такое разделение предотвращает два чрезмерных вывода. Фраза «до локального описания событие кандидата не записано» описывает конкретный журнал и его покрытие. Фраза «до локального описания сетевой активности не было» шире и требует свидетельств из соответствующей точки сетевого наблюдения. Ненулевое значение разрешает предварительный сбор, но не доказывает, что определённый сервер был связан в определённое время. Записывайте то, что показывает каждый источник; остальное оставляйте неизвестным.

Ограниченный жизненный цикл пула

У пула определённая роль в согласовании; это не кеш, повторно используемый при каждом следующем обмене. В разделе 3.5.4 RFC 9429 описана последовательность: когда setLocalDescription начинает сбор для первого обмена offer/answer, реализация должна сначала проверить наличие кандидатов в пуле. Доступные кандидаты следует передать приложению через события кандидатов. Если пул исчерпан, потому что нужно больше компонентов или времени на сбор не хватило, остальные кандидаты собираются обычным образом. RFC указывает, что такое применение пула относится к первому обмену offer/answer; после него пул очищается и больше не используется.

RFC использует «SHOULD» для передачи доступных кандидатов. Сохраняйте эту модальность: это нормативная рекомендация, а не доказательство, что конкретный пул завершил сбор к определённому времени. В том же разделе сказано, что поддержание предварительно собранных кандидатов может расходовать ресурсы настроенных STUN- или TURN-серверов. Это ресурсное последствие, указанное RFC, а не измеренный объём трафика или обещанная длительность хранения в конкретной сборке браузера.

Момент настройки тоже ограничен. Алгоритм WebRTC отвергает изменение iceCandidatePoolSize, если setLocalDescription уже вызывался. Для этого ограничения метод сообщает InvalidModificationError, но имя исключения само не устанавливает причину: его могут вызвать и другие изменения. В полезной записи инцидента нужны прежняя и запрошенная конфигурации, порядок вызовов и контекст исключения. Без этого приписывать ошибку размеру пула означает делать предположение.

ЭтапИнтерпретация пулаВидимое приложению свидетельствоЧего запись установить не может
Создание с размером 0Эта настройка не запрашивала предсборНачальный снимок конфигурацииЧто дальнейшего сбора не будет
Создание с ненулевым размеромПредварительный сбор разрешён при подготовкеЗапрошенный размер; отдельное наблюдение сервера, если естьЧто пул заполнен или событие страницы уже произошло
До локального описанияРазмер можно выбрать или изменить по правилам APIСнимки конфигурации и порядок вызововЧто запрошенный пул уже готов
Сбор первого локального описанияДоступные кандидаты следует передать; недостающие собираются обычноСобытия и жизненный цикл локального описанияПолную раннюю сетевую хронологию только по событиям страницы
После первого обменаНачальный пул пуст и больше не применяетсяИстория согласованияЧто поздний перезапуск восстановит пул
Поздний ICE restartЧерез согласование запрашивается новое поколение ICEВызов перезапуска и следующая сигнализацияЧто прежняя активность стёрта

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

ICE restart является последующим действием согласования, а не кнопкой возврата. restartIce() запрашивает перезапуск для следующего согласования. Он не удаляет прежнее событие задним числом, не стирает серверный журнал и не восстанавливает начальный пул после его расходования при первом обмене offer/answer. Если отчёт охватывает несколько поколений, помечайте этап каждой записи. Иначе кандидата после перезапуска можно ошибочно связать со свидетельствами начального обмена.

Разделяйте уровни наблюдения

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

НаблюдениеПоддерживает выводСамо по себе не поддерживает
iceCandidatePoolSize: 0 до согласованияЭта настройка не запрашивала предсборЧто кандидаты никогда не будут собираться
Ненулевой настроенный пулПредсбор был запрошенЧто сбор завершён или пул всё ещё доступен
Время события кандидатаСтраница получила событие в записанный моментЧто первая сетевая активность была именно тогда
Вызов setLocalDescriptionПриложение вошло в этап локального описанияЧто все кандидаты уже собраны
Вызов restartIce()Приложение запросило перезапуск для дальнейшего согласованияЧто начальный пул восстановлен или история стёрта
Нет события в частичной трассеВ записи этого события нетЧто вне окна записи не было активности

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

Не связывайте время события страницы с предполагаемым временем STUN-запроса, если независимого сетевого наблюдения нет. Это может быть гипотезой для проверки, но не наблюдённым фактом. То же относится к экспорту, который удаляет поля: отсутствие поля может означать, что его опустил экспортёр, а не что браузер его не создавал. Сохраняйте происхождение записи: исходный уровень, интервал, этапы преобразования и точку сохранения.

Для повторяемого сравнения определяйте наблюдения одинаково в обоих запусках. Если один записывает вызовы API с момента создания соединения, а другой начинает с первого callback кандидата, видимые хронологии не выровнены. До сравнения составьте небольшую таблицу: определение события, источник часов, граница начала и правило обработки пропусков. Это метод проверки собственных тестовых систем; он не требует раскрывать кандидаты или обращаться к сторонним endpoint.

Разбор неполной хронологии

Если в отчёте адрес назван «поздним», сначала определите смысл слова. Это может быть первое событие кандидата в коде страницы, первый кандидат локального описания, первое событие, сохранённое экспортом, или первое наблюдение в разрешённом серверном журнале. Эти отметки времени не взаимозаменяемы. Проверьте, началась ли запись до создания соединения и сохранилась ли начальная конфигурация. Затем проверьте, был ли уже вызван setLocalDescription при попытке изменить размер пула.

СимптомСначала проверитьНе делать вывод
Нет события до локального описанияЗапрашивался ли сбор и охватывает ли запись раннюю активностьЧто не было предсбора или обращения к серверу
Событий после описания меньше ожидаемогоХватило ли пулу времени или ёмкости; обычный сбор может продолжатьсяЧто соединение сорвалось только из-за малого пула
InvalidModificationError при настройкеКакое поле изменилось и вызывался ли setLocalDescriptionЧто причиной обязательно был размер пула
События после restartIce()Вызов, порядок согласования и полнота записиЧто прежнее поколение или активность исчезли
Серверный и страничный журналы расходятсяЧасы, границы, фильтрацию и точку наблюденияЧто одна запись описывает другой уровень

Эта последовательность привязывает диагностику к свидетельствам. Начните с порядка вызовов и охвата записи. Сравните запрошенное значение с фактически записанным до локального описания. Отделите ошибки конфигурации от передачи событий. Сравнивайте записи страницы и сервера только если обе получены с разрешением. Если элемент отсутствует, отметьте пробел вместо подстановки предполагаемого значения по умолчанию или выдуманного времени события.

Если начальная конфигурация или интервал записи недоступны, пометьте хронологию как неполную. Не восстанавливайте исходное намерение по финальному списку кандидатов. Такой список является сохранённым результатом, а не полной историей его появления. Если у экспорта нет происхождения, укажите, что история преобразований неизвестна. Менее категоричный отчёт полезнее, когда другой инженер понимает, какой отсутствующий факт мог бы изменить трактовку.

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

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

Граница политики BotBrowser

Документация BotBrowser по WebRTC описывает выбор и настройку политик адресов для управляемых сессий. Это источник о продуктовых средствах управления. Значение пула по умолчанию, его жизненный цикл в первом обмене и обработка локального описания описаны WebRTC и JSEP. Публичная документация продукта не обещает отдельную настройку размера пула, предварительный сбор каждого кандидата или удаление прежней активности сервера после поздней смены политики.

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

FAQ

Гарантирует ли ненулевой пул готовность кандидатов до согласования?

Нет. Он запрашивает предварительный сбор, но RFC 9429 описывает исчерпание пула или нехватку времени на сбор. Доступные кандидаты должны передаваться при начале сбора; настройка не подтверждает завершение.

Исправит ли изменение размера после локального описания прежнюю запись?

Нет. Алгоритм set-configuration W3C ограничивает это изменение после вызова setLocalDescription(). Поздняя настройка не переписывает предыдущий журнал или серверное наблюдение.

Восстанавливает ли restartIce() начальный пул?

Нет. Он запрашивает перезапуск для следующего согласования. У него отдельное окно свидетельств, и он не стирает прежнюю сетевую активность.

Источники

Практический вывод

Храните конфигурацию, события страницы и наблюдения сервера как отдельные свидетельства. Записывайте окно сбора и порядок вызовов; если чего-либо не хватает, отмечайте хронологию как неполную, а не делайте вывод об отсутствии прежней сетевой активности.

#WebRTC#ICE#приватность#сеть#fingerprinting

Эта статья входит в руководство: Что такое утечка IP через WebRTC? Защита и конфиденциальность

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.