原文来自: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>