Если вы планируете разработать приложение для коммуникации в реальном времени, например чат, следует тщательно выбирать технологии. В этой статье Анастасия Иванова, технический писатель платформы МТС Exolve (входит в экосистему МТС), сравнивает два популярных инструмента — протоколы WebSockets и XMPP — и определяет, какой из них подходит под конкретные задачи.

Что такое протокол XMPP

XMPP (Extensible Messaging and Presence Protocol, или Jabber) — протокол обмена сообщениями в реальном времени с открытым исходным кодом. Его создал программист Джереми Миллер в конце 90-х как альтернативу закрытым программам для обмена сообщениями. Недавно технологию стандартизировала инженерная группа интернета (IETF), а само решение быстро стало популярным среди разработчиков чат-приложений.

XMPP назначает каждому клиенту в сети XMPP-адрес (JabberID) для идентификации — так же, как стандартный email с IP-адресом или доменным именем.

Интересно, что XMPP описывает формат и поведение связи, но нестрого определяет «транспорт», который отправляет сообщения по сети. По умолчанию XMPP использует TCP (протокол управления передачей) для обмена данными XML (расширяемый язык разметки) между конечными точками сети. Однако некоторые корпоративные брандмауэры блокируют обмен данных при использовании TCP. Чтобы решить проблему, сообщество XMPP разработало HTTP-транспорт Bosh: его можно использовать в качестве запасного варианта, а также для установления стабильных соединений через HTTP, обеспечивая асинхронную связь между клиентами и серверами XMPP.

XMPP также не поддерживает передачу двоичных данных, он работает только с текстовыми — в формате XML. Синтаксис XML многословен и избыточен по сравнению с другими текстовыми форматами обмена данных (например, JSON).

Однако XMPP завоевал популярность, потому что легко масштабируем и в нём много плагинов:

  • расширение для поддержки асинхронного обмена сообщениями

  • система публикации или подписки

  • сигнализация для VoIP

  • видео, передача файлов, игры

  • приложения интернета вещей (IoT), включая интеллектуальную сеть и службы социальных сетей

XMPP-архитектура

XMPP использует архитектуру «клиент — сервер». Сообщения маршрутизируются между пользователями через серверы, а не напрямую. XMPP применяет концепцию децентрализации, при которой процесс разработки происходит не на одном программном компоненте. Вы можете создавать собственные серверы для обработки маршрутизации сообщений, а пользователи — для хранения данных.

В архитектуру XMPP также входят шлюзы: они расположены между серверами XMPP и теми, которые обрабатывают другие протоколы (например, SMS и SMTP), и обеспечивают возможность трансляции. Значит, вы можете разрабатывать сервисы для общения людей между собой при помощи различных каналов — SMS (хотя тут мы, конечно, выступаем за SMS API без заморочек), электронной почты, XMPP и других.

Схема XMPP-архитектуры
Схема XMPP-архитектуры

Открытый архитектурный стиль вносит значительный вклад в гибкость и масштабируемость XMPP, при этом контроль над системой легко разделить между несколькими владельцами.

Безопасность XMPP

Основные спецификации XMPP предусматривают несколько уровней безопасности:

  • простой уровень аутентификации и безопасности (SASL) для аутентификации безопасного соединения и защиты данных в интернет-протоколах

  • шифрование «точка — точка» (TLS) и многоканальное шифрование (OMEMO) для безопасной передачи данных

Надёжная защита информации делает XMPP удобным решением для разработчиков, ведь функции безопасности уже реализованы и бесплатны.

Есть множество библиотек для создания платформ XMPP на разных языках программирования: С#, .NET, Python, Java (включая Android), C++, Swift, Rust и др. Подробный список можно найти на XMPP Libraries & Tools.

Преимущества и недостатки XMPP

Преимущества:

  • XMPP — протокол с поддержкой внушительного сообщества

  • имеет множество доступных расширений, а значит не нужно реализовывать их самостоятельно

  • высокий уровень безопасности, доступный «из коробки» (хотя, конечно, про высокую защиту лучше рассуждать в контексте Messaging API от МТС Exolve или готовых продуктов, нежели на уровне протокола)

  • совместимость с другими форматами обмена сообщениями через шлюзы XMPP (SMS, SMTP и т. д.)

  • децентрализованная архитектура XMPP позволит создавать несколько управляющих серверов

  • функциональность — есть готовые решения для обмена сообщениями

