Знакомство с протоколом XMPP

Узнайте больше о передаче данных в Интернет на примерах приложений, использующих принципы XMPP

XMPP представляет собой открытый протокол для передачи XML-данных через Интернет. Он снискал наибольшую популярность в качестве протокола для мгновенного обмена текстовыми сообщениями (instant messaing), но при этом он также может использоваться и для передачи произвольных данных. Прочитав эту статью, вы узнаете все хитрости XMPP и научитесь применять его для реализации простых схем обмена сообщениями.

Изменение от 18-го сентября 2009 г.: Учитывая комментарии читателей были добавлены ссылки на Web-сайт организации по стандартизации XMPP (XSF), а также на обсуждение протокола.

M. Тим Джонс, инженер-консультант, Emulex Corp.

М. Тим ДжонсМ. Тим Джонс - архитектор встроенного ПО и, кроме того, автор книг Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (выдержавшей на данный момент второе издание), AI Application Programming (второе издание) и BSD Sockets Programming from a Multilanguage Perspective. Он имеет обширный опыт разработки ПО в самых разных предметных областях - от ядер специальных ОС для геосинхронных космических аппаратов до архитектур встраиваемых систем и сетевых протоколов. Тим - инженер-консультант Emulex Corp., Лонгмонт, Колорадо.



12.02.2010

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

Часто встречающиеся аббревиатуры

  • API: программный интерфейс приложений
  • EVA: внекорабельная деятельность (работа космонавта в открытом космосе)
  • IETF: специальная комиссия Интернет-разработок
  • HTTP: протокол передачи гипертекста
  • RFC: заявка на обсуждение
  • RPC: удаленный вызов процедур
  • SMTP: простой протокол передачи почтовых сообщений
  • SOAP: простой протокол доступа к объектам
  • TCP: протокол управления передачей
  • URL: универсальный локатор ресурса
  • XML: расширяемый язык разметки

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

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

XMPP имеет схожие черты с другим протоколами прикладного уровня, например, SMTP. Архитектура подобных протоколов такова, что каждый клиент обладает уникальным именем и обменивается информацией с другими клиентами через сервер. При этом клиенты включают реализации клиентской части протокола, в то время как сервер выполняет функции маршрутизатора. Данная простая архитектура представлена на рисунке 1 (в этом примере оба клиента относятся к одному домену - discovery.nasa.guv).

Рисунок 1. Пример простой архитектуры XMPP, состоящей из сервера и двух клиентов
Diagram of a simple XMPP architecture, consisting of a server and two clients

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

Рисунок 2. Пример более сложной архитектуры XMPP, включающей два шлюза
Diagram of a more complex XMPP architecture, with XMPP gateways connecting to SMS and SMTP clients and servers

Адреса в XMPP

Адреса (или идентификаторы Jabber – JID) в XMPP аналогичны обычным адресам электронной почты за исключением нескольких важных моментов. JID включают такие компоненты, как узел, домен и ресурс (причем узел и ресурс не являются обязательными) и представляются в следующем формате:

[ node "@" ] domain [ "/" resource ]

Чаще всего адреса используются при создании новых пользователей IM, например, DavidBowman@discovery.nasa.guv. Один пользователь может авторизовываться на сервере несколько раз, при этом его местоположение будет указано в ресурсе. Например, пользователь может иметь один JID для своего основного терминала (DavidBowman@discovery.nasa.guv/terminal) и другой JID для мобильного устройства EVA (DavidBowman@discovery.nasa.guv/eva_pod1). Таким образом, можно взаимодействовать с пользователем вне зависимости от того, через какое устройство он соединяется с сервером.


Протокол XMPP

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

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

Рисунок 3. Упрощенный пример взаимодействия по протоколу XMPP
Diagram of a sample (simplified) XMPP communication

