• 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>
  • 相关阅读:
    基于组的策略(GBP)开启新型网络设计时代
    49 多维数组(二维数组)
    48 查找
    47 排序
    46 字符数组和字符串
    45 数组应用
    44 数组
    43 C语言宏定义
    42 预处理命令
    41 函数封装练习
  • 原文地址:https://www.cnblogs.com/qixin/p/12815250.html
Copyright © 2020-2023  润新知