Voice over Internet Protocol (VoIP
) — сегодня это один из самых популярных стандартов для голосовых и видеозвонков в мире Интернет. В этой заметке я попробую на простых примерах рассказать, как работают голосовые и видеозвонок.
Почти каждый день мы с вами используем голосовые либо видеозвонка в различных приложениях, таких как Skype, Viber, Telegram, WhatsApp, Facebook Messenger или Webitel 🙂 В общем, передача аудио либо видео зависит от того, как приложение передаст медиапоток между двумя клиентами. И в большинстве случаем для потоковой передачи мультимедиа мы используем WebRTC.
WebRTC — это стандарт c открытым исходным кодом, который предоставляет браузеры и мобильные приложения возможности взаимодействовать в реальном времени (RTC
) через простые API. Все компоненты WebRTC были оптимизированы именно для работы мультимедиа в различных сетях интернет.
Но наличие только WebRTC не достаточно. Наши клиенты могут находиться в разных сетях, требовать дополнительные функции и много других вещей, без которых только WebRTC недостаточно, а именно:
- Сигнальный протокол
- STUN
- TURN
Что такое сигнализация?
Чтобы установить соединение между двумя клиентами, оба клиента должны понимать друг другу, говорить на одном языке. Именно с помощью сигнального протокола наши клиенты договариваются об используемых кодеках, о наборе функций, о переводах и завершениях вызова… В большинстве случаем для сигнализации используется WebSocket соединение.
Да, в webitel мы используем сигнальный протокол verto.
После того, как наши клиенты договорились о всем необходимом для соединения, нам нужен IP-адрес обоих клиентов, а для получения последнего, мы используем STUN-сервер.
STUN
STUN Server используется для получения общедоступного IP-адреса.
Зачем нужен общедоступный IP-адрес?
Общедоступный IP-адрес (Public IP) — это IP-адрес, уникальный по всему миру. Только одно устройство может иметь такой IP.
Частный IP-адрес (Private IP) — это IP-адрес, который не является уникальным глобально и может существовать одновременно на разных устройствах. Частный IP-адрес никогда не подключается напрямую к Интернету. Устройства, которые имеют частный IP-адрес, будут находиться в своем собственном уникальном IP-пространстве (например, локальная сеть компании).
Поскольку технология NAT (Network Address Translation) позволяет устройствам с локальным IP-адресами выходить в Интернет под единым общедоступным IP-адресом, нам необходимо его узнать. STUN Server помогает в этом.
Если мы получили публичный IP-адрес клиента, то теперь можем начать мультимедийный вызова через WebRTC.
Но, реальный мир не идеален 🙂
TURN
Что делать, если связь устанавливается, но голос либо видео не проходит? В таких случаях используется TURN сервер. В общем, он берет медиаданные от одного клиента и отправляет другому клиенту. Его задача — ретрансляция медиа. Таким образом, оба клиента начинают общаться между собой.
Все другие данные, не связанные с медиа — отправляются по сигнальному протоколу. Возникает вопрос: Почему WebRTC не может сразу же и быть сигнальным протоколом?
Ответ прост: Чтобы избежать избыточности и стать максимально совместимым, WebRTC описывает только обмен медиа данными между конечными устройствами. А вот сигнальный протокол — каждый пишет под себя, что кому нужно 😉