Далее в XML-потоке, показанном на рисунке 3, следует передача сообщений. Данное взаимодействие выполняется при помощи станс, включающих XMPP-адреса отправителя и получателя (атрибуты from и to), информацию об используемом языке, а также сами сообщения. Получив сообщение, клиент отправляет ответную стансу, изменив соответствующим образом адреса XMPP. Наконец, XML-поток закрывается путем передачи специального терминального сообщения обоими клиентами.

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

<stream:error>
  <xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
<stream:error>

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

Далее мы рассмотрим процесс создания простого приложения, взаимодействующего по протоколу XMPP.


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

Выбор библиотеки XMPP

Интересной характеристикой XMPP является то, что он реализован во множестве библиотек и на самых разнообразных языках. В рассматриваемом случае приложение будет реализовано на Ruby при помощи библиотеки XMPP4R. Ссылки на альтернативные реализации протокола приведены в разделе Ресурсы.

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

Это приложение является агентом IM, способного соединяться с другими агентами через протокол XMPP и находить определения указанных терминов. Его исходный код приведен в листинге 1.

Листинг 1. Пример простого агента 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

В начале листинга 1 создается простой словарь. Для этой цели используется класс hash в Ruby, позволяющий хранить данные в виде массива пар типа "ключ-значение" и легко получать нужное значение по указанному ключу. Далее выполняется подключение к серверу при помощи библиотеки XMPP4R. Для этого сначала создается новый JID, а затем - экземпляр класса Client, представляющий собой клиентское соединение. Непосредственно установка соединения происходит в момент вызова метода connect, сразу за которым необходимо выполнить аутентификацию, вызвав метод auth с паролем в качестве параметра. После выполнения этих действий соединение готово к передаче сообщений.

Далее агент передает информацию о своем статусе присутствия серверу IM. Это действие не является обязательным и выполняется путем оправки стансы присутствия. Кроме того, можно также уведомить других агентов IM о своей готовности к обмену информацией. Для этого следует создать стансу с текстом сообщения и указав в ней адрес нужного клиента. После инициализации станса может быть отправлена путем вызова метода send у экземпляра класса Client.

Для обработки входящих сообщений следует воспользоваться методом add_message_callback клиентского соединения. В нем указывается блок кода, который будет вызываться в момент поступления сообщения с целью его обработки (само сообщение находится в переменной inmsg типа Message). На первом этапе обработки выполняется проверка того, что термин, указанный в теле сообщения, содержится в словаре. Если это не так (словарь возвращает nil), то агент отправляет стандартный ответ клиенту. В противном случае формируется новое сообщение, в атрибуте from которого задается источник входящего сообщения (inmsg.from), а в теле - определение термина. После инициализации  сообщение пересылается клиенту.

На рисунке 4 показан пример общения с данным агентом при помощи популярного клиента pidgin. Это приложение поддерживает все основные IM-протоколы и может использоваться во множестве IM-сетей, в том числе в нескольких сетях одновременно. Окно, показанное на рисунке 4, появляется после подключения к серверу IM и используется для обмена сообщениями с заданным пользователем.

Рисунок 4. Пример обмена сообщениями с агентом IM
Screen capture of the sample IM session with the IM agent

Данный агент представляет собой простейший пример клиента XMPP. Библиотека XMPP4R позволяет создавать приложения, обладающие значительно более богатой функциональностью, в частности, способные регистрировать учетные записи, заниматься поиском сервисов, пересылать файлы, обмениваться сообщениями в режиме мульти-чата, публиковать и подписываться на события и даже работать через RPC. В разделе Ресурсы приведена ссылка на документацию по API библиотеки, позволяющую просматривать все файлы, классы и методы библиотеки в удобном виде. 


Область применения 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. Полный перечень языков, на которых были созданы библиотеки XMPP, приведен по ссылке в разделе Ресурсы.


Дальнейшие шаги

Рост популярности ReST

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

Многие полезные технологии нашли свое применение в областях, о которых никогда не думали их создатели. Например, HTTP в настоящее время не только является стандартом де-факто для пересылки Web-страниц через Интернет, но также служит в качестве протокола прикладного уровня для вышележаших протоколов, таких как SOAP и XML-RPS, и их моделей, в частности ReST. Точно также XMPP применяется для ряда задач, непосредственно не включающих IM. Подумайте, какое применение вы сможете найти для XMPP в ваших приложениях?

