XEP-0199: XMPP Ping

From JaWiki (Jabber/XMPP wiki)
Jump to: navigation, search


Внимание

Этот текст не является официальным переводом документа XEP-0199: XMPP Ping и может не соответствовать оригиналу. Для разработки программ используйте официальный текст.

Эта спецификация описывает расширение XMPP для передачи пинга в XML-потоке. Такие пинги могут быть отправлены от клиента к серверу, с одного сервера на другой или конец-в-конец.

Информация о документе[edit]

  • Автор: Peter Saint-Andre
  • Издатель: © 1999 - 2010 XMPP Standards Foundation
  • Статус: Окончательный
  • Тип: Основное расширение
  • Версия: 2.0
  • Последнее обновление: 2009-06-03
ВНИМАНИЕ: Расширение, определенное в настоящем документе, окончательное и может использоваться для реализации в программах.

Введение[edit]

Как указано в RFC 3920, XML-потоки, используемые в XMPP, передаются с помощью TCP. Но TCP соединение может неожиданно разоравться. Традиционный подход к решению этого вопроса в том, чтобы периодически посылать так называемые "пустые пинги" в XML-потоке. Этот документ рекомендует более дружественный к XML подход.

Требования[edit]

Эта спецификация охватывает следующие требования:

  1. Определение состояния потока XML между клиентом и сервером или между двумя серверами.
  2. Определение связи конец-в-конец между любыми двумя пользователями XMPP (например, между двумя клиентами).

The number of "hops" for which the ping tests connectivity depends on how far the pinged entity is from the pinging entity, as shown in the following use cases. However, this specification does not provide per-hop information similar to that provided by the traceroute protocol (RFC 1393); a future specification may define such functionality for XMPP.

Протокол[edit]

Протокол предельно прост:

  1. Пингующий отправляет пингуемому IQ-запрос типа «get» с пространством имён «urn:xmpp:ping».
  2. Пингуемый отправляет «result» (если поддерживает данное пространством имён) или «error» (если не поддерживает).

Примеры использования[edit]

Сервер-клиент[edit]

Наиболее часто пинг отправляется от сервера к клиенту для проверки соединения.

Пример 1. Пинг

<iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='s2c1' type='get'>
 <ping xmlns='urn:xmpp:ping'/>
</iq>

Если клиент поддерживает данное пространство имён, он должен отправить понг.

Пример 2. Понг

<iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='s2c1' type='result'/>

Если же клиент не поддерживает пинг, отправляется ошибка:

Пример 3. Пинг не поддерживается

<iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='s2c1' type='error'>
 <ping xmlns='urn:xmpp:ping'/>
 <error type='cancel'>
   <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
 </error>
</iq>

Другие условия ошибки определены в RFC 3920 и также могут быть отправлены в случае необходимости.

Клиент-сервер[edit]

Пример 4. Пинг

<iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='c2s1' type='get'>
 <ping xmlns='urn:xmpp:ping'/>
</iq>

