Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
WebRTC позволяет браузерам обмениваться информацией напрямую без сервера. Можно передавать видео, звук и данные.
Для соединения браузеры должны обменяться параметрами соединения: SDP и ICECandidate-ами
SDP описывает требования к соединению: что будет передаваться видео/аудио/ текст, какие кодеки поддерживаются. ICECandidate-ы это адреса, куда можно посылать пакеты.
Для WebRTC соединения нужно:
Обменяться требованиями к соединению.
Обменяться адресами.
Обмен параметрами соединения называется Signaling
Обменяться параметрами можно вручную через мессенджер или сделать сигнальный сервер.
Соединения между браузерами еще нет, но нужно обменяться начальными параметрами - см. Рис 2.
Параметры представлены в виде строк. Их можно отправлять друг другу вручную, например через мессенджер.
Можно автоматизировать. Сделать сигнальный сервер, который будет пересылать параметры между клиентами.
Обмен требованиями к соединению: SDPOffer, SDPAnswer
Требования к соединению зависят от задачи. Например, для видеосвязи браузеры должны выбрать кодек, который оба поддерживают. В браузерах есть API для формирования SDP.
См. Рис 2. “Session descriptors exchange”.
Алиса формирует SDPOffer с указанием поддерживаемых кодеков. Отправляет Бобу.
Боб получает SDPOffer и на его основе формирует SDPAnswer: выбирает кодек который есть у него и в SDPOffer. Обратите внимание - нельзя сформировать SDPAnswer без SDPOffer. Боб отправляет SDPAnswer Алисе.
Алиса устанавливает SDPAnswer: для трансляции будет использоваться кодек из SDPAnswer.
Обмен адресами: ICECandidate-ами
ICECandidate-ов может быть несколько. Например один адрес в локальной сети, другой во внешней. Чтобы узнать свой адрес нужен STUN сервер.
См. Рис 2. “Address exchange”.
Алиса узнает свои адреса по которым она может получать пакеты. И отправляет их Бобу. Боб выбирает из полученных адресов-кандидатов.
У Алисы может быть несколько адресов. Например один адрес в локальной сети, другой во внешней. Если Боб в той же локальной сети, Алиса и Боб соединяться по локальному адресу.
Браузер не знает свой адрес. Чтобы узнать свой адрес браузер делает запрос к специальному STUN серверу. STUN сервер сообщает браузеру его (браузера) внешний адрес. Есть публичные STUN сервера, например у Google.
Хорошая статья про узнавание своих адресов: Просто о WebRTC.
Можно сразу получить все свои ICECandidate-ы и отправить в составе SDP
В этом случае Боб сразу получает все необходимые параметры для соединения. Но, почему то, даже зная все ICECandidate-ы Алисы, не может ответить по WebRTC. Все равно нужно передать SDPAnswer через signaling.
Обратите внимание: Боб не может отправить SDPAnswer по WebRTC. Пока Алиса не установит SDPAnswer - WebRTC не случится. Почему так - не понятно.
Из-за этого ограничения приходится делать сигнальный сервер. Если бы не ограничение, Алиса могла бы отправить Бобу ссылку с зашитыми параметрами. Боб мог бы получить из ссылки все что нужно и сразу установить WebRTC.