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 :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>
最新文章
- 【repost】JavaScript Scoping and Hoisting
- 【转】万网域名查询接口(API)的说明
- HTML5实现屏幕手势解锁(转载)
- myeclipse启动报错 no java virtual machine。。。
- JAVA生成EXCEL图表
- CodeForces 299A	 Ksusha and Array
- 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL	 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证
- WebService学习笔记系列(四)
- java foreach记录
- zendStudio安装Xdebug项目断点调试
- xshell使用命令总结
- Modular Inverse(模逆元,扩展欧几里德)
- Linux内核IP层的报文处理流程(一)
- windows API实现用户选择文件路径的对话框
- 入坑以来最清晰的this指南[老哥们来交流指正]
- 详细介绍Spring 5的那些新特性与增强
- cassandra 3.x官方文档(2)---架构解析
- 不错的网络协议栈测试工具 — Packetdrill
- SQLServer之函数简介
- java编译时出现——注:使用了未经检查或不安全的操作。注:有关详细信息,请使用 -Xlint:unchecked 重新编译