XMPP翻译:RFC 3920[8](Chapter10)
本篇翻译了XMPP核心协议RFC 3920的第十章。
内容提要:
Server Rules for Handling XML Stanzas //处理XML节的服务器端规则
- No 'to' Address //无'to'地址
- Foreign Domain //外部域
- Subdomain //子域
- Mere Domain or Specific Resource //仅有域或特定资源
- Node in Same Domain //同域中的节点
规范化的服务器实现(Compliant server implementations)MUST保证能够有次序(in-order)的处理任何两个人实体间的XML节。
除能够有次序的处理XML节之外,每个服务器实现必须包括它自己的"delivery tree",来处理它接收到的节。这样的树判断是否该将一个节路由到其它域,还是自己处理,或者发送给一个连接节点的相关资源。应用以下规则:
10.1. 无'to'地址
如果节不带有'to'属性,服务器SHOULD代表发送此节的实体对它进行处理。因为所有从其它服务器接收来的节都MUST带有'to'属性,这个规则只适用于是从一个已注册过的实体(如客户端)发来的节。若服务器接收到了一个不带'to'的presence节,如果可行,该服务器SHOULD将此节广播给订阅了发送者的presence信息的那些实体(广播presence信息定义在[XMPP-IM]中)。若服务器接收到type为"get" 或"set"而不带'to'属性的IQ节,该服务器懂得限定此节内容的命名空间,那它MUST或者代表发送者处理此节(这里"process"的内容由命名空间的语义决定),或者返回错误到发送者。
10.2. 外部域
若包含在'to'属性中的JID的域标识符部分的主机名,与服务器自身或服务器的子域所配置的主机名不匹配,服务器SHOULD将此节路由到外部域(取决于域内通信的本地服务供应和安全策略subject )。有两种可能的情况:
- 两域间已存在一个S2S流:
- 发送方所在的服务器通过已存在的流把节路由到一个外部域的可信(authoritative)服务器
- 两域间不存在S2S流:
- 发送方所在的服务器(1)决定外部域的主机名(见S2S通信一章),(2)在两域间协商一个S2S流(见Use of TLS and Use of SASL),(3)通过新建立的流把节路由到一个外部域的可信(authoritative)服务器
若未成功的路由到接收方所在的服务器,发送方所在的服务器MUST返回错误到发送方;如果能够连接上接收方所在的服务器,但从接收方所在的服务器到接收方间的传送却失败了,则接收方所在的服务器MUST返回一个错误,经由发送方所在的服务器发送给发送方。
10.3. 子域
若包含在'to'属性中的JID的域标识符部分的主机名,与服务器的一个子域所配置的主机名相匹配,服务器MUST或者自己处理此节,或者将其路由到专门负责子域的特定服务(这以配置有子域为前提),或者返回一个错误到发送方(如果未配置子域)。
10.4. 仅有域或特定资源
若包含在'to'属性中的JID的域标识符部分的主机名,与服务器的自身所配置的主机名相匹配,而且JID是<domain>或<domain/resource>的形式,服务器(或它的一个资源)MUST或者根据节类型进行适当处理,或者返回错误给发送方。
10.5. 同域中的节点
若包含在'to'属性中的JID的域标识符部分的主机名,与服务器的自身所配置的主机名相匹配,而且JID是<node@domain>或<node@domain/resource>的形式,服务器SHOULD将节发送到JID中所指定的接收者。应用以下规则:
- 若JID包含一个资源标识符(即,<node@domain/resource>的形式),且存在一个连接的资源与完整的JID相匹配,接收方所在的服务器SHOULD将节递送准确匹配资源标识符的流或会话。
- 若JID包含一个资源标识符,而却不存在与完整的JID相匹配的已连接资源,接收方所在的服务器返回一个<service-unavailable/>节错误给发送者。
- 若JID是<node@domain>的形式,且至少存在节点的一个已连接的资源,根据application-specific规则,特定接收方所在的服务器SHOULD将节至少递送一个已连接的资源([XMPP‑IM]中定义了一套即时通信与即时出席应用程序的递送规则)。