Все знают, что есть номинации на «Оскар». На самом деле, есть номинации в ICE of WebRTC. Существуют регулярные номинации и радикальные номинации, и выдвинутые кандидаты не обязательно являются лучшими кандидатами. Эта статья поможет вам исследовать тайну. Содержание статьи в основном описывает статус, связанный с ICE, и механизм номинации ICE в RFC 5245 , а также анализирует его в сочетании с версией libnice (0.14).
Автор: Диаграммы, Али
версия разработчика облачных сервисов : Тайский старший инженер по разработке облачных вычислений Али
Сцена
При анализе проблемы я столкнулся с таким сценарием: кандидат на сервере и три кандидата с разными приоритетами на клиенте, но в итоге была выбрана пара с самым низким приоритетом.
На сервере есть Relay Candidate, порт 50217.
a = кандидат: 3 1 udp 503316991 11.135.171.187 50217 тип реле raddr 10.101.107.25 rport 40821
У клиента есть три кандидата, порты 50218 (средний приоритет), 50219 (самый низкий приоритет) и 50220 (самый высокий приоритет).
Candidate 1:
candidate:592388294 1 udp 47563391 11.135.171.187 50219 typ relay raddr 0.0.0.0 rport 0 generation 0 ufrag fO75 network-cost 50
Candidate 2:
candidate:592388294 1 udp 48562623 11.135.171.187 50218 typ relay raddr 0.0.0.0 rport 0 generation 0 ufrag fO75 network-cost 50
Candidate 3:
candidate:592388294 1 udp 49562879 11.135.171.187 50220 typ relay raddr 0.0.0.0 rport 0 generation 0 ufrag fO75 network-cost 50
Но последний выбор - пара с самым низким приоритетом, 50219.
Remote selected pair: 1:1 592388294 UDP 11.135.171.187:50219 RELAYED
Кандидатский фонд
Фонд кандидата: Позвольте мне сначала упомянуть Фонд, который будет иметь статус замороженного.
Для одного и того же канала могут быть разные кандидаты. Например, при обнаружении Relay Candidate может быть сгенерирован новый кандидат Server Reflexive, но все они основаны на одном локальном адресе (IP, порт) и протоколе, тогда Можно считать, что эти сети похожи, и у них будет один и тот же фундамент. Среди них Foundation - это первое поле в SDP, которое в следующем примере равно «7».
a=candidate:7 1 udp 503316991 11.178.68.36 51571 typ relay raddr 30.40.198.7 rport 55896
Состояния ICE
ICE в основном имеет следующие пять состояний, из которых первые четыре являются нормальными состояниями, а пятое состояние Frozen включает алгоритм ICE Frozen .
Пять состояний ICE:
- Ожидание: когда проверка подключения еще не началась (запрос привязки не был отправлен).
- In Progress: Когда проверка подключения отправлена, но соответствующая транзакция проверки все еще выполняется (отправлен запрос привязки).
- Успешно: проверка подключения завершена, и результат успешно возвращен (запрос привязки выполнен).
- Сбой: проверка подключения была выполнена, результат не удалось (запрос привязки был выполнен).
-
Frozen :, все пары кандидатов находятся в этом состоянии после завершения инициализации. Для одного и того же Foundation (аналогичного кандидата) одна пара будет выбрана в соответствии с приоритетом, Unfreeze, и установлена в состояние ожидания, в то время как другие останутся Frozen. Пока выбранная пара не будет завершена, разморозить другую пару будет продолжено.
Номинация ICE
У ICE есть два метода номинации:
1.Обычная номинация
При обычной номинации основной рабочий процесс выглядит следующим образом:
L R
- -
STUN request -> \ L's
<- STUN response / check
<- STUN request \ R's
STUN response -> / check
STUN request + flag -> \ L's
<- STUN response / check
Regular Nomination
Агент в режиме управления инициирует запрос привязки и получает ответ от противоположной стороны. В то же время завершается проверка подключения, инициированная противоположной стороной. Управляющая сторона снова отправит запрос привязки с битом флага USE_CANDIDATE. Когда управляемая сторона получит его, она примет назначение. .
2. Агрессивная номинация
Помимо обычной номинации, есть еще более радикальная номинация, к обычной номинации добавится рукопожатие.
L R
- -
STUN request + flag -> \ L's
<- STUN response / check
<- STUN request \ R's
STUN response -> / check
Figure 5: Aggressive Nomination
Агент в режиме управления инициирует запрос привязки, но этот запрос привязки будет напрямую переносить бит флага USE_CANDIDATE. Агент в управляемом режиме примет назначение после его получения. В агрессивном режиме номинации процесс подтверждения может быть сохранен, но когда несколько пар принимают номинации одновременно, они будут выбраны в соответствии с их соответствующими приоритетами, а пара с наивысшим приоритетом будет выбрана в качестве фактического канала.
реальный сценарий:
Обновление состояний при выдвижении
При создании новой номинации внутреннее состояние ICE будет соответственно изменено.
Когда в запросе на привязку на одном конце установлен флаг использования кандидата, будет сгенерирована номинация (номинация).
Независимо от того, находится ли агент в контролируемом или контролируемом режиме, рекомендуемые правила обновления статуса для обработки выдвижения следующие:
- Если номинированной пары нет, продолжите процесс проверки подключения.
- Если есть хотя бы одна действительная номинация:
- Агент должен удалить все пары Ожидание и Замороженные в Компоненте.
- Для пары в состоянии In Progress, если приоритет ниже, чем приоритет текущей назначенной пары, остановите повторную передачу (отмените).
-
Когда все Компонты определенного Стрима имеют хотя бы одну номинацию, а проверка еще продолжается:
- Агент должен отметить поток как завершенный.
- Агент может начать передачу медиапотока.
- Агент должен постоянно отвечать на полученные сообщения.
- Агент должен повторно передать пару, которая в настоящее время находится в состоянии «Выполняется» (приоритет выше, чем назначенный в настоящее время, в противном случае она была удалена или отменена).
-
Когда все пары в контрольном списке заполнены:
- ДВС в комплекте.
- Контролирующий агент обновляет предложение на основе приоритета (похоже, в WebRTC этого шага нет).
-
Если проверка контрольным списком не удалась:
- Когда все пары выйдут из строя, выключите ICE.
- Когда проверка определенного потока успешна, контролирующий агент удаляет неудачную пару и обновляет предложение.
- Если некоторые проверки не завершены, ICE продолжает работу.
Планирование проверок
При описании номинации это также будет включать в себя планирование пары ICE (когда действительный кандидат все еще находится в процессе, но пара другого кандидата получила запрос на привязку).
Здесь обсуждается только Full, а упрощенный режим не описывается в первую очередь.
Проверки ICE делятся на два типа: обычные проверки и проверки с запуском.
- Обычные проверки - это обычные проверки пар, что означает, что эти проверки пар являются проверками состояния, переключенными из обычного процесса.
- Triggered Check - это пассивно инициируемая проверка. Хотя эти пары все еще находятся в состоянии, в котором они не могут быть проверены, они получают проверку подключения с противоположного конца. В это время пара будет ускорена и помещена непосредственно в список планирования.
Когда ICE составляет контрольный список (по одному для каждого потока), таймер будет добавлен в каждый контрольный список. Когда таймер прибудет, будет выполнено следующее планирование:
Примечание: здесь немного непонятно, весь процесс кажется последовательным, а скорость активации немного медленная.
- Первое расписание Triggered Check и выполнение.
- Если нет, отправьте пару состояний ожидания с наивысшим приоритетом, отправьте запрос и установите состояние In Progress.
- Если нет, найдите в Контрольном списке пару замороженных состояний с наивысшим приоритетом, разблокируйте ее и отправьте запрос с состоянием «Выполняется».
-
Если нет, прекратите планирование.
Дело проанализировано
После краткого понимания процесса ICE мы вернемся к исходному кейсу.
Сначала посмотрите на Добавить кандидата. Три удаленных кандидата добавляются в другом порядке, за ними идут 50219, 50218 и 50220. Обратите внимание, что в это время 50219 получил запрос привязки с противоположной стороны, агрессивно назначен и передал USE_CANDIDATE, поэтому разрешение на создание будет выполнено и завершено в ближайшее время. Вы можете начать отправку запроса привязки, который относится к планированию приоритета инициируемых проверок, отправить запрос привязки и перейти в состояние «Выполняется».
Примечание. В дополнение к паре локальных реле существует также кандидат типа локального хоста, который взаимодействует с Turn.
Затем в 50219, когда два других разрешения на создание не были завершены, проверка была завершена быстро.Согласно описанию в rfc 8.1.2, все пары, которые не находятся в состоянии In Progress, удаляются, и их приоритет не упоминается. Таким образом, была окончательно выбрана пара с самым низким приоритетом 50219.
"Video Cloud Technology" Ваш самый заметный официальный аккаунт в области аудио- и видеотехники, еженедельно публикует практические технические статьи с переднего края Alibaba Cloud и обменивается идеями с первоклассными инженерами в области аудио и видео.