XMPP(IPTV项目消息通讯)
【XMPP】
可扩展通讯和表示协议, Extensible Messaging and Presence Protocol。TCP传送传输的是与即时通讯相关的指令
基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。促进服务器之间的准即时操作
TLS(Transport Layer Security,传输层安全)来加密通信并通过SASL(Simple Authentication and Security Layers,简单身份验证与安全层)实现身份验证机制。
【网络结构】
客户端,服务器,网关,任意两端都可以双向通讯。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。
网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML
【具体应用】
以文档的观点来看,客户端或服务器发送的所有XML文本连缀在一起,从<stream>到</stream>构成了一个完整的XML文档。
其中的stream标签就是所谓的XML Stream。在<stream>与</stream>中间的那些<message>...</message>这样的XML元素就是所谓的XML Stanza(XML节)。
XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。
服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一方发信给另外一方。
通信的最后阶段是</stream>关闭流,关闭TCP/IP连接。
客户端:
<?xml version='1.0'?>
<stream:stream
to='example_com'
xmlns='jabber:client'
xmlns:stream='http_etherx_jabber_org/streams'
version='1.0'>
服务器:
<?xml version='1.0'?>
<stream:stream
from='example_com'
id='someid'
xmlns='jabber:client'
xmlns:stream='http_etherx_jabber_org/streams'
version='1.0'>
客户端:
<message
from='juliet_example_com'
to='romeo_example_net'
xml:lang='zh-cn'>
<body>Art thou not Romeo, and a Montague?</body>
</message>
服务器:
<message
from='romeo_example_net'
to='juliet_example_com'
xml:lang='zh-cn'>
<body>Neither, fair saint, if either thee dislike.</body>
</message>
客户端:
</stream:stream>
服务器:
</stream:stream>
【TVMS】
IPTV消息系统(TVMS)
【XMPP寻址】
XMPP网络上的每个实体都有一个或多个地址(称为JID,jabber identifier)。通常类似于:
darcy@pemberley.lit和elizabeth@longbourn.lit就是两个JID。JID由三个部分组成,节点、域和资源,域是必须的,其他两个部分是可选的。
域是实体(服务器、组件或插件)可解析的DNS名称。仅由域组成的JID是有效地址,表示服务器地址。指向域的节将由服务器自身处理,并可能被路由到某个组件或插件。
JID的资源部分通常会标识一个特定客户端的XMPP连接。对于XMPP客户端而言,每个连接均被指派一个资源。如darcy@perberley.lit想要连接他的书法和图书馆则可以通过
darcy@perberley.lit/study和darcy@perberley.lit/library来寻址,这样避免了用户在打开多个链接时消息无法找到正确的处理器。主要注意的是,资源部分是区分大小写的。
JID划分为两种类型:
裸JID
完整JID去除资源部分的地址,客户端的裸JID有些特殊,这是因为服务器自己将处理发往客户端的裸JID节。裸JID可以视为寻址用户的账户,而不是客户端。
完整JID
最为具体的地址
【XMPP节】
核心XMPP工具集由三个基本节组成,分别为<presence>、<message>和<iq>
<stream:stream>
<iq type='get'>
<query xmlns='jabber:iq:roster'/> //请求自己的花名册
</iq>
<presence/> //通知服务器她已在线并可以访问
<message to='darcy@pemberley.lit' from='elizabaeth@longbourn.lit/ballroom' type='chat'>
<body>
I cannot talk of books in a ball-room; my head is always full of something else.
</body> //发送消息
</message>
<presence type='unavailable'> // 声明自己不可访问并关闭
</stream:stream>
通用属性
from/to/type/id
from的属性并非由客户端提供,而是服务端进行的标记。
【presence节】
presence提供网络实体的可访问性。用户发出presence节,表明自己上线,这样可以会有更大的概率与别人通信(人们更愿意与在线的人交流),
但是我们也不用担心任何人都可以看到自己的在线状态,除非我们订阅了该用户的状态,订阅之后,用户的状态信息会自动发送到订阅者处。
实际上,XMPP的presence节是一个简单的专用的发布-订阅方法。在IM中,presence体现在花名册(roster)中,花名册保存有JID列表以及用户与这些JID的订阅关系,
一旦上线,用户发送presence节,剩下的就由服务器处理了(通知自己在线,以及获取联系人的状态信息)
【message节】
用于从一个实体向另外一个实体发送消息,并可以传输任何类型的结构化信息,不保证传输可靠性
message是一个非常基础的推模型,message通常用于IM,groupchat,警告和通知等。
message的type有如下几种:
① normal 类似于email,发出后不等待回应
② chat 用于两个实体间的实时通信
③ groupchat 多用户聊天室中使用
④ headline 用于发送警告或通知
⑤ error 发送错误信息
message节中也可以包含未在XMPP协议中定义的负载,可以用于扩展。
【IQ节】
表示Info/Query,为XMPP通信提供请求及响应机制,类似于GET/POST/PUT方法。
IQ只能包含一个payload,并且定义了需要由服务器处理的请求或者动作。相对于message来说,IQ具有更好的可靠性,因其要求收到回应。
IQ中包含有id属性,用于识别服务器发回的响应。
① get 用于请求信息,类似于HTTP Get
② set 提供信息或请求,类似于HTTP POST/PUT
③ result 响应请求,类似于HTTP 200
④ error 错误信息
【error节】
具有明确的结构,通常包含原节内容,通用错误信息以及应用程序特有的错误条件和信息(可选)
【连接生命周期】
发送XMPP节通常需要建立一个经过身份验证的XMPP会话,包括连接、流的建立、身份验证以及断开连接。
① 连接
在发送任何节之前,需要建立XMPP流,在XMPP流存在之前,必须建立通往XMPP服务器的连接。当XMPP客户端或者服务器连接到另外一个XMPP服务器时,
首先要查询SRV记录,该记录保存有特定域的服务器列表。查询应答中可以包含多条SRV记录,这样就可以在多个服务器中建立负载均衡连接。
如果没有找到合适的SRV记录,那么程序将试图直接连接到指定域。
② 流的建立
一旦建立通过给定XMPP服务器的连接,XMPP流就启动了,向服务器发送<stream:stream>,就可以打开XMPP流,服务器发送响应流的起始标记<stream:stream>进行响应
建立XMPP流之后就可以来回发送各种元素,服务器发送<stream:feature>元素,列举XMPP流中支持所有功能,大多数与可用的加密和身份验证选型有关
③ 身份验证
XMPP允许进行TLS(Transport Layer Security,传输层安全)加密,而且大多数客户端默认使用该功能。
一旦服务器通告TLS支持后,客户端就会启动TLS连接并将当前套接字升级为加密套接字而不断开连接。一旦TLS加密确立,就会创建一对新的XMPP流。
XMPP中的身份验证使用SASL(Simple Authentication and Security Layers,简单身份验证与安全层)协议并支持多种身份验证机制(取决于服务器)。
一旦完成身份验证,客户端必须为连接绑定一个资源并启动一个会话,通过<bind>和<session>元素发送。当两台服务器相互连接时,身份验证步骤稍稍不同。
④ 连接断开
当用户结束XMPP会话后,他们终止会话并断开连接,最优雅的方式是首先发送无效出席信息,然后关闭<stream:stream>元素。