Введение

Протокол связи для ориентированного на сообщения промежуточного программного обеспечения. Протокол расширяемого обмена сообщениями и присутствия (XMPP, первоначально названный Jabber) — это открытый коммуникационный протокол, разработанный для обмена мгновенными сообщениями (IM), информацией о присутствии и ведения списков контактов. Основанный на XML (Extensible Markup Language), он обеспечивает обмен структурированными данными в почти реальном времени между двумя или более сетевыми сущностями. Протокол разработан с учетом возможности расширения и предлагает множество применений, выходящих за рамки традиционных IM, в более широкой области ориентированного на сообщения промежуточного программного обеспечения, включая сигнализацию для VoIP, видеосвязи, передачи файлов, игр и других целей. В отличие от большинства коммерческих протоколов обмена мгновенными сообщениями, XMPP определен как открытый стандарт на уровне приложений. Архитектура сети XMPP аналогична архитектуре электронной почты: любой может запустить свой собственный XMPP-сервер, и центрального главного сервера нет. Этот подход к федеративной открытой системе позволяет пользователям взаимодействовать друг с другом на любом сервере, используя учетную запись пользователя «JID», аналогичную адресу электронной почты. Реализации XMPP могут быть разработаны с использованием любой лицензии на программное обеспечение, и многие серверные, клиентские и библиотечные реализации распространяются как свободное и открытое программное обеспечение. Существует также множество бесплатных и коммерческих программных реализаций. Первоначально разработанный сообществом открытого исходного кода, протоколы были формализованы и утверждены в качестве стандарта обмена мгновенными сообщениями в 2004 году и с тех пор постоянно развиваются с добавлением новых расширений и функций. Различные клиентские программы XMPP доступны для настольных и мобильных платформ, а к 2003 году, согласно XMPP Standards Foundation, протокол использовался более чем десятью миллионами человек по всему миру.

Децентрализация

Сетевая архитектура XMPP напоминает протокол простой передачи почты (SMTP) – модель «клиент-сервер». Клиенты не общаются напрямую друг с другом, поскольку сеть децентрализована, и любой может запустить свой сервер. По замыслу, в XMPP отсутствует центральный авторитетный сервер, в отличие от сервисов обмена сообщениями, таких как AIM, WLM, WhatsApp или Telegram. Часто возникает путаница, связанная с тем, что публичный XMPP-сервер работает на jabber.org, и многие пользователи к нему подключаются. Однако любой может запустить собственный XMPP-сервер на своем домене.

Обращение

Каждый пользователь в сети имеет уникальный XMPP-адрес, называемый JID (по историческим причинам XMPP-адреса часто называют Jabber ID). JID структурирован как адрес электронной почты, состоящий из имени пользователя и доменного имени (или IP-адреса) сервера, на котором зарегистрирован пользователь, разделенных символом «@», например, alice@example.com: здесь alice — имя пользователя, а example.com — сервер, на котором пользователь зарегистрирован. Поскольку пользователь может захотеть войти в систему с разных устройств, он может указать ресурс. Ресурс идентифицирует конкретный клиент, принадлежащий пользователю (например, домашний, рабочий или мобильный). Это можно указать в JID, добавив косую черту, за которой следует имя ресурса. Например, полный JID мобильной учетной записи пользователя может быть username@example.com/mobile. Каждый ресурс может иметь числовое значение, называемое приоритетом. Сообщения, отправленные просто на username@example.com, будут доставлены клиенту с наивысшим приоритетом, а сообщения, отправленные на username@example.com/mobile, будут доставлены только мобильному клиенту. Наивысший приоритет имеет ресурс с наибольшим числовым значением. JID без части имени пользователя также допустимы и могут использоваться для системных сообщений и управления специальными функциями сервера. Ресурс остается необязательным и для таких JID. Возможность маршрутизации сообщений на основе логического идентификатора конечной точки – JID, а не на основе явного IP-адреса, открывает возможности использования XMPP в качестве реализации сети верхнего уровня поверх различных базовых сетей.

XMPP через HTTP