Недостатки:

  • нет поддержки передачи двоичных данных, что может быть серьёзным ограничением. Внутри XML, который менее эффективно использует память по сравнению с облегчёнными JSON и MessagePack

  • доставка сообщений происходит медленнее, чем у WebSockets, а соединения XMPP нестабильны. Это существенно снижает пропускную способность

  • некоторые корпоративные брандмауэры блокируют такую передачу сообщений. Чтобы решить проблему, сообщество XMPP разработало HTTP-транспорт

  • нет гарантий обмена сообщениями: сейчас XMPP не поддерживает QoS

Что такое протокол WebSocket

WebSocket — тонкий транспортный уровень. Он построен поверх стека TCP/IP, который обеспечивает управляемые событиями соединения с малой задержкой между сервером и браузером. Протокол WebSocket опубликовали IETF в 2011 году, и сегодня с ним работают такие популярные приложения, как Trello, Slack и Discord.

Технология поддерживает передачу и текстовых, и двоичных данных. Здесь нет жёстких ограничений на одновременные соединения — это зависит только от возможностей используемой системы. А значит, масштабируемость станет проще, чем при работе с XMPP.

Передача сообщений через WebSocket происходит намного быстрее, в его арсенале огромное количество доступных библиотек и расширений. Есть проблемы с некоторыми корпоративными брандмауэрами, блокирующими передачу сообщений, поэтому иногда требуется откат HTTP.

Архитектура WebSocket

WebSocket использует централизованную клиент-серверную архитектуру. Сообщения передаются между клиентами через серверы, а не напрямую. Обычно для каждого приложения существует единая система управления для обработки маршрутизации данных. Клиенты подключаются к ней, указывая конечную точку URL-адреса сервера.

Одно соединение WebSocket может обрабатывать все сообщения для одного сеанса и сохраняется до закрытия.

Функции идентификации и аутентификации в WebSocket платные, придётся добавлять их самостоятельно. Протокол поддерживает следующие языки и библиотеки:

  • JavaScript (socket.IO, SockJS)

  • NET (SignalR)

  • Java (ServerSocket, Jetty)

  • Python (websocket-client) и другие

WebSocket API для подключения к серверам WebSocket работает во всех основных браузерах (см. таблицу поддержки браузеров WebSockets). Также доступны клиенты для Windows, macOS, Linux, Android, iOS.

Преимущества и недостатки WebSocket

Преимущества:

  • скорость: одно соединение WebSocket обрабатывает все сообщения для одного сеанса, соединение постоянное, а скорость передачи выше, чем у XMPP

  • WebSocket передаёт двоичные данные и UTF-8; приложения поддерживают отправку простого текста и двоичных форматов, таких как изображения и видео

  • поддержка целостности данных: предоставляется гарантия доставки сообщений

  • ограничений на количество одновременных подключений между клиентом и сервером гораздо меньше, чем у XMPP

Недостатки:

  • некоторые корпоративные брандмауэры с проверкой пакетов проблематично работают с WebSocket (особенно SophosXG Firewall, WatchGuard и McAfee Web Gateway)

  • нет встроенной поддержки повторного подключения: когда соединение WebSocket закрыто (например, из-за проблем с сетью), клиент не пытается повторно подключиться к серверу. То есть потребуется написать дополнительный код для опроса сервера, повторного подключения и установления соединения при появлении возможности. В качестве альтернативы можно использовать библиотеку с поддержкой переподключения, например Socket.IO

  • не настолько масштабируемый, как XMPP

  • WebSocket не такой безопасный, как XMPP. Нужны решения для функции аутентификации, самостоятельные или из дополнительной библиотеки

  • по умолчанию в протоколе меньше функций обмена сообщениями, чем в XMPP

  • не так развит, как XMPP, хотя имеет лучшую поддержку на веб-платформе (например, встроенная поддержка браузера)

  • WebSocket не так открыт, как XMPP, что может стать проблемой для определённых решений

Что лучше: XMPP или WebSocket

И XMPP, и WebSockets — рабочие инструменты для создания чат-приложений. Выбор протокола зависит от нескольких ключевых факторов.

XMPP — более зрелая технология с открытым кодом и множеством доступных расширений и библиотек, но она не поддерживает передачу двоичных данных. Решение лучше адаптировали для чатов, оно по умолчанию поставляется с несколькими встроенными уровнями безопасности.