Ресурсы

Научиться

  • Оригинал статьи: Meet the Extensible Messaging and Presence Protocol (XMPP) (М. Тим Джонс, developerWorks, сентябрь 2009 г.). (EN)
  • Прочитайте статью в Википедии, посвященную XMPP, в которой приводится введение в данный протокол и сопутствующие стандарты. Кроме того, в статье содержится ряд ссылок на другие ресурсы, относящиеся к XMPP. (EN)
  • Посетите Web-сайт XSF, на котором содержится множество серверов, клиентов и библиотек XMPP. Кроме того, на этом сайте вы сможете принять участие в обсуждении XMPP и путей его развития, подписавшись на списки рассылки (подобные списки существуют для пользователей, разработчиков и администраторов проекта). (EN)
  • Ознакомьтесь с полным описанием протокола, прочитав спецификацию XMPP. (EN)
  • Обратитесь к спецификации SOAP – протокола для обмена структурированной информацией (XML). SOAP использует HTTP в качестве транспортного протокола, но при этом выступает в качестве сервиса общего назначения, реализующего RPC через Интернет. (EN)
  • Прочитайте спецификацию XML-RPC, а также ознакомьтесь с различными реализациями RPC в распределенной среде. Подобно SOAP, XML-RPC реализован поверх HTTP и может использоваться на разных языках и в разных окружениях. (EN)
  • Ознакомьтесь со статьей в Википедии, в которой описывается принципы обмена информацией ReST, базирующиеся на управлением распределенными объектами при помощи HTTP. В ReST используются адресные ссылки HTTP, в которых определяются местоположение объектов и ресурсов, а также операции. Данная статья служит отличным введением в ReST, сравнивая его с другими технологиями, в частности, RPC. (EN)
  • Прочитайте отрывок из книги "XMPP: подробное руководство" (Питер Сен-Андре, Кевин Смит и Ремко Тронсон, Peter Saint-Andre, Kevin Smith, Remko Tronçon, O'Reilly, 2009 г.), сделанный Кэтрин Баррет (Kathryn Barrett), в котором приводится внушительный список вариантов применения XMPP. В нем вы также найдете перечень сервисов и приложений, в которых с успехом применяется данной протокол. (EN)
  • Сертификация по XML корпорации IBM: узнайте, как стать сертифицированным разработчиком IBM в области XML и связанных с ним технологий. (EN)
  • В технической библиотеке XML содержится множество статей, советов, руководств, стандартов и справочников IBM Redbooks. (EN)
  • Технические мероприятия и Web-трансляции developerWorks: в этих разделах можно получить самую актуальную информацию о современных технологиях. (EN)
  • Обратитесь к магазину технической литературы, в котором представлены книги на данную и другие темы. (EN)
  • Слушайте интервью и обсуждения вопросов, интересующих разработчиков программного обеспечения, в трансляциях developerWorks. (EN)

Получить продукты и технологии

  • Ознакомьтесь с длинным списком библиотек XMPP, реализованных на 15 различных языках, в Википедии (как правило, существует более одной реализации для каждого языка). (EN)
  • Загрузите библиотеку XMPP4R, которая используется в этой статье обмена данными через XMPP. Несмотря на множество альтернативных реализаций, данная библиотека представляет собой отличное решение для всех разработчиков приложений Ruby. (EN)
  • Загрузите ознакомительные версии продуктов IBM, а также опробуйте средства разработки приложений и промежуточное программное обеспечение IBM, в частности DB2®, Lotus®, Rational®, Tivoli® и WebSphere® на сайте online-тестирования IBM SOA Sandbox. (EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, SOA и web-сервисы
ArticleID=468027
ArticleTitle=Знакомство с протоколом XMPP
publish-date=02122010