Оригинальным и "родным" транспортным протоколом для XMPP является протокол управления передачей (TCP), использующий открытые потоки XML в рамках долгоживущих TCP-соединений. В качестве альтернативы транспорту TCP сообщество XMPP также разработало транспорт HTTP для веб-клиентов и пользователей, находящихся за ограниченными брандмауэрами. В оригинальной спецификации XMPP мог использовать HTTP двумя способами: через опрос и привязку. Метод опроса, который в настоящее время устарел, по сути подразумевает регулярное извлечение (и отправку) сообщений, хранящихся в базе данных на стороне сервера, XMPP-клиентом посредством HTTP-запросов 'GET' и 'POST'. Метод привязки, реализованный с использованием двунаправленных потоков через синхронный HTTP (BOSH), позволяет серверам отправлять сообщения клиентам сразу после их получения. Эта модель уведомлений более эффективна, чем опрос, при котором многие запросы не возвращают новых данных. Поскольку клиент использует HTTP, большинство брандмауэров разрешают клиентам отправлять и получать сообщения без каких-либо препятствий. Таким образом, в ситуациях, когда порт TCP, используемый XMPP, заблокирован, сервер может прослушивать стандартный HTTP-порт, и трафик должен проходить без проблем. Многие веб-сайты позволяют пользователям входить в XMPP через браузер. Кроме того, существуют открытые публичные серверы, прослушивающие стандартные порты http (порт 80) и https (порт 443), что позволяет устанавливать соединения из-за большинства брандмауэров. Однако зарегистрированный IANA порт для BOSH – 5280, а не 80.

Расширяемость

Фонд стандартов XMPP или XSF (ранее Jabber Software Foundation) активно разрабатывает открытые расширения XMPP, известные как XEP. Однако расширения могут быть определены любым разработчиком, программным проектом или организацией. Для обеспечения совместимости общие расширения находятся под управлением XSF. Приложения XMPP, помимо обмена мгновенными сообщениями, включают: чаты, управление сетями, распространение контента, средства совместной работы, обмен файлами, игры, удалённое управление и мониторинг систем, геолокацию, промежуточное программное обеспечение и облачные вычисления, VoIP и сервисы идентификации. Благодаря возможности обнаружения ресурсов в локальных сетевых доменах, XMPP хорошо подходит для облачных вычислений, где виртуальные машины, сети и брандмауэры обычно создают препятствия для альтернативных решений по обнаружению сервисов и определению присутствия. Облачные вычисления и системы хранения данных используют различные формы коммуникации на нескольких уровнях, включая не только обмен сообщениями между системами для передачи состояния, но и миграцию или распределение больших объектов, таких как хранилища данных или виртуальные машины. В сочетании с аутентификацией и защитой данных при передаче, XMPP может применяться на различных уровнях и может оказаться идеальным расширяемым промежуточным программным обеспечением или протоколом обмена сообщениями (MOM).

Текущие ограничения

На данный момент XMPP не поддерживает качество обслуживания (QoS); гарантированная доставка сообщений должна быть реализована поверх уровня XMPP. Для решения этой проблемы предложено два XEP: XEP 0184 – квитанции о доставке сообщений, который в настоящее время является проектом стандарта, и XEP 0333 – Chat Markers, который считается экспериментальным. Поскольку XML основан на текстовом формате, обычный XMPP имеет большую сетевую нагрузку по сравнению с чисто бинарными решениями. Эту проблему решал экспериментальный XEP 0322: Efficient XML Interchange (EXI), который позволяет сериализовать XML в эффективном двоичном формате, особенно в режиме, ориентированном на схему. В настоящее время этот XEP отложен. Передача бинарных данных в полосе ограничена. Бинарные данные необходимо сначала кодировать в Base64, прежде чем их можно будет передать в полосе. Поэтому значительные объемы бинарных данных (например, передача файлов) лучше всего передавать вне полосы, используя сообщения в полосе для координации. Наиболее ярким примером этого является протокол расширения Jingle для XMPP, XEP 0166.

Пир-ту-пир-сессии

Используя расширение Jingle, XMPP может предоставить открытый способ организации связи между устройствами или напрямую между пользователями через различные сети. Эта функция в основном используется для IP-телефонии (VoIP).

Многопользовательский чат

XMPP поддерживает конференции с участием нескольких пользователей, используя спецификацию Multi User Chat (MUC) (XEP 0045). Для обычного пользователя это сопоставимо с Internet Relay Chat (IRC).

Безопасность и шифрование

Серверы XMPP могут быть изолированы (например, во внутренней сети компании), а безопасная аутентификация (SASL) и шифрование «точка-точка» (TLS) изначально были включены в основные спецификации XMPP, а также

Off the Record Messaging (OTR) – это расширение XMPP, обеспечивающее шифрование сообщений и данных. Впоследствии оно было заменено более совершенным расширением – многосторонним шифрованием «конец-в-конец» (OMEMO, XEP 0384), обеспечивающим сквозное шифрование между пользователями. Это обеспечивает более высокий уровень безопасности, поскольку все данные шифруются на исходном клиенте и расшифровываются только на целевом клиенте; оператор сервера не может расшифровать передаваемые данные. Сообщения также могут быть зашифрованы с помощью OpenPGP, например, с использованием программного обеспечения Gajim.

Обнаружение сервиса

Хотя сегодня существует несколько протоколов обнаружения сервисов (таких как zeroconf или Service Location Protocol), XMPP предоставляет надёжную основу для обнаружения сервисов, расположенных локально или в сети, а также информации об их доступности (через информацию о присутствии), как это определено в XEP 0030 DISCO.