Примечание: Клиент может включать в адрес («to») JID без ресурса <localpart@domain.tld>, или же атрибут «to» вообще может отсутствовать (this signifies that the stanza shall be handled by the server on behalf of the connected user's bare JID, which in the case of <iq/> stanzas is equivalent to directing the IQ-get to the server itself). Если сервер поддерживает пинг, то отправляется «result»:

Пример 5. Понг

<iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='c2s1' type='result'/>

Если не поддерживается, отправляется сообщение об ошибке:

Пример 6. Пинг не поддерживается

<iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='c2s1' type='error'>
 <ping xmlns='urn:xmpp:ping'/>
 <error type='cancel'>
   <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
 </error>
</iq>

Сервер-сервер[edit]

Пинг может также использоваться для тестирования соединения серверов.

Пример 7. Пинг

<iq from='capulet.lit' to='montague.lit' id='s2s1' type='get'>
 <ping xmlns='urn:xmpp:ping'/>
</iq>

Пример 8. Понг

<iq from='montague.lit' to='capulet.lit' id='s2s1' type='result'/>

Пример 9. Пинг не поддерживается

<iq from='montague.lit' to='capulet.lit' id='s2s1' type='error'>
 <ping xmlns='urn:xmpp:ping'/>
 <error type='cancel'>
   <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
 </error>
</iq>

Клиент-клиент (конец-в-конец)[edit]

Пример 10. Пинг

<iq from='romeo@montague.lit/home' 
   to='juliet@capulet.lit/chamber'
   type='get' 
   id='e2e1'>
 <ping xmlns='urn:xmpp:ping'/>
</iq>

Примечание: в параметре «to» должен быть полный JID <localpart@domain.tld/resource>.

Пример 11. Понг

<iq from='juliet@capulet.lit/chamber'
   to='romeo@montague.lit/home' 
   id='e2e1'
   type='result'/>

Пример 12. Пинг не поддерживается

<iq from='juliet@capulet.lit/chamber'
   to='romeo@montague.lit/home' 
   id='e2e1'
   type='result'>
 <ping xmlns='urn:xmpp:ping'/>
 <error type='cancel'>
   <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
 </error>
</iq>

Компонент-клиент[edit]

Пинг может быть также использован от компонента к клиенту, например от конференции.

Пример 13. Пинг

<iq from='chat.shakespeare.lit'
   to='juliet@capulet.lit/chamber'
   type='get' 
   id='comp1'>
 <ping xmlns='urn:xmpp:ping'/>
</iq>

Примечание: в параметре «to» должен быть полный JID <localpart@domain.tld/resource>.

Пример 14. Понг

<iq from='juliet@capulet.lit/chamber'
   to='chat.shakespeare.lit'
   id='comp1'
   type='result'/>

Пример 15. Пинг не поддерживается

<iq from='juliet@capulet.lit/chamber'
   to='chat.shakespeare.lit'
   id='comp1'
   type='error'>
 <ping xmlns='urn:xmpp:ping'/>
 <error type='cancel'>
   <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
 </error>
</iq>

Определение поддержки[edit]

Если клиент, сервер или компонент поддерживает пинг, он должен сообщать об этом в диско:

Пример 16. Запрос диско

<iq type='get'
   from='juliet@capulet.lit/balcony'
   to='capulet.lit'
   id='disco1'>
 <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>

Пример 17. Ответ

<iq type='result'
   from='capulet.lit'
   to='juliet@capulet.lit/balcony'
   id='disco1'>
 <query xmlns='http://jabber.org/protocol/disco#info'>
   ...
   <feature var='urn:xmpp:ping'/>
   ...
 </query>
</iq>

Примечание[edit]

Некоторые клиенты игнорируют не поддерживаемые ими IQ-запросы. Это является нарушением XMPP Core, такие клиенты могут отключаться от сети.

Безопасность[edit]

Если сервер получает запрос-пинг, направленный на полный зарегистрированный JID <localpart@domain.tld/resource>, но нет ресурсов, связанных с адресом, RFC 3920 требует ответить с <service-unavailable/> ошибкой и установить в атрибуте «from» IQ-ошибки полный JID того, кому был направлен пинг. Если ресурс подключен и получает пинг, но он не хочет выявить доступность в сети отправителю по какой-либо причине (например, потому что отправитель не имеет права знать), он также должен ответить <service-unavailable/> ошибкой. Эта согласованность помогает предотвратить наличие утечек.

IANA[edit]

Этот документ не требует взаимодействия с Internet Assigned Numbers Authority (IANA).

XMPP[edit]

Пространство имён[edit]

Данное расширение использует пространство имён «urn:xmpp:ping».

Схема XML[edit]

<?xml version='1.0' encoding='UTF-8'?>
<xs:schema
   xmlns:xs='http://www.w3.org/2001/XMLSchema'
   targetNamespace='urn:xmpp:ping'
   xmlns='urn:xmpp:ping'
   elementFormDefault='qualified'>
 <xs:annotation>
   <xs:documentation>
     The protocol documented by this schema is defined in
     XEP-0199: http://www.xmpp.org/extensions/xep-0199.html
   </xs:documentation>
 </xs:annotation>
 <xs:element name='ping' type='empty'/>
 <xs:simpleType name='empty'>
   <xs:restriction base='xs:string'>
     <xs:enumeration value=/>
   </xs:restriction>
 </xs:simpleType>
</xs:schema>