




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机工程第33卷第18期Vol.33No.18ComputerEngineering·网络与通信·文章编号:1000—3428(2007)18—0112—04文献标识码:A2007年9月September2007中图分类号:TP393基于SIP协议的VoIP的设计与实现厉小军(浙江工商大学计算机与信息工程学院,杭州310035)摘要:会话初始化协议(SIP)是IETF提出的IP电话呼叫信令协议,是一个基于文本的协议,用来创建、修改和终止多媒体呼叫与会话。该文介绍了SIP协议及其分层实现方法,采用UML的类图、状态图和序列图等设计了SIP消息包的结构和SIP协议的事务层,并用C++加以具体的实现。关键词:会话初始化协议;IP电话;VoIPDesignandImplementationofVoIPBasedonSIPLIXiao-jun(CollegeofComputer&InformationEngineering,ZhejiangGongshangUniversity,Hangzhou310035)【Abstract】SIPisproposedbyIETFasIPphonecallorderprotocolwhichistotallyatextmodalitythattobeusedtoestablish,modifyandterminatemultimediacallsandconversation.ThispaperintroducesSIPanditsimplementationmethod,designsthestructureofSIPmessageandtransactionlayerwithclassdiagram,statediagram,sequencediagrametc.ofUML.【Keywords】SIP;IPphone;VoIP随着Internet的发展及普及,作为其核心技术的IP协议体系也迅速发展,从而提出了基于IP的语音技术即VoIP,并迅速融入传统的语音业务领域。会话初始化协议(sessioninitialprotocol,SIP)是由IETF提出的IP电话信令协议,它的主要目的是为了解决IP网中的信令控制,以及同Soft-switch(软交换)的通信,从而构成下一代的增值业务平台,为电信、银行、金融等行业提供更好的增值业务。作为下一代网络(NGN)软交换的关键技术,由于其具有很强的包容性,可以建立如音频、视频、多方通话等各种会话,也可以被用来传送即时消息和文件,另外协议具有可扩充性、对移动性支持、开放的业务生成环境等优点[1~4],使得SIP引起了理论界和VoIP业界的广泛关注[5,6]。本文在介绍SIP协议的基础上,利用统一建模语言(UML)详细设计了SIP协议,并用C++加以实现。1SIP协议介绍1.1SIP协议基本概念SIP协议是多媒体通信系统框架协议之一,用于建立、改变或者结束多媒体会话的应用层协议,可以用UDP或TCP作为其传输协议。SIP是一种基于文本的,比较简单的会话初始化协议。它不提供所有的通信协议,而只提供会话或呼叫的建立与控制功能,这样有利于实现业务与呼叫控制的分离。SIP可以应用于多媒体会议、远程教学及Internet电话等领域。SIP体系结构中,包括以下几个主要部件:用户代理(useragent),代理服务器(proxyserver),重定向服务器(redirectserver),注册服务器(registrar)等。以上几种服务器可共存于一个设备,也可以分布在不同的物理实体中。SIP服务器完全是纯软件实现,可以根据需要运行于各种工作站或专用设备中。理论上,SIP呼叫可以只有双方的用户代理参与,而不需要网络服务器。设置服务器,主要是服务提供者运营的需要,运营商通过服务器可以实现用户认证、管理和计费等功能,并根据策略对用户呼叫进行有效的控制。同时可以引入一系列应用服务器,提供丰富的智能业务。——1121.2SIP消息SIP协议是一个基于文本的协议,使用UTF-8字符集(RFC2279[7])。一个SIP消息既可以是一个从客户端到服务器端的请求,也可以是一个从服务器端到客户端的一个应答。即使在字符集上和语法细节上有所不同,请求和应答消息都是基于RFC2822格式的。这两种消息类型都由一个起始行、一个或者多个包头域、一个可选的消息正文组成。一般消息=起始行*消息包头CRLF[消息正文]起始行=请求行/状态行起始行、每一个包头行、空行都必须由回车换行组成(CRLF)。即使消息正文没有,也必须有一个空行跟随[7]。下面以SIP请求消息加以说明。SIP请求是根据起始行中的Request-Line来区分的。一个Request-Line包含方法名字,Request-URI,用单个空格(SP)间隔开的协议版本。Request-Line由CRLF结束。除了用作行结束标志以外,不允许CRLF出现在其他地方。在其他域中,不允许出现线形的空白(linerwhitespace,LWS)。REQUESTMESSAGE=REQUESTLINE*(GENERICHEADER)REQUESTHEADERCRIF[MESSAGE-BODY]REQUEST-LINE=METHODSPREQUEST-URISPSIP-VERSIONCRLFSIP消息包头主要头域包括以下几部分内容[8]:(1)FROM:所有请求和响应消息必须包含此字段,以指示请求的发起者。服务器将此字段从请求消息复制到响应消息。(2)TO:该字段指明请求的接收者,其格式和FROM相同,仅第一个关键词代之以TO。所有请求和响应消息必须包作者简介:厉小军(1974-),男,副教授、博士,主研方向:企业信息化,软件工程收稿日期:2006-10-13E-mail:lixj@含此字段。(3)CALL-ID:该字段用以唯一标识一个特定的邀请或标识某一个客户的所有登记。需要注意的是,一个多媒体会议可能会有多个呼叫,每个呼叫有自己的CALL-ID。(4)CSEQ:CSEQ称为命令序号。客户在每个请求中加入此字段,它由请求方法和一个十进制序号组成,该序号由客户选定,在CALL-ID范围内唯一确定。(5)VIA:VIA字段用以指示请求经历的路径。它可以防止请求消息传送产生环路,并确保响应和请求消息选择同样的路径,以保证通过防火墙或满足其它特定的选路要求。(6)CONTACT:该字段用于INVITE,ACK和REGISTER请求以及成功响应、呼叫进展响应和重定向响应消息,其作用是给出其后与用户直接通信的地址。1.3SIP协议结构SIP是一个分层的协议,由一组相对无关的处理层次组成,这些层次之间只有松散的关系。协议分成不同层次来描述是为了能够更清晰地表达有功能的公共要素的交叉描述。SIP协议基于TCP/IP协议之上,其自身逻辑分层大体如图1(参见RFC3261)[9]。应用层实体元素(SIPelements)事务层用户(transactionuser)事务层(transactionlayer)传输层(transportlayer)DNSNAPTR解析解析SRV解析编码和语法层(syntaxandencoding)A解析TCP/IP图1SIP协议逻辑分层(1)编码与语法层(syntaxandencodinglayer),较为严格地定义了SIP地址请求命令(REGIST,INVITE,BYE),各种头信息的表达式。编码方式是采用扩展的Backus-NaurFormgrammar(BNF范式)(参见RFC3261Section25)。(2)传输层(transportlayer),要实现TCP和UDP的两种连接。并且使用NAPTR,SRV,A解析(3种DNS解析),寻找目的地址。(3)事务层(transactionlayer),实质上是个状态机,当以UDP为底层次传输时,含重发机制,确保可靠性。(4)事务层用户(transactionuser),控制和处理相应信息,实现客户处理实体(clienttransaction)、服务处理实体(servertransaction)、代理处理实体(proxytransaction)。(5)应用层,实现各种实体元素(SIPelements)。如:用户代理,注册服务器,重定向服务器,代理服务器。2SIP消息的设计与实现根据SIP消息的格式和包头域内容,在对SIPMessage包结构的设计过程中,使用了UML中的类图描绘了SIPMessage包体的结构,如图2所示。基类MsgElement包括生成数据内容(GetRawData)、检查消息有效性(IsValid)、解析消息内容(Parse)等方法;SIP消息类(SIPMsg)从基类继承过来,并包含SIP消息包头(SIPHeader),SIP消息分为请求消息(RequestMsg)和响应消息(ResponseMsg);SIP消息包头包括5部分内容,分别是:FromHeader,ToHeader,ContactHeader,ViaHeader,CSeqHeader。图2SIPMessage类图用C++定义SIPMsg类结构如下:classSIPMsg:publicMsgElement{public:SIPMsg();SIPMsg(stringKind);//构造函数virtual~SIPMsg();//析构函数staticSIPMsg*Factory(string*msg);//RequestMsg/ResponseMsg解析StartLine*GetStartLine()const;//得到起始行voidSetStartLine(StartLine*varSL);//设置起始行voidAddVia(ViaHeader*vh);//追加Via消息包头voidAddHeader(SIPHeader*pHeader);//追加消息包头SDPMsg*GetMsgBody()const;voidSetMsgBody(SDPMsg*body);//设置消息体SIPHeader*GetHeader(conststringheadeName);//获取消息包头list<SIPHeader*>GetHeaderList()const;//获取消息包头列表stringGetCallID();//获取CallIDstringGetMsgKind()const;//获取消息类别virtualstringGetRawData();//生成数据内容virtualboolIsValid();//检查消息有效性virtualboolParse(string*buff);//解析消息内容};3SIP事务层的设计与实现3.1SIP呼叫流程SIP是一个基于事务处理的协议:部件之间的交互是通过一系列无关的消息交换所完成的。特别是,一个SIP事务由一个单个请求和这个请求的所有应答组成,这些应答包括了零个或者多个临时应答以及一个或者多个终结应答。事务分为客户端和服务端两方。客户端事务是通过维持一个状态机来提供服务的,总共有两种类型的客户端事务状态机,一个用于处理INVITE请求,对应的是一个INVITE客户事务;另外一个是用来处理其他所有的非INVITE请求的,对应的是非INVITE客户事务。服务端事务是用于传输请求到TU(TransactionUser),通过状态机来实现。当请求到达的时候由核心创建,事务的处理也是主要围绕着对应请求。要成功建立SIP呼叫,需包含两个请求消息:INVITE请求和ACK请求。INVITE请求用于邀请被叫,被叫接受邀请后,将返回200OK响应,主叫应发ACK证实消息进行确认。图3是实现呼叫的网络示意图。呼叫建立各个步骤的含义如下:(1)主叫用户代理发INVITE请求到Proxy()。—113—(2)Proxy()根据INVITE请求中的Request-URI判断出被叫不属于其管辖范围,属于另一代理服务器的管辖范围,于是返回此代理服务器的地址。(3)Proxy()重新改写INVITE请求的Request-URI,改为Proxy()的地址,并转发此INVITE请求。(4)Proxy()收到INVITE请求后,分析To字段中包含的被叫用户地址,经分析知其在其管理范围内,于是将INVITE直接送给Bob。(5)被叫用户接受呼叫,向Proxy()发200OK响应。(6)Proxy()将200OK转发给Proxy(A)。(7)Proxy()再将200OK响应转发给Alice。(8)Alice向Proxy(A)发ACK证实消息。(9)Proxy(A)将ACK转发给Proxy()。(10)Proxy()将ACK转发给Bob,至此呼叫建立成功。AproxyproxyAlice’softphones…………………Bob’ssoftphone图3SIP呼叫的网络示意图当呼叫释放时,用户只需发送一个BYE呼叫请求。各个步骤含义如下:(1)用户1挂机,Alice发Bye请求到Proxy(A)。(2)Proxy1收到Bye请求,将其转发给Proxy()。(3)Proxy()接受Bye请求,向Bob发Bye请求。(4)Bob向Proxy()发200成功响应。(5)Proxy()将200成功响应传给Proxy(A)。(6)Proxy(A)将200成功响应传给Alice。(7)Alice发ACK进行确认,此ACK送至Proxy(A)。(8)Proxy(A)将ACK转发给Proxy()。(9)Proxy()将ACK请求送至Bob。3.2SIP事务状态图在对SIP协议中客户端和服务器端的状态图的设计过程中,使用UML的状态图来描绘。其中,客户端事务状态图如图4。图4INVITE客户端事务状态图初始状态,“calling”,必须保证TU是用INVITE请求来初始化一个新的客户端事务。客户端事务把请求发送到通信层来进行发送。如果使用的是非可靠传输的通信层,客户端事务启动一个定时器A并且由缺省值T1组成。同时客户端事务启动一个定时器B并且有着64×T1秒的缺省值(定时器B控制事务的超时)。当定时器A触发后,客户端事务重发这个请求,把请求交给通信层进行发送,并且重新设置定时器为2×T1。当定时器A在2×T1后触发后,请求再次重传(如果客户端事务依旧还是在这个状态的话)。这个处理一直持续下去,这样请求才能每重发一次以后定时器延时1倍。重发机制只有当客户端事务在“calling”状态的时候才能进行。缺省的T1是500ms[6]。当定时器B触发的时候,如果客户端事务依旧是在“calling”状态,那么客户端事务应当通知TU发生了超时。客户端事务不能产生ACK。64×T1是和在不可靠通信链路上传输7个请求的时间相同。如果客户端事务在“calling”状态接收到一个临时应答,那么就把状态切换到“proceeding”状态,客户端事务不应当再次重新发送请求。当在“calling”或者“proceeding”状态的时候,如果接收到一个应答码是300-699的应答,那么就把状态切换到“completed”。客户端事务把收到的应答转给TU,并且客户端事务产生ACK请求,并且把ACK交给传输层进行传送。ACK和原始请求发送到相同的地址、端口,并且用同样的transport。当客户端事务进入“completed”状态的时候,应当开始一个定时器D,缺省值在非可靠通信上至少是32s,在可靠通信上是0s。定时器D反应了服务端事务在非可靠传输的情况下,在“completed”状态维持的时间。这个是和INVITE请求服务端事务定时器H相同的,定时器H的缺省值是64*T1。在“completed”状态下,收到的任何终结应答的重传都应当产生一个ACK应答到通信层来重新发送,但是新近收到的应答却不能传送给TU。如果在客户端事务状态是“completed”的时候,定时器D触发,那么客户端事务必须转到终结状态。当客户端状态是“calling”或者“proceeding”状态的时候,接收到一个2xx应答必然导致客户端事务进入“terminated”状态,并且应答交给TU处理。处理这个应答的方法依赖于TU是一个proxy核心还是UAC核心。UAC核心会给应答产生ACK,proxy核心会转发一个200(OK)应答到上行队列。这个在proxy和UAC之间,对200(OK)的不同的处理是导致对应答的处理不在事务层进行的原因。当客户端事务进入“terminate”状态以后,客户端事务立刻销毁。原因是当给一个INVITE请求的2xx应答的处理,对于proxy转发时和对UAC处理ACK时是不一样的。因此,每一个2xx都需要交给proxy核心,或者交给UAC核心,这期间没有事务层的处理。由于篇幅有限,服务器事务状态图在此不加以描述。3.3SIP事务处理序列图以下举例说明INVITE客户端事务在2xx响应情况下的序列,如图5所示。Invalid用来作为无效时的处理;IsValid用来判断是否有效。(5)STM类:其中的方法Process用来对事件进行处理,作为状态机使用。(6)Thread类:Start用来生成一个线程;Run()用来启动线程;OnDelete处理线程;OnEnd退出线程。(7)TimeTrigger类:Start用来启动一个时间触发器;SetTime用来设置时间;Stop用来停止时间触发器;Pause用来暂停时间触发器;ReStart用来重启动时间触发器。(8)Transition类:Process用来状态迁移时的处理。4结论本文对SIP协议作了基本的介绍,并用UML设计了SIP消息及核心的事务层,给出了具体的实现方法。本文的研究工作已在Linux环境下,用C++加以实现,从系统运行的结果来看,设计是合理的,也是可行的。SIP作为NGN中重要的协议,已趋于成熟,由于其简单性、可扩展性、分布式控制、成本低等优点,日益受到业界的广泛关注,并且得到了一定范围的应用。SIP协议与其他技术的相结合,将会为多媒体业务的开发和部署提供更广阔的空间。参考文献1王本良.VoIP技术现状与发展分析[J].商业IT,2005,(9):17-58.2桂海源.IP电话技术与软交换[M].北京:北京邮电大学出版社,2004:102-124.3唐颖德,罗雪芳.VOIP技术发展综述[J].电子技术应用,1999
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 组织生命周期与战略选择考核试卷
- 电机制造中的电机运行监测技术考核试卷
- 棉麻企业人力资源激励制度与绩效管理体系优化实践考核试卷
- 十年后的家乡初一语文作文
- 前方初二语文作文
- 描写风景的初二语文作文大全
- 皮革制品的环保标准与国际认证考核试卷
- 电路分析与仪器设计考核试卷
- 电视机制造业的企业文化塑造与传承考核试卷
- 管道工程质量管理规范与标准考核试卷
- 图文转换-图表(小题训练)(解析版)-2025年部编版中考语文一轮复习
- 与数列相结合的概率综合问题-2022年高考数学二轮复习之大题专练(解析版)
- 中考数学函数一次函数复习课件
- 全套教学课件《工程伦理学》
- 倍他司汀推广方案
- 山东省济南市2023-2024学年高二下学期7月期末考试 数学 含解析
- 2024年认证行业法律法规及认证基础知识
- 智鼎在线测评题图形题
- 高考新题型现代文阅读Ⅱ小说之双文本比较阅读答题攻略-2025年高考语文一轮复习
- 2024年山东省菏泽市曹县小升初英语试卷
- 智慧园区规划和建设咨询服务合同
评论
0/150
提交评论