Программное обеспечение

XMPP реализован во многих клиентах, серверах и кодовых библиотеках. Эти реализации распространяются под различными лицензиями на программное обеспечение.

Серверы

Существует множество серверного программного обеспечения XMPP, среди известных — ejabberd и Prosody.

Клиенты

Существует большое количество клиентского программного обеспечения XMPP для различных современных и устаревших платформ, включая как графические, так и клиенты, работающие через командную строку. Согласно веб-сайту XMPP, одними из самых популярных программ являются Conversations (Android), Dino (BSD, Windows, Unix, Linux), Converse.js (веб-браузер, Linux, Windows, macOS), Gajim (Windows, Linux), Monal (macOS, iOS) и Swift.IM (macOS, Windows, Linux). Другие клиенты включают: Bombus, ChatSecure, Coccinella, Miranda NG, Pidgin, Psi, Tkabber, Trillian и Xabber.

Развертывание и распространение

Во всем мире существуют тысячи серверов XMPP, многие из которых являются общедоступными, а также частные лица или организации, запускающие свои собственные серверы без коммерческой цели. На многочисленных веб-сайтах можно найти списки общедоступных серверов XMPP, где пользователи могут зарегистрироваться (например, на сайте XMPP.net). Несколько крупных публичных IM-сервисов изначально использовали или продолжают использовать XMPP, включая LiveJournal "LJ Talk", Nimbuzz и HipChat. Различные хостинг-провайдеры, такие как DreamHost, позволяют своим клиентам выбирать услуги XMPP наряду с более традиционными веб- и почтовыми сервисами. Существуют также специализированные облачные XMPP-хостинги, позволяющие владельцам доменов не запускать собственные серверы XMPP напрямую, например Cisco Webex Connect, Chrome.pl, Flosoft.biz, i-pobox.net и hosted.im. XMPP также применяется в системах, не связанных с IM, включая системы интеллектуальных сетей, такие как приложения управления спросом, промежуточное программное обеспечение, ориентированное на обмен сообщениями, и в качестве замены SMS для обеспечения текстовых сообщений на многих смартфонах.

Неместные развертывания

Некоторые из крупнейших поставщиков услуг обмена сообщениями используют или использовали различные формы протоколов на основе XMPP в своих серверных системах, не обязательно сообщая об этом своим конечным пользователям. Одним из примеров является Google, которая в августе 2005 года представила Google Talk – комбинированную систему VoIP и IM, использующую XMPP для обмена мгновенными сообщениями и в качестве основы для протокола сигнализации для передачи голоса и файлов под названием Jingle. Первоначальный запуск не предусматривал связь между серверами; Google включила эту функцию 17 января 2006 года. Позже Google добавила в Google Talk видеофункциональность, также используя протокол Jingle для сигнализации. В мае 2013 года Google объявила об отказе от поддержки совместимости XMPP в Google Talk для федерации серверов, хотя поддержка клиент-сервер осталась. С тех пор Google Talk был исключен из линейки продуктов Google. В январе 2008 года AOL представила экспериментальную поддержку XMPP для своего сервиса AOL Instant Messenger (AIM), позволяя пользователям AIM общаться с использованием XMPP. Однако в марте 2008 года эта услуга была прекращена. По состоянию на май 2011 года AOL предлагает ограниченную поддержку XMPP. В феврале 2010 года социальная сеть Facebook открыла доступ к своей функции чата для сторонних приложений через XMPP. Некоторые функции были недоступны через XMPP, и поддержка была прекращена в апреле 2014 года. Аналогично, в декабре 2011 года Microsoft выпустила XMPP-интерфейс для своего сервиса Microsoft Messenger. Skype, его фактический преемник, также предоставлял ограниченную поддержку XMPP. Apache Wave – ещё один пример. XMPP является де-факто стандартом для приватного чата на игровых платформах, таких как Origin и PlayStation, а также на ныне не поддерживаемых Xfire и Raptr. Два заметных исключения – Steam и Xbox LIVE; обе используют собственные проприетарные протоколы обмена сообщениями.

Конкурирующие стандарты

XMPP часто рассматривался как конкурент SIMPLE, основанного на протоколе инициирования сеансов (SIP), в качестве стандартного протокола для обмена мгновенными сообщениями и уведомлений о присутствии. Расширение XMPP для групповых чатов можно рассматривать как конкурента Internet Relay Chat (IRC), хотя IRC значительно проще, обладает гораздо меньшим функционалом и гораздо более широко распространен. Расширения XMPP для модели "издатель-подписчик" предоставляют многие из тех же возможностей, что и протокол Advanced Message Queuing Protocol (AMQP).