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

最新文章

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

热门文章

  1. 【tensorflow2.0】处理文本数据
  2. web font各浏览器兼容问题以及格式
  3. php-fpm cgi fast-cgi
  4. 7L-双线链表实现
  5. 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)
  6. Vue-CLI 3.x 自动部署项目至服务器
  7. Date 对象--&gt;概念、创建以及方法
  8. springIoc中的单列对象的分析
  9. 怎么快速学python?酒店女服务员一周内学会Python,一年后成为程序员
  10. Android调用系统设置