基于开源软件VLC 和PJSIP 实现系统的开发
作者:佚名 论文来源:本站原创 点击数:1136 更新时间:2010-3-8
1.引言
所谓流媒体是指用户通过网络或者特定数字信道边下载边播放多媒体数据的一种工作
方式。流媒体应用的一个最大的好处是用户不需要花费很长时间将多媒体数据全部下载到本
地后才能播放。但是随着网络用户的日益增多,传统的C/S架构模式遭遇到瓶颈。与传统C/S
模式相对的是P2P(对等网络)结构,P2P显著的特点,就是各个节点拥有自己的资源,节点之
间直接通信并共享整个网络的资源。在P2P中,每个节点既作为客户机也作为服务器存在,
兼具两者的功能。利用这个特点,P2P网络技术可以结合现有的计算资源和有限的网络带宽
实现大规模的网络流媒体系统。
SIP(Session Initialization Protocol,会话发起协议)是一个由IETF MMUSIC (Multiparty
Multimedia Session Control)工作组提出,面向Internet会议和电话的简单应用层信令协议,用
于建立、调整和终止多媒体会话。该协议具有简洁、高效、扩展性好的特点,如何将SIP应
用到P2P系统是当前SIP应用的热点,其中一个方向被称为P2P over SIP[1],旨在利用SIP协议
的扩展或承载来完成P2P的叠加网络层的加入、定位、查找和路由等功能。
本文基于P2P-SIP的思想,结合流媒体技术,构建了一个P2P-SIP流媒体系统。该系统能
够自动适应节点动态加入/退出,具有良好的可扩展性、鲁棒性和自组织能力,并且充分利
用了SIP协议在媒体协商上的能力,支持各类型的流媒体功能。除了对系统设计结构的探讨
之外,本文还从实际开发的角度提出了基于开源软件进行二次开发的设计方案。
2.P2P-SIP 流媒体系统设计
2.1 CHORD 算法
P2P 系统的核心是DHT 算法,DHT 的基本思想就是资源信息按照一定的规则存储在节
点上。应用系统通过安全散列算法把访问资源映射到某个标志空间,然后系统利用分布式查
询协议查找资源所依附的节点。代表算法有CHORD,Tapestry,CAN 和Pastry,本文选取
CHORD 作为系统架构算法。
在 CHORD 算法[2]中,节点标识N-ID 和资源标识S-ID 使用相同标识空间。节点根据
N-ID 的大小顺时针形成一个环,每个节点相邻的前后节点分别称为该节点的前驱节点和后
继节点,每个节点不仅保存其前驱和后继结点信息,还维护一个m 项的finger 表,用于路
由。节点n 的finger 表中的第k 项finger[k].node 是chord 环上位于节点n+2k 顺时针方向之
后的第一个节点。
节点维护资源,将<资源标识S-ID,节点IP>信息注册到网络中,与S-ID 顺时针距离最
接近的N-ID 节点将保存该信息。查询过程中,查询节点将请求发送到与S-ID 最接近节点上。
-2-
收到查询请求的节点若发现自身保存有该信息,则直接返回该信息给查询节点,否则根据
finger 表将与S-ID 最接近的节点信息转发给查询节点,查询节点继续发送请求。该过程一
直持续到找到相应节点为止。图1 是一个容量为 的CHORD 环,环内有8 个节点,右边
的表为节点1 的finger 表。
图 1 CHORD 环网络结构示意图
2.2 P2P-SIP 协议
如前文所述,P2P over SIP 的思想是利用SIP 协议的扩展来完成P2P 的叠加网络层的加
入、离开、定位、查找等功能。SIP 协议的可扩展性体现在它与底层传输协议的无关性上。
SIP 协议对支持它的底层传输协议作了最小的假设,它对消息的传输、理解和处理于支
持它的下层协议。
SIP 协议扩充方法主要是在消息上,消息的三个基本部分:消息类型、消息头、消息体
都可以被不断扩充。SIP 基于文本的方式,使各种扩充工作变得十分简便。基于此思想,本
文增加了新的消息类型P2PSIP,新增若干消息头赋予不同代码,并结合不同的应答代码支
持对DHT 的各项操作,下面分别说明。
2.2.1 节点加入
节点加入网络,构造P2PSIP 消息,该消息包含节点注册(p2p-code:0)和节点的N-ID
(p2p-id:N-ID),将消息发送至已在网络中的节点。接收节点若认为自己是申请加入节点
的前驱则返回200ok 和自己的N-ID 还有finger 表,否则在finger 表中查找并返回最有可能
是申请加入节点前驱的节点信息和转发代码300。申请加入节点若收到300 代码则将申请加
入请求转发至相应节点,若收到200ok 则根据收到的信息建立自己的finger 表。完成构建
finger 表后,发送加入完成信息(p2p-code:1)给前驱和后继节点,前驱和后继分别更新自
己的后继信息和前驱信息。这样就完成了节点的加入。
2.2.2 资源注册/查找/注销
资源注册过程中心思想就是找到对应节点,满足资源标识S-ID 等于该节点的N-ID 或位
于该节点与其后继之间,将信息 注册资源的节点首先判断该资源是否应该存放在自身,若不是就在自己的finger 表中找 到最有可能的节点,并向其发送资源注册(p2p-code:5)和该资源的S-ID(p2p-id:S-ID)。 收到资源注册消息的节点会判断自己是否符合要求,若不是则在finger 表中找到最可能的节 -3- 点信息返回300 给注册资源的节点。如此反复直到消息被符合要求的节点接收,信息 节点查询某个资源,与资源注册过程类似,将查询资源消息(p2p-code:5,p2p-id:S-ID) 发送到最有可能保存资源的节点中,收到查询资源消息的节点判断自己是否应该保存有该资 源信息,若是则将查询的信息返回给查询节点,若不是则在finger 表中找最可能的节点信息 并返回300,重复以上最终找到保存资源信息的节点。 与资源注册对应的是资源注销,当某节点维护的资源被撤销,为了网络资源信息的准确 性,该节点有必要发送资源注销消息(p2p-code:8,p2p-id:S-ID)至保存资源信息的节点, 目的是删除对应的资源信息。资源注销还发生在节点正常退出之前,此时应当将所拥有的资 源全部注销。 资源注销遵循与资源注册相同的查找对应节点过程,在此不再赘述。 2.2.2 节点退出 当节点退出时会对网络产生三个影响。一.退出的节点将改变网络结构;二.该节点保存 了一部分网络资源信息;三.该节点维护若干资源,随着节点退出这些资源将不可以被其他 节点访问。 节点退出有两种情况,人为的正常退出和非正常退出。正常的退出时,为了保证网络的 完备性,节点应该执行三个信息维护操作:1.在退出前发布针对本地资源的注销信息,通知 网络中保存资源信息的节点注销该资源信息;2.节点向它的前驱发送注销请求,请求消息包 括它负责存储的网络资源信息和它的后继信息,该前驱保存这些资源信息并调整自己的后 继;3.节点向后继结点发送注销请求,请求消息列出节点前驱的信息,方便该后继节点调整 它的前驱节点信息。 节点异常离开,也就是说某节点在没有完成信息维护的情况下离开了网络,如网络掉线、 断电等意外情况。此时会出现局部资源信息丢失和CHORD 环结构局部破坏的问题。为了应 对这种情况,节点周期性的检测其后继节点是否失效,并进行CHORD 环的修复,而资源信 息丢失的问题可以通过将来资源刷新注册来解决。 2.3 系统模块设计 通过分析系统的关键过程,并且结合流媒体系统的特点,本文将整个系统设计为以下几 个模块。 界面模块:提供用户操作界面,用户信息输入,状态显示灯功能。 流媒体模块:负责节点流媒体功能实现,包括流媒体发送、接收、播放等。 SIP 模块:作为P2PSIP 协议中的通信模块,负责消息传送和接收。 CHORD算法模块:解析SIP 消息内容,结合通信代码实现相应的逻辑控制,完成CHORD 算法各项功能,包括节点加入、退出,资源注册、查找、注销等。 模块间的相互关系如图2 所示。 -4- 图 2 P2P-SIP 流媒体系统设计模块图 3.P2P-SIP 流媒体系统实现 从功能上看,本系统可以分为两个子系统,流媒体系统与P2P-SIP 系统。P2P-SIP 系统 的功能在前文中已有详细描述,而流媒体系统的功能则包括流媒体的发送、接收和播放。本 系统的实现基于两款开源软件——VLC 和PJSIP,分别对应实现流媒体系统与P2P-SIP 系统。 下面分别说明。 3.1 流媒体系统 流媒体系统基于开源媒体播放软件VLC 实现。VLC 是一款功能十分强大的开源媒体播 放软件,可以播放大部分音频和视频格式(H.2, Ogg, DivX, MKV, TS, MPEG-2, mp3, MPEG-4, aac, ...),并支持多种访问方式(文件、物理媒介、电视采集卡和许多网络流协议)。 VLC 也可以转换媒体格式、转换编码格式,还可以作为流媒体服务器在Ipv4 或Ipv6 网络中 完成单播或组播功能。作为开源软件,VLC 为开发者提供了许多可以利用学习的资源,本 文中的流媒体系统就是利用了它的流媒体功能。 流媒体系统的关键在于,节点必须兼具客户端接收流媒体并播放的功能和服务器发送流 媒体的功能。而VLC 本身却采用了单一任务机制,在完成客户端功能的时候不能同时作为 服务器,反之亦不可。所以,采用VLC 二次开发的重点就是改写VLC 核心代码从而实现多 任务机制。 图 3 VLC 模块框架 图 3 是VLC 的框架图[3],图中展示了VLC 的关键模块和运作流程,左下角两个模块 playlist 和input 在VLC 的架构中起了关键的作用,其中playlist 模块接收界面模块传递的命 VLC main -5- 令,根据命令构建一个新的input 模块,input 模块根据命令会开启线程调用合适的功能模块 并对它们进行管理,而运行过程中来自界面的操作命令也经由playlist 模块向input 模块传达, 进而控制整个任务。VLC的单一任务机制就体现在playlist模块和input模块的关系上,playlist 模块只管理一个input 模块,每当playlist 接收了新任务请求,首先会通知其input 模块终止 当前任务,input 模块接收playlist 的命令结束一系列功能模块的运作后最终被playlist 撤销。 然后playlist 才会构建一个新的input 模块来执行新任务。 为实现多任务机制,笔者改写了VLC 的input 模块,在其中增加了input_id 变量,用来 标识相应的input 模块,并且将input 模块采用链表存储,方便playlist 动态的生成新的input 模块;改写playlist 模块,从界面接收命令的同时要求界面提供input_id,从而控制相应的input 模块;同时遵循VLC 模块的开发方法,实现一个新的交互界面模块,该模块支持命令 +input_id 的模式对相应任务进行控制,并且为P2P-SIP 系统预留接口。 3.2 P2P-SIP 系统 P2P-SIP 系统基于开源SIP 协议栈PJSIP 进行开发,PJSIP 是一款优秀的SIP 协议栈,其 主要特征包括[4]:1.极具移植性;2.存储空间小;3.高性能;4.支持众多的SIP 特征和扩展; 5.丰富的SIP 文档和范例。 PJSIP 协议栈内部包含多个SIP 消息处理层,如图4 所示,从下往上依次是TRANSPORT 层、ENDPOINT 层、TRANSACTION 层、UA 层和DIALOG 层。当TRANSPORT MANAGER 收到SIP 消息包时,会把该SIP EVENT 通知上层的ENDPOINT,而ENDPOINT 会找到对 应的接收者,先把EVENT 传给TRANSACTION LAYER,然后再传给UA LAYER(传递的 顺序由每个模块的优先权决定),如果 UA LAYER 指定要处理TRANSACTION 的EVENT, TRANSACTION LAYER 也会把解析后的EVENT 传给UA LAYER。 图 4 PJSIP 消息流图 每个消息处理层以模块的形式注册到协议栈中,开发者可以编写并添加自己的消息处理 模块,对SIP 消息进行解析或修改。笔者基于PJSIP 的模块开发方法,编写了位于APPLICATION 层的P2PSIP 模块,该模块结构如图5 所示。 -6- 图5 P2PSIP 模块结构图 该模块扩展了P2PSIP 消息类型,其中对外部的接口都是PJSIP 预留给开发者的,如此 便能充分利用下层的通信机制,担负起维护P2P-SIP 网络的任务。模块内部包含5 个子模块, 功能描述见表1: 表 1 P2PSIP 子模块模块功能描述表 子模块名称功能描述 p2psip_data P2PSIP 节点各类数据管理,初始化、插入、删除、更新、提取等。 p2psip_msg_send 发送P2PSIP 协议的各类消息。 p2psip_on_rx_request 接收P2PSIP 的各类请求消息,针对消息执行处理。 p2psip_callback 接收P2PSIP 的各类应答消息,管理消息处理。 p2psip_msg_parse 对接收的各类消息进行解析,处理消息数据。 其中,前文所述的P2PSIP 协议各项功能的逻辑实现主要由p2psip_on_rx_request、 p2psip_callback 和p2psip_msg_parse 协作完成。p2psip_msg_send 和p2psip_data 提供界面模 块控制接口。 结合前文流媒体系统中编写的交互界面模块,在该模块中实现查找资源、注册资源、注 销资源等业务逻辑,这样将两个系统整合就能实现P2P-SIP 流媒体系统。 4.总结 基于P2P-SIP技术和流媒体技术,本文构建了一个P2P-SIP流媒体系统。本文详细描述了 如何根据P2P over SIP的思想建立P2P-SIP系统,并结合流媒体技术设计了P2P-SIP流媒体系 统的模块结构。最终从开发者的角度阐述了利用两款开源软件进行系统开发的要点所在,希 望能为相关领域的开发工作提供一些思路。