Содержание


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

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

Comments

Программы для мгновенного обмена сообщениями (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 является отнюдь не единственным транспортным протоколом общего назначения, служащим для обмена сообщениями. Другие популярные протоколы, например 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
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
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
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 рассматривается на примере простого клиента 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
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, приведен по ссылке в разделе Ресурсы.

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

Многие полезные технологии нашли свое применение в областях, о которых никогда не думали их создатели. Например, 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)
  • Ознакомьтесь с длинным списком библиотек XMPP, реализованных на 15 различных языках, в Википедии (как правило, существует более одной реализации для каждого языка). (EN)
  • Загрузите библиотеку XMPP4R, которая используется в этой статье обмена данными через XMPP. Несмотря на множество альтернативных реализаций, данная библиотека представляет собой отличное решение для всех разработчиков приложений Ruby. (EN)
  • Сертификация по XML корпорации IBM: узнайте, как стать сертифицированным разработчиком IBM в области XML и связанных с ним технологий. (EN)
  • В технической библиотеке XML содержится множество статей, советов, руководств, стандартов и справочников IBM Redbooks. (EN)
  • Загрузите ознакомительные версии продуктов IBM, а также опробуйте средства разработки приложений и промежуточное программное обеспечение IBM, в частности DB2®, Lotus®, Rational®, Tivoli® и WebSphere® на сайте online-тестирования IBM SOA Sandbox. (EN)
  • Слушайте интервью и обсуждения вопросов, интересующих разработчиков программного обеспечения, в трансляциях developerWorks. (EN)

Комментарии

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

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