XEP-0199 XMPP Ping

原文来自:https://xmpp.org/extensions/xep-0199.html,只翻译了技术方面的内容。

摘要:这个规范定义了一个通过XML流发送应用级别pings的XMPP扩展协议。这个pings可以从客户端发送给服务端,从服务端发送给另一个服务端,或者点到点的发送。

状态:最终版本。

注意:这里定义的协议是是XMPP标准基金会定义的最终标准,可以认为是一种稳定技术实现和部署。

类型:Standards Track(可参考RFC 2026

版本:2.0.1(2019-03-26)

1.介绍

XMPP Core定义中,XMPP使用的XML流被绑定到TCP中。不幸的是,TCP连接可以在应用层(XMPP)不知情的情况下断开。解决这个问题的传统方法是通过XML流发送一个被称为“whitespace pings”。这个文档推荐了一个对XML更友好的方案,可以在通讯路径中超过一次跳转的情况下使用(例如:从一个客户端到另一个客户端),并且可以和其它绑定一起使用,例如BOSH (XEP-0124) 方法是XMPP Over BOSH (XEP-0206)的XMPP配置。

2.要求

本规范满足以下的要求:

1.决定在客户端和服务端,或两个服务端之间XML流的存活。

2.决定任何两个XMPP实体(例如:两个客户端)端对端的连通性。

3.协议

XMPP ping协议非常简单:

1.pinging实体发送一个IQ-get消息,它包括了一个由'urn:xmpp:ping'命名空间限定的<ping/>元素。

2.被ping的实体返回一个IQ-result(如果支持该命名空间)或一个IQ-error(如果不支持)。

4.用例

4.1 服务端到客户端的pings

一个流行的服务端测试底层流连接存活的方法是ping一个连接的客户端。这通过流从服务端发送iq-get给客户端。

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

如果客户端支持ping的命名空间,它必须返回一个IQ-result,方法名为pong。

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

如果客户端不支持ping命名空间,它必须返回<service-unavaliable/>错误:

Example 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 6120的其它错误条件。

4.2 客服端到服务端的pings

客户端同样可以通过两个实体之间的流发送IQ-get消息来ping它的服务器。

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

注意:客户端可能包含'to'属性,记录它的bare JID<localpard@domain.tld>,在这个实例中是'juliet@capulet.lit',也同样可以不包含'to'属性。(这意味着stanza将由服务器代表连接用户的bare JID进行处理,在本例中<iq/> stanzas相当于将IQ-get指向服务器本身)

如果服务器支持ping命名空间,它必须返回一个IQ-result:

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

如果服务器不支持ping命名空间,它必须返回一个<service-unavaliable/>错误:

Example 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>

在适合的情况下可以返回RFC 6120的其它错误条件。

4.3 服务端到服务端的Pings

Pings也可以用来测试服务端到服务端的连接。这通过服务端到另一服务端的流发送IQ-get来完成。

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

如果流的另一个服务端支持这个ping命名空间,它必须返回一个IQ-result:

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

如果该流的其它参与方不支持这个ping命名空间,它必须返回一个<service-unavaliable/>错误。

Example 9:Ping不支持
<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>

在适合的情况下可以返回RFC 6120的其它错误条件。

4.4 客户端到客户端的Pings

Pings同样可以用于客户端到客户端(例如:端到端)之间的ping。

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

注意:'to'属性的地址应该是一个full JID(<localpart>@domain.tld/resource),因为发送给bare JID<localpart@domain.tld>的ping会被服务端代替客户端处理。

如果被ping的实体支持ping命名空间,它应该返回一个IQ-result:

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

如果被ping的实体不支持ping命名空间,它必须返回一个<service-unavaliable/>错误:

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

在适合的情况下可以返回RFC 6120的其它错误条件。

4.5 组件到客户端的pings

Pings同样可以用于组件到客户端的pings,例如Multi-User Chat (XEP-0045)就是一个组件到客户端的例子。

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

注意:'to'属性的地址应该是一个full JID<localpart@domain.tld/resource>,因为发送给bare JID<localpart@domain.tld>的ping会被服务端代替客户端处理。

如果被ping的实体支持ping命名空间,它应该返回一个IQ-result:

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

如果被ping的实体不支持ping命名空间,RFC 6120要求它返回一个<service-unavaliable/>错误:

Example 15:Ping不支持
<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>

在适合的情况下可以返回RFC 6120的其它错误条件。

5.确认支持

如果一个实体支持XMPP Ping协议,它必须报告这个事实,通过响应包含服务发现特性的'urn:xmpp:ping'给对应的Service Discovery (XEP-0030)消息请求:

Example 16:服务发现消息请求
<iq type='get'
    from='juliet@capulet.lit/balcony'
    to='capulet.lit'
    id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
Example 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>

为了一个应用决定一个实体是否支持本协议,它可能使用动态的,在Entity Capabilities (XEP-0115)定义的基于presence配置的服务发现。但是,如果一个应用没有从实体上接收到它的功能信息,它应该使用明确的服务发现来代替。

6.实现的注意事项

一些XMPP客户端不响应包含不支持负载的IQ stanzas。虽然这违反了XMPP Core,这种行为可能导致已经主动连接到服务端的客户端断开连接。

7.安全注意事项

如果服务端接收到一个指向full JID<localpart@domain.tld/resource>的ping请求,并且这个full JID跟一个已注册的帐户相关联,但没有匹配'to'地址的已连接资源,RFC 6120要求服务端回复一个<service-unavaliable/>错误并且将要返回IQ-error的'from'地址修改为刚才接收到的'to'地址。

如果一个已连接的资源接收到一个ping请求,但是它因为某些原因不显示它网络的可用性(例如:因为发送人没被认证为可以知道被请求资源的可用性),这时候它必须回复一个<service-unavaliable/>错误。服务端的响应和客户端的响应之间的一致性可以有效地避免presence泄露。

8.INNA注意事项

本XEP不需要和Internet Assigned Numbers Authority (IANA)交互。

9.XMPP注册注意事项

XMPP Registrar 包含了‘urn:xmpp:ping’在注册列表中(https://xmpp.org/registrar/namespaces.html)。

10.XML文档结构

<?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>

 

上一篇:[Usaco2007 Open]Fliptile 翻格子游戏题解


下一篇:如何使用XMPP Java向用户发送聊天邀请?