XMPP/Jabber

eXchenge Messages and Presence Protocol

About

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

Порт: 5222 (но может быть настроен и через 80/443)

Спецификация: https://xmpp.org/

Протокол

XMPP не требует ответа

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

XEP - XMPP extension protocols

Оф документация по всем расширениям: https://xmpp.org/extensions/

Одними из наиболее важных для работы XMPP клиентов являются расширения:

  • XEP-0163 Personal Eventing Protocol. Размещение аватарок, передача ключей OMEMO

  • XEP-0191 Блокирование контактов. Чёрный список собеседников

  • XEP-0198 Менеджер потоков. Необходим для доставки сообщений при нестабильном интернет-канале и выключенном архиве сообщений. Если сервер не получает уведомление о доставке, сервер повторно отправляет сообщение

  • XEP-0237 Версии ростера. Вместо полной загрузки данных собеседников, передаются лишь обновлённые данные

  • XEP-0280 Дублирование сообщений. Отправка сообщения на все включённые устройства. Используется, если не включён архив сообщений

  • XEP-0352 Состояние клиента. Если XMPP клиент свернут, сервер передаёт лишь сообщения. Это экономит расход батареи и интернет-трафик

  • XEP-0363 HTTP File Upload. Универсальная передача файлов между разными клиентами (через HTTP)

  • XEP-0384 OMEMO расширение, внедряющее сквозного шифрования Oml, реализацию шифрования из Signal

Еще есть расширения

  • XMPP over BOSH - XEP-0206 и XEP-124

  • XMPP over WebSockets - RFC 7395

  • Jingle - протокол передачи audio и video через XMPP - XEP-166

  • COLIBRRI - COnferences with LIghtweight BRIdging - XEP-0340 - спецификация работы с конференциями. Разработана Jitsi.

JID

Каждый пользователь в сети Jabber имеет уникальный идентификатор — Jabber ID (сокращённо JID). Адрес JID, подобно адресу электронной почты, содержит имя пользователя и доменное имя сервера, на котором зарегистрирован пользователь, разделенные знаком @. Например, пользователь user, зарегистрированный на сервере example.com, будет иметь адрес: user@example.com.

Пользователь может иметь одновременно несколько подключений, для различия которых используется дополнительный атрибут JID, называемый ресурсом и добавляемый через слэш в конец адреса. К примеру, пусть полный адрес пользователя будет user@example.com/work, тогда сообщения, посланные на адрес user@example.com, дойдут на указанный адрес вне зависимости от имени ресурса, но сообщения для user@example.com/work дойдут на указанный адрес только при соответствующем подключённом ресурсе.

Адреса JID могут также использоваться без явного указания имени пользователя (с указанием имени ресурса или без такового) для системных сообщений и для контроля специальных возможностей на сервере.

Stanza

станса - называют ноды XML сущностей, например: iq-станса: <iq some-attr="test" />

Распространенные cтансы в XMPP и их назначение

open

open - открытие соединения

Запрос: 
<open to="meet.jit.si" version="1.0" xmlns="urn:ietf:params:xml:ns:xmpp-framing"/>

Ответ:
<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0' xml:lang='en' id='56c4fb42-4914-4cb5-8d31-274ea094fa59' from='meet.jit.si'/>

iq

identifier query - это геттеры/сеттеры для параметров. Своего рода POST-запросы.

message

Отправка сообщений, что логично

presence

Отправка событий. Их отправлять может как сервер, так и клиент. Ответа не требуется.

Last updated