WebSockets новее, имеет качественную поддержку браузеров, мощный набор доступных библиотек для облегчения функций чата (например, Socket.IO) и превосходит XMPP в скорости и производительности. Протокол быстрее передаёт большие объёмы данных с постоянными подключениями.

Есть бесчисленное множество веб-сайтов и приложений с применением XMPP, WebSocket или даже двух протоколов. Если интересно, ниже приведён список.

Приложения, использующие XMPP:

  • WhatsApp использует собственную версию XMPP

  • Apple использует XMPP для доставки push-уведомлений

  • Grindr, приложение для знакомств на основе геолокации, использует XMPP для функций чата

Веб-приложения, использующие WebSocket:

  • Trello, приложение для совместного управления задачами, использует WebSocket

  • Slack использует WebSocket на порту 443

  • Discord, популярная платформа игрового чата, также использует WebSocket

И XMPP, и WebSocket внедрили в Zoom. Он использует XMPP для чата и WebSocket в качестве транспортного протокола.

Если необходимо отправлять туда и обратно несколько типов данных, особенно двоичные, то выбирайте WebSocket. Если нужно открыть несколько подключений для каждого пользователя, опять же лучше WebSocket. В скорости он также выигрывает.

Если у вас серьёзные опасения по поводу безопасности, то попробуйте XMPP. Он же понадобится, если нужно побольше встроенных функций и необходима экосистема плагинов для расширения возможностей.

Но нужно понимать, что с практической точки зрения меньше ресурсов отнимает работа с готовыми API вроде Messaging API. Особенно, если в итоге придётся соединять разные каналы в один агрегат и думать про защиту данных. Просчитать логику работы одной системы с разными протоколами — та ещё задачка.

Что в итоге?

И XMPP, и WebSockets — работающие решения для создания чат-приложений. Выбор технологии зависит от нескольких ключевых факторов.

XMPP — более зрелая технология с открытым кодом, множеством доступных расширений и библиотек, но она не поддерживает передачу двоичных данных. Инструмент адаптирован для чат-приложений и по умолчанию поставляется с несколькими встроенными уровнями безопасности.

WebSockets новее, имеет качественную поддержку браузеров, мощный набор доступных библиотек для облегчения функций чата и превосходит XMPP в скорости и производительности. Он быстрее передаёт большие объёмы данных с постоянными подключениями.

Исходя из всего вышеперечисленного, можно сделать вывод:

  • выбирайте XMPP, если хотите масштабируемости, гибкости и безопасности

  • выбирайте WebSockets, когда нужны скорость, производительность, высокий параллелизм и целостность данных (заказ и гарантированная доставка)

