美文网首页业余整理的工作笔记
XMPP(IPTV项目消息通讯)

XMPP(IPTV项目消息通讯)

作者: 龙遁流 | 来源:发表于2020-04-19 16:48 被阅读0次

    【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>元素。

    相关文章

      网友评论

        本文标题:XMPP(IPTV项目消息通讯)

        本文链接:https://www.haomeiwen.com/subject/cwdvbhtx.html