XMPP (Extensible Messaging and Presence Protocol)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:56, 21 декабря 2017.
XMPP(Extensible Messaging and Presence Protocol)
Официальное лого
Создатели: XMPP Standards Foundation
Разработчики: Джереми Миллер
Выпущена: 16 January 2007 года; 13 years ago (2007-01-16)
Постоянный выпуск: Version 3.2.14 / 27 June 2014 года; 6 years ago (2014-06-27)
Написана на: C, C++, Ruby, Python, Perl, Erlang, C#, Lisp.
Платформа: Windows, Android,Linux
Тип ПО: Протокол обмена сообщениями и информацией
Лицензия: RFC 3920
Веб-сайт [XMPP]

Программы для мгновенного обмена сообщениями (instant messaging – IM) пользуются широкой популярностью, как среди обычных, так и деловых пользователей. Они позволяют не только обмениваться информацией в реальном времени, но и получать данные о присутствии или отсутствии собеседников (как правило, поддерживаются такие признаки присутствия, как "доступен", "отошел от компьютера", "недоступен" и т. д.). Примером одного из ранних открытых протоколов IM может служить Jabber, созданный Джереми Миллером (Jeremy Miller) в 1998 г. Изначально он не задумывался как стандартный протокол, однако, благодаря своей расширяемости и XML-основам он быстро нашел применение в качестве транспорта общего назначения в промежуточном программном обеспечении, ориентированном на обмен сообщениями (message-oriented middleware — MoM). Развитие Jabber в итоге привело к появлению стандартизированного протокола XMPP, описанного в спецификации RFC 3920 "Extensible Messaging and Presence Protocol (XMPP)" (расширяемый протокол для обмена сообщениями и информацией о статусе присутствия), которая была разработана рабочей группой в IETF.
XMPP (Extensible Messaging and Presence Protocol — расширяемый протокол обмена сообщениями и информацией о присутствии, ранее известный как Jabber — открытый, основанный на XML, свободный для использования протокол для мгновенного обмена сообщениями и информацией о присутствии (см. список контактов) в режиме, близком к режиму реального времени. Изначально спроектированный легко расширяемым, протокол, помимо передачи текстовых сообщений, поддерживает передачу голоса, видео и файлов по сети.

История

Проект Jabber был основан Джереми Миллером в начале 1998 года с разработки сервера jabberd. Первое сообщение о проекте появилось 4 января 1999 года на сайте Slashdot. Эту дату принято считать днём рождения технологии. Вскоре после этого к проекту присоединилось несколько основных разработчиков, которые стали работать над сервером jabberd, клиентами для Windows и GNU/Linux, а также шлюзами в основные системы IM (AIM, ICQ, MSN, и [[Yahoo]). Позже, в 1999 году, Webb Interactive Services начало спонсировать основных разработчиков, что ускорило процесс создания проекта. В то время появилась основа протокола Jabber, а также сервер jabberd и ранние клиенты, такие, как WinJab (устарел и получил своё развитие в Exodus) и Gabber. Этот ранний период постоянных изменений закончился в мае 2000 года с выпуском jabberd 1.0.
Ранний протокол Jabber сформировал основы для стандарта XMPP, опубликованного как RFC 3920. Часто этот момент рассматривается как начало соперничества с SIMPLE, основанным на протоколе SIP, как стандартного протокола для мгновенного обмена сообщениями и информацией о присутствии.
С августа 2001 года протокол Jabber переходит под контроль Jabber Software Foundation (16 января 2007 года Jabber Software Foundation была переименована в XMPP Standards Foundation), для более точного описания своей работы развития расширений собственно протокола, в отличие от линии развития программы с одноимённым названием.
Jabber, Inc. занимается развитием двух проектов — Jabber Extensible Communications Platform (Jabber XCP) и JabberNow. Первый является фреймворком, а второй — программно-аппаратное решение (специально собранный и настроенный компьютер). Сайт jabber.org всё ещё функционирует. Инвесторами проекта Jabber являются Jona, Inc., France Telecom, Intel Capital, и Webb Interactive Services, Inc.
В августе 2005 года Google представил сервис Google Talk — комбинацию VoIP и клиента для обмена сообщениями, использующий XMPP для функций переписки, а также как основу для передачи голоса и файлов. Первоначальный запуск сервиса от Google не включал межсерверного общения, но к 17 января 2006 года такая возможность была добавлена. Однако, в мае 2013 Google объявил о сокращении поддержки межсерверных коммуникаций в связи с продвижением своего сервиса Google Hangouts. Тем не менее, несмотря на официальные завяления, Google Talk всё ещё поддерживает XMPP.

Боты

Большой популярностью в XMPP(Jabber’е) пользуются боты для конференций. Они широко используются для защиты конференций от спама, в качестве цензора, ведения различной статистики, парсинга веб-сайтов, создания «мостов» между чатами, ведения логов, управления конференциями и так далее. Функциональность xmpp-ботов и область их применения ограничены только фантазией их разработчиков. Известные боты:

  • Neutron — англоязычный бот на Python (библиотека «xmpppy»), один из первых xmpp-ботов;
  • FreQ — многофункциональный xmpp-бот, зарекомендовавший себя стабильностью в работе[источник не указан 650 дней], написан на Python (библиотека Twisted);
  • Sulci — бот-говорун, какое-то время был крайне популярен в качестве развлечения;
  • Gluxi — многофункциональный бот, написанный на C++;
  • Talisman — русскоязычная модификация бота Neutron, примечателен наличием множества модификаций и является наиболее популярным ботом в русскоязычных Jabber-конференциях;
  • EndLess — модификация бота Talisman. Примечателен тем, что он стал первым ботом, использующим более одного JID’а. По заявлениям разработчика бот является обладателем своеобразного рекорда: одна копия длительное время обслуживала ~500 конференций. Исходного кода бота нет в свободном доступе;
  • Fatal [Neutrino] — модификация бота Talisman/Neutron со слегка изменённой библиотекой «xmpppy». В последних версиях полностью переписан и практически не имеет ничего общего со своими предками. Для обеспечения наибольшего быстродействия его код распространяется в скомпилированном виде, что, однако, не противоречит GNU GPL v2. Примечателен высокой надёжностью и отказоустойчивостью. Локализации EN и RU.
  • Snapi — изначально являлся модификацией бота Talisman, но позже его «перерос». Можно охарактеризовать, как «Talisman с корректным кодом». Примечателен тем, что базируется на полностью переписанной библиотеке «xmpppy»;
  • BlackSmith mark.1 — активно развивающийся бот, написанный на Python. Примечателен широкой функциональностью, высокой стабильностью и устойчивостью к различным проявлениям флуда. Имеет свою систему плагинов а также частично совместим с ботом Talisman посредством специального модуля. Является open-source проектом и распространяется по лиценции Apache 2;
  • BlackSmith mark.2 — имеет мало чего общего с предыдущим ботом, не считая названия. Написан на Python и использует слегка модифицированную библиотеку «xmpppy». Примечателен поддержкой нескольких JID’ов, высокой стабильностью и наличием трёх языковых пакетов (EN, RU, FI). Большая часть архитектурно независимых функций портировано на mark.1;
  • Taho — бот для конференций, написанный на Tcl.
  • Pako — бот, распространённый в англоязычной части Jabber-сети. Написан на C#;
  • Isida — многофункциональный и многоязычный бот, написан на Python (библиотека «xmpppy»). Примечателен тем, что это единственный бот, который в полной мере использует muc-filter, а также тем, что его код противоречит большинству пунктов Python Style Guide;
  • Erl — бот, написанный на Erlang, примечателен функциями защиты конференций от спама.

[Источник 1]

Адресация

Простой пример

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

Принцип работы

Схема устройства работы XMPP

Соединение с другими протоколами

В качестве примера:Элис посылает сообщение через сеть джаббер к ICQ-транспорту. Дальше сообщение передаётся Бобу через сеть ICQ

Полезной особенностью XMPP систем являются транспорты, или шлюзы, позволяющие пользователям получать доступ к сетям, использующим другие протоколы. Это могут быть другие протоколы мгновенного обмена сообщениями, IRC или такие протоколы, как SMS и электронная почта.
В отличие от мультипротокольных клиентов, XMPP предоставляет доступ на уровне сервера, посредством коммуникации через специальные сервисы-шлюзы, выполняющиеся на удалённом компьютере.
Любой пользователь может «зарегистрироваться» на одном из этих шлюзов, предоставив информацию, необходимую для входа в сеть, и может общаться с пользователями сети так, как если бы они были пользователями сети джаббер. Это значит, что любой клиент, полностью поддерживающий XMPP, может быть использован для доступа к любой сети, для которой существуют шлюзы, без какого-либо дополнительного кода в клиенте и без необходимости клиенту иметь прямой доступ в Интернет.
Реализация шлюзов зависит от конкретного XMPP-сервера и подвержена нестабильности из-за закрытости коммерческих IM-сервисов.

Более подробный разбор работы

XMPP является отнюдь не единственным транспортным протоколом общего назначения, служащим для обмена сообщениями. Другие популярные протоколы, например XML-RPC и SOAP могут предоставить аналогичные возможности, но семантически передача сообщений будет напоминать вызовы функций. Кроме того, более новые решения, такие как ReST (передача репрезентативного состояния), позволяют получать доступ к файлам, используя URL для указания местоположений, объектов и методов.
XMPP имеет схожие черты с другим протоколами прикладного уровня, например, SMTP. Архитектура подобных протоколов такова, что каждый клиент обладает уникальным именем и обменивается информацией с другими клиентами через сервер. При этом клиенты включают реализации клиентской части протокола, в то время как сервер выполняет функции маршрутизатора.

Пример простой архитектуры XMPP, состоящей из сервера и двух клиентов

Серверы могут также взаимодействовать между собой в целях кросс-доменной маршрутизации, например, для передачи сообщений из домена discovery.nasa.guv в europa.nasa.guv. Кроме того, могут существовать специальные шлюзы (gateway), служащие для преобразования сообщений, полученных по другим протоколам. На рисунке 2 показан пример сети XMPP, включающей шлюзы в сети SMS (сервис передачи коротких сообщений) и SMTP. Чаще всего шлюзы используются для трансляции сообщений, передаваемых по разным IM-протоколам, например XMPP и IRC (Internet Relay Chat). Благодаря своей расширяемости XMPP представляет собой идеальную инфраструктуру для интеграции различных конечных протоколов. Шлюзы XMPP позволяют завершать указанные сессии клиент-серверного обмена сообщениями, а также инициировать новые сессии связи через указанный конечный протокол и с учетом необходимых преобразований данных.

Пример более сложной архитектуры XMPP, включающей два шлюза

Еще немного информации о протоколе XMPP

XMPP представляет собой сравнительно простой протокол для передачи сообщений через сокеты TCP. Взаимодействие между клиентом и сервером является асинхронным и протекает путем передачи так называемых станс XML (XML stanzas) внутри XML-потоков,. XML-потоки выполняют функции контейнеров, инкапсулирующих обмен XML-данными между двумя объектами, в то время как стансы являются дискретными информационными единицами. В XMPP XML-стансы используются для передачи как пользовательских сообщений, так и информации о статусе присутствия. Эти понятия проще понять на простом примере IM-взаимодействия двух клиентов через XMPP.
Стоит обратить внимание, что в обмене сообщениями участвует как минимум один сервере (в данном случае клиенты находятся в одном домене, поэтому достаточно единственного сервера). Клиент слева является инициатором (он инициирует обмен данными по протоколу XMPP). Его XML-поток включает атрибут to, в котором указывается домен принимающего клиента. Принимающий клиент, показанный справа, получает данный XML-поток и отвечает на него, используя полученное значение атрибута from. На этом этапе клиенты могут начать выполнять специальные процедуры, например, аутентификацию или шифрование, однако в данном примере они рассматриваться не будут (как и взаимодействие между серверами в случае, если клиенты находятся в разных доменах).

Упрощенный пример взаимодействия по протоколу XMPP


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

<stream:error>
  <xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
<stream:error>
[Источник 2].

Пример приложения Ruby, работающего через протокол XMPP

require 'xmpp4r/client'
 
# Создание очень простого словаря на основе хэш-таблицы
hash = {}
hash['ruby'] = 'Greatest little object oriented scripting language'
hash['xmpp4r'] = 'Simple XMPP library for ruby'
hash['xmpp'] = 'Extensible Messaging and Presence Protocol'
 
# Подключение к серверу и аутентификация
jid = Jabber::JID::new('bot@default.rs/Home')
cl = Jabber::Client::new(jid)
cl.connect
cl.auth('password')
 
# Сигнализация серверу о своем присутствии в сети
cl.send Jabber::Presence::new
 
# Отправка приветственного сообщения указанному агенту,
# означающего готовность к работе
salutation = Jabber::Message::new( 'hal@default.rs', 'DictBot ready' )
salutation.set_type(:chat).set_id('1')
cl.send salutation 
 
# Установка функции обратного вызова для
# обработки запросов от других агентовadd_message_callback do |inmsg|
 
    # Поиск слова в словаре
    resp = hash[inmsg.body]
    if resp == nil
      resp = "don't know about " + inmsg.body
    end 
 
    # Отправка ответа
    outmsg = Jabber::Message::new( inmsg.from, resp )
    outmsg.set_type(:chat).set_id('1')
    cl.send outmsg
 
end
 
# Запуск агента
while 1
end

Область применения XMPP

XMPP предоставляет общую инфраструктуру для передачи сообщений по сети, поэтому неудивительно, что область его применения выходит далеко за пределы традиционных систем IM и обмена информацией о присутствии.

XMPP может применяться в системах группового общения, например многопользовательских разделах чатов, которые имеют много общего с IM. В подобных системах могут быть реализованы такие функции, как, например, поддержка микроблогов, предоставляемая сервисом Twitter. При этом необходимо отметить, что XMPP способен передать не только текстовые данные, но также изображение, аудио и видео информацию.

XMPP можно рассматривать в качестве базовой инфраструктуры для обнаружения и анонсирования сервисов в сети, несмотря на существование специализированных протоколов, таких как Bonjour и SLP (Service Location Protocol).

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

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

Обратите внимание, что в большинстве из перечисленных типов систем речь идет о взаимодействии программных компонентов (machine-to-machine interaction - MMI), а не людей. Это явление представляет немалый интерес, поскольку изначально XMPP создавался как протокол для человеческого общения по принципам IM. Реализация XMPP на различных языках программирования

XMPP реализован во множестве библиотек, позволяющих приложениям использовать все возможности протокола. О популярности XMPP свидетельствует число различных языков программирования, для которых были созданы реализации. К ним относятся традиционные языки, такие как C, C++ и ™, а также широко используемые скриптовые языки Ruby, Python, Perl и Tcl. Кроме того, можно найти реализации на таких языках, как Erlang, C# и Lisp. Таким образом, какими бы технологиями вы не пользовались, скорее всего, вам не составит труда найти соответствующую библиотеку XMPP. [Источник 3].

Особенности

Семейство протоколов XMPP принято как стандарт RFC. Стандартный порт для XMPP — 5222. Также возможно использовать порт 80 и/или 443, если возникают проблемы с файрволом. В отличие от коммерческих систем мгновенного обмена сообщениями, таких как AIM, ICQ, WLM и Yahoo, XMPP является федеративной, расширяемой и открытой системой. Любой желающий может открыть свой сервер мгновенного обмена сообщениями, регистрировать на нём пользователей и взаимодействовать с другими серверами XMPP. На основе протокола XMPP уже открыто множество частных и корпоративных серверов XMPP. Среди них есть достаточно крупные проекты, такие как Google Talk, Одноклассники.ru, LiveJournal, Juick и др. Ранее протокол поддерживался также социальными сетями Facebook, ВКонтакте и сервисом Яндекс.Почта.

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

  1. Децентрализация: Архитектура сети XMPP схожа с электронной почтой; кто угодно может запустить свой собственный XMPP-сервер и нет какого-либо центрального сервера.
  2. Открытый стандарт: Internet Engineering Task Force формализовал XMPP как стандарт мгновенного обмена сообщениями и технологии присутствия под названием XMPP, и спецификации XMPP были опубликованы как RFC 3920 и RFC 3921. Никаких привилегий не требуется для добавления поддержки этих спецификаций и их разработка не привязана к какому-либо разработчику. Существует множество реализаций серверов и клиентов, а также библиотек с открытым исходным кодом.
  3. Большая история:Технологии XMPP используются с 1998 года. При поддержке таких крупных компаний, как Sun Microsystems и Google, создано множество дополнений к стандартам XMPP для клиентов, серверов, компонент и библиотек кодов.
  4. Безопасность: XMPP серверы могут быть изолированы от публичных сетей XMPP (например, во внутренней сети компании) и хорошо защищены (благодаря использованию SASL и TLS) встроенными в ядро XMPP спецификациями. Для поддержки использования шифрования канала XMPP Standards Foundation также использовал вспомогательный certification authority в xmpp.net, обеспечивая цифровые сертификаты для администраторов XMPP серверов при содействии StartCom Certification Authority (который является основным хранителем сертификатов для всех вспомогательных). Многие реализации серверов используют SSL при обмене между клиентом и сервером, и немало клиентов поддерживают шифрование с помощью PGP/GPG внутри протокола.
  5. Гибкость: Настраиваемая функциональность может быть надстроена поверх XMPP; для поддержки возможности взаимодействия различных сетей стандартные расширения поддерживаются XMPP Software Foundation. Приложения XMPP в дополнение к функциональности клиента сетевого общения включают в себя администрирование сети, распределение ресурсов, утилиты для совместной работы, обмен файлами, игры и мониторинг удалённых систем.

Слабые стороны

  1. Избыточность передаваемой информации: Как правило, более 70 % межсерверного трафика XMPP составляют сообщения о присутствии[19], около 60 % которых являются излишними. XMPP на данный момент создаёт избыточный трафик при доставке сообщений о присутствии (то есть «статус-сообщений») нескольким пользователям. Для решения этой проблемы разрабатываются новые протоколы. Также решением является расширение XEP-0138 — компрессия передаваемых данных протокола алгоритмами lzw и zlib, а также использование компрессии в рамках шифрования соединения TLS RFC 3749, глава 3.
  2. Масштабируемость: XMPP сейчас страдает от фактически той же проблемы избыточности, но применительно к чат-комнатам и возможностям публикации информации. Решение этих проблем также ожидается в виде XEP-расширений. Пока они не введены, большие чат-комнаты интенсивно образуют избыточный трафик.
  3. Неэффективность передачи бинарных данных: Так как XMPP является, по сути, одним длинным XML-документом, невозможно передать немодифицированную двоичную информацию. В результате этого, для передачи файлов стараются использовать дополнительные протоколы, например, HTTP. Для передачи же файлов и другой бинарной информации непосредственно в XMPP потоке используется кодирование base64. С другой стороны, некоторые клиентские программы, например Gajim, для передачи используют технологии p2p, не задействуя при этом сервер.

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

XMPP-серверы

  • ejabberd — свободный распределённый и отказоустойчивый XMPP-сервер, написанный на Erlang. Работает на крупнейшем российском XMPP-сервере jabber.ru.
  • CommuniGate Pro
  • Openfire (ранее Wildfire, ещё ранее Jive Messenger) — свободный многофункциональный и отказоустойчивый XMPP-сервер, написанный на Java. Занимал первое место в рейтинге по возможностям на jabber.org (по состоянию рейтинга на конец марта 2007 года)[36]
  • Prosody — кроссплатформенный XMPP-сервер, написанный на языке программирования Lua
  • jabberd2 — свободный сервер, написанный на языке C

XMPP-клиенты

По статистике публичного xmpp-сервера 404.city , самые популярные клиенты для десктопов и ноутбуков — Pidgin и Psi+ . На Android лидируют Xabber и Conversation

Для ПК и ноутбуков

  • Pidgin — мультипротокольный клиент споддержкой OTR, PGP
  • Psi+ — активно развивающийся форк джаббер клиента Psi
  • Gajim — кроссплатформенный клиент поддерживающий OTR, PGP, OMEMO

Для Android

  • Xabber — xmpp-клиент с поддержкой OTR, PGP
  • Conversations — xmpp-клиент с поддержкой OTR, PGP, OMEMO. Есть возможность отправки картинок, файлов, записи голоса.
  • IM+ — мультипротокольный мессенджер с OTR

Ссылки

Источники

  1. XMPP. Дата обновления: 01.10.2017. URL: http://ru.science.wikia.com/wiki/XMPP (дата обращения: 28.11.2017.)
  2. XMPP. Дата обновления: 21.10.2017. URL: https://www.ibm.com/developerworks/ru/library/x-xmppintro/ (дата обращения: 29.11.2017.)
  3. XMPP. Дата обновления: 11.07.2017. URL: http://4pda.ru/forum/index.php?showtopic=142007 (дата обращения: 29.11.2017.)