Latest revision |
Your text |
Line 5: |
Line 5: |
| | | |
| Этот документ описывает обощённую архитектуру, схему адресации, термины "XML поток" и "XML [[станс]]", правила использования [[XML]], требования к совместимым реализациям протокола, а также соображения по поводу интернациональности и безопасности. | | Этот документ описывает обощённую архитектуру, схему адресации, термины "XML поток" и "XML [[станс]]", правила использования [[XML]], требования к совместимым реализациям протокола, а также соображения по поводу интернациональности и безопасности. |
− |
| |
− | == Введение ==
| |
− | Extensible Messaging and Presence Protocol (XMPP) — открытый, основанный на XML протокол для обмена в почти реальном времени сообщениями, передачи информации о пристуствии и сервисов вида "запрос-ответ".
| |
− | Базовый синтаксис и семантика были разработаны в сообществе Jabber, большей частью в 1999 году.
| |
− | В 2002, рабочая группа XMPP занялась разработкой адаптации протокола Jabber, которая была бы пригодна в качестве технологии IETF для обмена сообщениями и информацией о присутствии.
| |
− | Как результат этой работы, данный текст описывает основные возможности XMPP 1.0; расширения, необходимые для обмена сообщениями и информацией о присутствии, определенные в RFC 2779, определены в Extensible Messaging and Presence Protocol
| |
− | (XMPP): [[Instant Messaging and Presence|XMPP IM]].
| |
| | | |
| == Обобщённая архитектура сети == | | == Обобщённая архитектура сети == |
Line 30: |
Line 23: |
| | | |
| === Клиент === | | === Клиент === |
− | Большинство клиентов подключаются напрямую к серверам через {{w|TCP}}-соединения, и используют XMPP для получения доступа к возможностям [[Сервер|сервера]] и связанных с ним [[Сервис|сервисов]]. Одновременно могут быть подключены несколько [[Ресурс|ресурсов]] (например, обозначающих устройства или местоположения) одного клиента. Каждый ресурс должен иметь уникальный идентификатор ресурса (см. [[XMPP Core#Схема адресации|Схема адресации]]). | + | Большинство клиентов подключаются напрямую к серверам через {{w|TCP}}-соединения, и используют XMPP для получения доступа к возможностям [[Сервер|сервера]] и связанных с ним [[Сервис|сервисов]]. Одновременно могут быть подключены несколько [[Ресурс|ресурсов]] (например, обозначающих устройства или местоположения) одного клиента. Каждый ресурс должен иметь уникальный идентификатор ресурса (см. [[XMPP Core#Схема адресации]]). |
| | | |
| Рекомендуется для [[C2S|клиент-серверных соединений]] использовать порт 5222. | | Рекомендуется для [[C2S|клиент-серверных соединений]] использовать порт 5222. |
| | | |
| === Транспорт === | | === Транспорт === |
− | Транспорт - специальный сервис, работающий на стороне сервера, чья основная функция - обеспечивать перевод [[XMPP]] в протокол сторонней (не XMPP) [[IM]] сети и обратно. Примерами могут являться [[Gateway:SMTP|e-mail]], [[Gateway:IRC|Internet Relay Chat]], [[SIMPLE]], [[Gateway:SMS|SMS]], а также коммерческие IM-сети, такие как [[Gateway:AIM|AIM]], [[Gateway:ICQ|ICQ]], [[Gateway:MSN|MSN]] и [[Gateway:Yahoo|Yahoo! IM]]. Коммуникации между транспортами и XMPP-серверами, а также между транспортами и сторонними серверами не описываются в этом документе. | + | Транспорт - специальный сервис, работающий на стороне сервера, чья основная функция - обеспечивать перевод [[XMPP]] в протокол сторонней (не XMPP) [[IM]] сети и обратно. Примерами могут являться [[SMTP|e-mail]], [[IRC|Internet Relay Chat]], [[SIMPLE]], [[SMS]], а также коммерческие IM-сети, такие как [[AIM]], [[ICQ]], [[MSN]] и [[Yahoo! Messenger|Yahoo! IM]]. Коммуникации между транспортами и XMPP-серверами, а также между транспортами и сторонними серверами не описываются в этом документе. |
| | | |
| === Сеть === | | === Сеть === |
− | Поскольку каждый сервер идентифицируется его сетевым адресом, и поскольку [[S2S|сервер-серверные коммуникации]] являются прямым расширением [[C2S|клиент-серверного протокола]], фактически система состоит из набора взаимодействующих серверов. Таким образом, <juliet@example.com> может обмениваться сообщениями, информацией о присутствии и др. с <romeo@example.net>. Этот шаблон знаком по протоколам вроде {{w|SMTP}}, которые пользуются стандартами сетевой адресации. Взаимодействие между серверами НЕОБЯЗАТЕЛЬНО. Если оно доступно, оно должно производиться посредством XML потоков через TCP соединения. Рекомендуемый порт для межсерверного взаимодействия 5269. | + | Поскольку каждый сервер идентифицируется его сетевым адресом, и поскольку [[S2S|сервер-серверные коммуникации]] являются прямым расширением [[C2S|клиент-серверного протокола]], фактически система состоит из набора взаимодействующих серверов. Таким образом, <juliet@example.com> может обмениваться сообщениями, информацией о присутствии и др. с <romeo@example.net>. Этот шаблорн знаком по протоколам вроде {{w|SMTP}}, которые пользуются стандартами сетевой адресации. Взаимодействие между серверами НЕОБЯЗАТЕЛЬНО. Если оно доступно, оно должно производиться посредством XML потоков через TCP соединения. Рекомендуемый порт для межсерверного взаимодействия 5269. |
| | | |
| == Схема адресации == | | == Схема адресации == |
Line 47: |
Line 40: |
| Корректный JID состоит из идентификатора домена (domain), идентификатора узла(node) и идентификатора ресурса(resource). | | Корректный JID состоит из идентификатора домена (domain), идентификатора узла(node) и идентификатора ресурса(resource). |
| | | |
− | Синтакс JID в [[w:Форма Бэкуса — Наура|форме Бэкуса—Наура]]: | + | Синтакс JID в форме Бэкуса-Наура: |
| | | |
| jid = [ node "@" ] domain [ "/" resource ] | | jid = [ node "@" ] domain [ "/" resource ] |
Line 62: |
Line 55: |
| Каждая допустимая часть JID'а по длине не должна превышать 1023 байта. Таким образом, полная длина JID с учетом символов "@" и "/" не может превышать 3071 байт. | | Каждая допустимая часть JID'а по длине не должна превышать 1023 байта. Таким образом, полная длина JID с учетом символов "@" и "/" не может превышать 3071 байт. |
| | | |
− | == XML-потоки == | + | == XML потоки == |
− | | + | |
− | === Обзор ===
| + | |
− | Две фундаментальные концепции делают возможным быстрый асинхронный обмен сравнительно маленькими порциями структурированной информации между сущностями: [[XML-поток|XML-потоки]] и [[Станс|XML-стансы]].
| + | |
− | Эти термины определяются следующим образом:
| + | |
− | | + | |
− | '''XML-поток''' - это контейнер для обмена XML-элементами между любыми двумя сущностями в сети.
| + | |
− | Начало XML-потока однозначно обозначается открывающим XML-тегом <tt><stream></tt> (с необходимыми атрибутами и указанием пространства имён), а конец XML-потока однозначно обозначается закрывающим тегом <tt></stream></tt>.
| + | |
− | В течение жизни потока сущность, создавшая поток, может посылать неограниченное количество XML-элементов через поток, включая как элементы для создания потока (например, предложить использовать [[TLS]] (Секция 5) или [[SASL]] (Секция 6)), так и [[Станс|XML-стансы]] (элементы <tt><message/></tt>, <tt><presence/></tt> и <tt><iq/></tt>, с пространством имён по умолчанию).
| + | |
− | "Начальный поток" предлагается инициирующей сущностью (обычно клиентом или сервером) принимающей сущности (обычно серверу), и может рассматриваться как соответствующая инициатору потока "сессия".
| + | |
− | "Начальный поток" позволяет производить односторонюю передачу информации от инициатора к получателю; для передачи в обратном направлении принимающая сущность ДОЛЖНА предложить поток инициатору ("ответный поток").
| + | |
− | | + | |
− | '''XML-станс''' - дискретная семантическая единица структурированной информации, переcылаемая от одной сущности к другой посредством XML-потока.
| + | |
− | XML-станс существует как непосредственный потомок корневого элемента <tt><stream/></tt>.
| + | |
− | {{todo|An XML stanza exists at the direct child level of the root <stream/> element and is said to be well-balanced if it matches the production [http://tools.ietf.org/html/rfc3920#ref-43 43] content of [http://tools.ietf.org/html/rfc3920#ref-XML XML].}}
| + | |
− | Начало любого XML-станса однозначно обозначается открывающим тегом на глубине 1 в XML-потоке (например, <tt><presence></tt>), и конец однозначно обозначается соответствующим закрывающим тегом на глубине 1 (например, <tt></presence></tt>).
| + | |
− | XML-станс МОЖЕТ содержать дочерние элементы (с соответствующими атрибутами, дочерними элементами и символьными данными), если это необходимо для передачи желаемой информации.
| + | |
− | Единственные XML-стансы, определенные здесь - элементы <tt><message/></tt>, <tt><presence/></tt> и <tt><iq/></tt>, с пространством имён по умолчанию, как описано в Секции 9; XML элементы, необходимые для инициации [[TLS]] (Секция 5), [[SASL]] (Секция 6), или Server Dialback (Секция 8) не являются XML-стансами.
| + | |
− | | + | |
− | В качестве примера рассмотрим сессию клиента с сервером.
| + | |
− | Для подключения к серверу клиент ДОЛЖЕН инициировать XML-поток, послав серверу открывающий тег <tt><stream></tt>, возможно, предварив его текстовым описанием версии XML и используемой кодировки (см. Изменения в текстовом описании (Секция 11.4) и Кодировка символов (Секция 11.5)).
| + | |
− | В зависимости от локальных правил и характеристик сервиса, серверу СЛЕДУЕТ ответить клиенту вторым XML-потоком, возможно, предварив его текстовым описанием.
| + | |
− | Как только клиент завершил приветствие SASL, он МОЖЕТ посылать неограниченное число XML-станс через поток любому получателю в сети.
| + | |
− | Когда клиент хочет закрыть поток, он просто посылает закрывающий тег <tt></stream></tt> (в другом варианте, поток может быть закрыть сервером), после чего клиенту и серверу СЛЕДУЕТ также прервать нижележащее соединение (обычно TCP).
| + | |
− | Те, кто привык думать об XML как о документе, могут рассматривать сессию клиента с сервером как два незакрытых XML документа: один от клиента к серверу, и один от сервера к клиенту.
| + | |
− | С этой точки зрения, корневой элемент <tt><stream/></tt>, может рассматриваться как основная сущность для обоих "документов", и оба этих "документа" строятся за счет аккумулирования XML-станс, присланных по соответствующему потоку.
| + | |
− | Тем не менее, такая точка зрения - не более чем соглашение; XMPP имеет дело не с документами, а с потоками и стансами.
| + | |
− | | + | |
− | В сущности, XML-поток действует как конверт для всех переданных XML-станс. Упрощенно его можно представить так:
| + | |
− | <pre>
| + | |
− | |--------------------|
| + | |
− | | <stream> |
| + | |
− | |--------------------|
| + | |
− | | <presence> |
| + | |
− | | <show/> |
| + | |
− | | </presence> |
| + | |
− | |--------------------|
| + | |
− | | <message to='foo'> |
| + | |
− | | <body/> |
| + | |
− | | </message> |
| + | |
− | |--------------------|
| + | |
− | | <iq to='bar'> |
| + | |
− | | <query/> |
| + | |
− | | </iq> |
| + | |
− | |--------------------|
| + | |
− | | ... |
| + | |
− | |--------------------|
| + | |
− | | </stream> |
| + | |
− | |--------------------|
| + | |
− | </pre>
| + | |
− | | + | |
− | === Привязка к TCP ===
| + | |
− | | + | |
− | Хотя нет необходимости передавать XML поток через [TCP] соединение (например, две сущности могут подключаться друг к другу через другой механизм такой как [HTTP] туннелирование), данная спецификация определяет привязку XMPP только к TCP. В контексте клиент-серверного взаимодействия, сервер ДОЛЖЕН разрешать клиенту использование одного TCP соединения для отправки XML стансов от клиента к серверу и от сервера к клиенту. При взаимодействии сервер-сервер сервер ДОЛЖЕН использовать одно TCP соединение для стансов, посылаемых сервером пиру и другое TCP соединение (инициированное пиром) для стансов от пира к серверу, всего два TCP соединения.
| + | |
− | | + | |
− | === Безопасность потока ===
| + | |
− | | + | |
− | === Атрибуты потока ===
| + | |
− | | + | |
− | ==== Поддержка версий ====
| + | |
− | | + | |
− | === Указание пространства имён ===
| + | |
− | | + | |
− | === Возможности потока ===
| + | |
− | | + | |
− | === Ошибки потока ===
| + | |
− | | + | |
− | ==== Правила ====
| + | |
− | | + | |
− | ==== Синтаксис ====
| + | |
− | | + | |
− | ==== Предпоределенные условия ====
| + | |
− | | + | |
− | ==== Специфические условия приложения ====
| + | |
− | | + | |
− | === Упрощенные примеры потоков ===
| + | |
| | | |
| == Использование TLS == | | == Использование TLS == |
Line 166: |
Line 84: |
| | | |
| == Ссылки == | | == Ссылки == |
− |
| |
− | * [http://book.itep.ru/4/45/xmpp.htm Частичный перевод на русский]
| |
| * [http://tools.ietf.org/html/rfc3920 RFC 3920 на сайте ietf.org] (англ.) | | * [http://tools.ietf.org/html/rfc3920 RFC 3920 на сайте ietf.org] (англ.) |