Комментарии (19)


  1. abutorin
    08.11.2023 14:39
    +20

    Странно сравнивать протокол обеспечивающий "транспорт" с протоколом "приложения". Ну можно еще сравнить UDP и HTTP.


  1. mayorovp
    08.11.2023 14:39
    +3

    Странное сравнение и странные выводы.

    XMPP следует использовать если важны сторонние клиенты, готовые сервера или открытое межсерверное взаимодействие.

    В остальных случаях веб-сокеты гораздо легковеснее и проще, к тому же поддерживаются браузером (т.е. возможно сделать веб-клиент).


    1. outlingo
      08.11.2023 14:39
      +1

      Я бы сказал, что вообще странно что надо что-то "выбирать", ведь и XMPP и WebSocket это по сути транспорт от клиента к серверу, и этих транспортов может быть более чем один, внезапно. Причем работающих одновременно. Никому же не приходит в голову выбирать протокол доступа к файловому серверу - SMB, FTP, AFP, WebDAV или NFS? Включаем все которые нужно - клиент сам определит какой ему больше подходит.


      1. mayorovp
        08.11.2023 14:39

        Ну, если сервер не совсем файловый, а таковым лишь притворяется - то выбирать протоколы всё же придётся, реализовывать всё подряд будет дорого. Ну и не забываем про безопасность, у того же NFS схема проверки прав доступа слишком отличается от остальных.


      1. HemulGM
        08.11.2023 14:39
        +2

        XMPP скорее протокол, нежели транспорт. Его можно реализовать и на веб-сокетах (как есть реализация транспорта по HTTP). А WebSocket не имеет строгого протокола общения.


  1. Sazonov
    08.11.2023 14:39
    +9

    Внезапно узнал, что поддержка вебсокетов зависит от прикладного языка программирования. Пойду проверю, что у меня boost продолжает нормально поддерживать работу с вебсокетами в С++ приложении, а то после прочтения статьи я засомневался.

    Статья - сравнение тёплого с мягким. МТС в последнее время решил взяться за Хабр, но получается как-то совсем не очень. Следующая статья наверное будет про платные ВПН.


    1. outlingo
      08.11.2023 14:39
      +1

      Причем хорошо если не про неработающие в МТС платные VPN и про платный VPN как сервис от самой МТС.

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


      1. strelkan
        08.11.2023 14:39
        +2

        тамбовские волки им коллеги. мало того что жадные, так её и подобную невнятную чепуху постят


  1. ivankudryavtsev
    08.11.2023 14:39
    +2

    Странно, что сравнение делает техписатель. Может сотрудник underpaid и его надо до аналитика или архитектора повышать? Анастасия, Вы себя не цените.


  1. alexxz
    08.11.2023 14:39
    +2

    Странное сравнение, честное слово. Это взаимодополняющие друг друга технологии и WebSocket может быть транспортом для XMPP.

    Параграф сарказама. А чего не сравнили XMPP с http например? Такое же сравнение тёплого с мягким бы получилось.

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

    А вот упомянутый BOSH - та ещё заноза. Вечно какие-то фокусы с ним были. По сути свой - http long polling, чего, кстати, не любят те самые корпоративные файрволы.


  1. MANAB
    08.11.2023 14:39
    +2

    Еще бы с RabbitMQ сравнили - там же тоже сообщения шлются.


  1. barker
    08.11.2023 14:39
    +2

    всё стало ясно на втором абзаце, там где xmpp недавно стандартизировала инженерная группа интернета. дальше просто какой-то набор слов, сравнение заведомо несравнимого, дублирующиеся абзацы, выводы по три раза и прочие ляпы.


    1. SkyHunter
      08.11.2023 14:39
      +1

      Может, свою версию GPT тестируют в МТС :)


  1. qrKot
    08.11.2023 14:39
    +3

    Часть "Что лучше: XMPP или WebSocket"

    XMPP — более зрелая технология с открытым кодом и множеством доступных расширений и библиотек, но она... (тут дальше текст)
    WebSockets новее, имеет качественную поддержку браузеров, мощный набор доступных библиотек для облегчения... (тут тоже текст)

    Часть "Что в итоге?"

    XMPP — более зрелая технология с открытым кодом, множеством доступных расширений и библиотек, но она... (тут дальше текст)

    WebSockets новее, имеет качественную поддержку браузеров, мощный набор доступных библиотек для облегчения... (тут тоже текст)

    А если третий раз скопипастить, то и объем текста больше будет, и звучать, наверное, будет убедительней? Жаль, конечно, что осмысленности ни выводам (собранным беглым гуглом из таких же статеек с многабукаф без смысла), ни статье в целом (текст ради текста, сравнивающий теплое с мягким) не придаст.

    МТС, хватит позориться! (И звонить мне раз в неделю с предложением подключить интернет, представляясь по кругу "Крупнейшим интернет-провайдером", "Центром Исследования Технологий Интернет" и "Экспертным Центром Изучения Интернет-Каналов", тоже хватит)


  1. qrKot
    08.11.2023 14:39
    +2

    Функции идентификации и аутентификации в WebSocket платные

    Made my day! Спасибо огромное за такие качественные материалы, повышающие настроение в середине рабочего дня! Пишите еще, пожалуйста, не останавливайтесь!!!


  1. dimitrii_z
    08.11.2023 14:39
    -1

    Как редакция пропускает "такое"? Или если платный блог, то можно любую дичь постить? А если это почитает какой-то студент и решит что это правда, получит неверные знания, и т.д.? Плохие данные всегда хуже чем просто их отсутствие!


  1. VanKrock
    08.11.2023 14:39

    Сейчас ещё и WebTransport появился на замену веб-сокетам


    1. mayorovp
      08.11.2023 14:39
      +1

      Так себе замена, даёт только потоковую передачу (пусть и с неограниченным числом потоков). Веб-сокеты для обмена сообщениями куда удобнее


  1. Lord_Vermilion
    08.11.2023 14:39
    -1

    Я был удивлён, выглядит странно, но имеет место быть, если это работает.