Resiprocate及SDP协议详细分析(共35页).doc
《Resiprocate及SDP协议详细分析(共35页).doc》由会员分享,可在线阅读,更多相关《Resiprocate及SDP协议详细分析(共35页).doc(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上Resiprocate介绍1.前言本文主要内容来自互联网,特此感谢Steven的辛苦撰写和resiprocate开源组织的无私奉献以及sip协议的创造者Schulzrinne教授和Rosenberg大师的辛勤工作。2从SIP谈起说明:不期待一次就把RFC3261或者其他的协议文档内容及其细节全部记住或者完全理解;把原理性的东西及其脉络厘清也许更重要;在调试程序和看协议栈源码的过程中我的做法是一直把RFC3261(经常的是那份中文文档J的文档打开;遇到忘记或者不是太明白的概念和内容就在文档中再搜索相关主题及内容来看看;经常会碰到这样的问题,我发个内容给SIPProxy或
2、者SIPServer,可是并没得到我希望的回复或者与期待的回复内容有出入,这时,我的经常做法是再去研读协议的相关定义,看看是不是我哪个细节并没理解深入或者引起注意,导致我发出去的内容与协议标准有出入或者我的流程与协议定义不吻合。接下来的内容是前人的文档整理,只是个大概,如果没兴趣,完全可以跳过不看;协议栈部分基本上是分成DUM与Stack两部份可以先后看,也可以先看Stack部分。补充说明:文档中的大部分图片都来自网上公开的资料,只有少数几幅是自绘,因此出现内容不清和误导,概不负责J特此感谢借鉴资料和图片的原创者们,虽然他们并不知道又误导了一个菜鸟。2.1SIP(SessionInitiati
3、onProtocol)简介最先由美国哥伦比亚大学的HenningSchulzrinne教授在1998年初开始发起,1999年3月由IETF的MMUSIC(MultipartMultimediaSessionControl)工作小组制定正式标准成为RFC2543,1999年9月IETF成立新的工作小组,负责SIP新版本2.0的制定,并于20XX年7月释出初版RFC2543bis,于20XX年发布了RFC3261。RFC3261的发布,标示着SIP的基础已经确立,随后又发布了几个RFC增定版本,充实了安全性及身份认证等几个领域的内容,例如RFC3262对临时响应做了可靠性的规范。RFC3263确立
4、了SIPproxy的定位规则。RFC3264提供了Offer/AnswerModel,RFC3265则是确立了具体的事件通知。如同Internet一样,SIP易于理解、扩充、及实做,作为IETF的规范,SIP将Internet开放标准的精神延伸至通讯领域,实现了不同计算机、电话、及软件的通讯。SIP的讯息类似于HTTP(RFC2068),其寻址方式,则是重用了SMTP的寻址方式,SIPaddress(如:sip:inabassl.es.ncku.edu.tw)与E-mailaddress的结构相同,SIP甚至利用Web的体系结构,如DNS,而使得SIP的使用者之间的通讯,有更高的扩充性。 SI
5、P有下列几点特性 利用文字(Text-based)的方式来编码,类似HTTP/1.1 Client-Server的架构 Clients端初始一个呼叫(caller) Servers端响应呼叫(callee) Signal与media独立,SIP负责signal部分,media传送部分可以使用RTP等,可与其它IETF所制订的协议配合,例如:RFC2327(SDP),RFC2616(HTTP/1.1),RFC2396(URL)2.2SIP命名方式SIP的地址称做SIPURLs,其格式为userhost:port,使用者利用REGISTER的SIPrequest来结合自己的SIPURLsuser代
6、表使用者名称或是电话号码host代表domainname或是数字型态的IPaddress举例来说sip:inaba或是sip:140.92.61.552.3SIP组件介绍在SIP是一个ClientandServer的架构,在此环境当中,有三个主要的组件分别为:UserAgents,Servers还有LocationServers。 UserAgents在SIP环境中是终端设备,主要负责产生SIPrequests,用来建立多媒体会议(mediasession),并且传送及接收多媒体资料。UserAgents又分成了UserAgentClient(UAC)及UserAgentServer两种模式。
7、UAC负责产生一个Request及处理一个Response,UAS怎是接受一个Request并且产生response。在Session建立过程中,UA通常需要接替着扮演这两个角色。这点并不像其它ClientandServer架构,例如HTTP,PC一直扮演着HTTPclient的角色,而WebServer也一直扮演着HTTPServer的角色。 Servers根据RFC3261中定义,Server主要分成了Proxy,Redirect,以及Registrarserver。l SIPproxy:负责接受UA或其它proxy所发送的SIPRequest,并且转送Request到其它地方。l Red
8、irectServer:负责接受UA或其它proxy所发送的SIPRequest,并且传回redirectionresponse(3xx),指出这个Request应该送往何方。l RegistrarServer:负责接受SIPregistrationrequests,并且更新SIPUA在LocationServer或其它数据库当中的信息。SIPproxy,Redirect还有Registrarservers只有做单纯的signal转送,他们没有传送media及产生SIPRequest的能力。Proxy,Redirect,以及Registrarserver只是逻辑概念定义的不同而物理实现上完全可
9、以在同一物理位置实现。l LocationServers:在RFC3261中,通常当作一个数据库来使用。数据库当中可以存放使用者的信息,例如URLs,IPaddress,或是其它资料等等。SIPUA不能直接来存取Locationserver,而是透过proxy,redirect,或是registrarserver。2.4SIPmessageSIPmessage的语意及表头与HTTP/1.1(RFC2616)相同。可以分成两类,一类是Request,另外一类是Response。在RFC3261当中,定义了六个基本的SIPrequest种类,如表2.1所示。方法说明INVITE建立会话Sessio
10、nACK对INVITE做最后的确认BYE结束一个已经存在的会话CANCEL取消尚未建立联机的会话REGISTER注册使用者的URLOPTIONS查询Server及其功能表2.1、SIPmethodsResponse用status-codes来表示响应的内容,符合且扩展了HTTP/1.1responsecode。分成Provisional(暂时)及Final(最终)两类,Provisional为1xx系列,Final则包括了2xx,3xx,4xx,5xx,6xx等系列,表2.2表示各个不同类别的Response。方法说明1xxInformational2xxSuccessful3xxRedire
11、ction4xxClient-Error5xxServer-Error6xxGlobal-Failure表2.2、SIPResponse1xxInformationalresponses指的是server或是proxy正在执行一些未来的动作,并还没有一个定义好的response。2xx代表这个request是成功的,并且必须结束一个搜寻的动作。3xxRedirection会回复欲通讯的使用者目前的位置信息。4xxresponse是Server对于UAC所提出的request回复一个失败的response。5xxresponse是代表Server本身发生了错误。GlobalFailures6xx
12、指的是server有一个关于特定的使用者最终的信息,不仅仅是这个特定的Request-URI,所有未来的对这个使用者的搜寻都应该被终止。表2.3为几个常用的Responsecode范例ResponsecodeReasonPhrase100Trying200OK302Movedtemporarily403Forbidden503ServiceUnavailable600Busy表2.3、SIPResponsecode2.5SDPSIPmessagebody当中,可以携带任何的资料,但通常是给通讯双方用来协商session相关的信息。SIP本身并没有提供多媒体协商的能力,多媒体协商必须仰赖Sess
13、ionDescriptionProtocol(SDP),SDP本身并不是一个通讯协议,它的描述语言是基于文字的。SIP利用answer/offer的模式来使用SDP。呼叫者送出一个INVITE讯息并携带着SDP,其中SDP包含了呼叫者想使用的多媒体的格式、地址、Port,被呼叫方在响应的时候,便可以针对呼叫者所提出的SDP,做出接受或拒绝的响应,这种双方协商的结果,就可以得知多媒体资料格式及通讯的地址为何。SDP定义在RFC2327当中,后来经过修订及汇集draft之后,发表了RFC3264“AnOffer/AnswerModelwithSDP”,RFC3264明确的描述应该如何将SIP与SD
14、P一起使用。SDP简单地提供一个描述session信息的格式。基本而言,一个session是由数个mediastream所组成,因此,要描述一个session必须要有数个相关的参数。SDP当中有session-level与media-level的参数, session-level的参数包含了 session的名称、 session的发起者、 session的期限等等。 Media-level的信息包含了 media的种类, portnumber、 传输协议以及media的格式。图2.1为SDP的结构。SessionDescriptionSessionLevelProtocolVersionOr
15、iginatorandSessionIDSessionNameSessionTimeMediaNameandTransportConnectionInformationMediaDescription图2.1SDPsessionDescriptionStructure2.6SIP运作模式SIP的呼叫建立如图2.2所示,开始的时候caller会送出SIPINVITE的讯息给callee,callee收到之后,会马上响应一个100Ringing的讯息通知caller,说明目前callee已经收到INVITE讯息且正在处理中,如果callee愿意与caller通话,便会送出200OK的respons
16、e,最后caller再送出ACK,此时便可以开始进行会议。当其中一方想结束通讯时,便会送出BYE的讯息来通知对方,对方响应200OK便可以结束目前进行会议。Client(Caller/UA)Server(Callee/UAS)INVITE100:Trying180:Ringing200:OKACKBye200:OKRTP图2.2SIPcallflow2.6.1SIPproxy模式以图2.3为例,caller(inaba)先送出一个INVITE讯息呼叫callee(yucho),proxyserver收到之后便会去做查询,查询完成之后便得知目前callee实际的地址在yucho,于是proxys
17、erver便会以yucho为对象发出INVITE讯息。callee在回复200OK的时候,会将200OK的response响应给proxyserver,再由proxyserver转送给caller。inabayucho1.INVITE yucho4. ResponseSIP Proxy2. INVITEyucho3. Reponse2.6.2SIPRedirect模式如图2.4所示,与proxyserver不同的地方,在于redirectserver查询得知callee实际的地址的时候,并不像proxyserver会直接代为处理之后session的建立,而是将callee的实际地址告知call
18、er,让caller自行送出新的INVITE。使用redirect的模式,可以减低server的负担,但caller必须有能力将request的讯息传送到callee。inabayucho1.INVITE yucho2. Move temporally Contact: yuchoSIP Proxy/Redirect Server3. INVITEyucho4. Reponse3.关于协议栈的系统设计SIP为应用层(Application-Layer)的协议,所以不需要改变操作系统便可以支持,以SIP来支持行动通讯,对于real-time的服务可以提升其效能。SIP已经获得3GPP(Third
19、GenerationPartnershipProject)、3GPP2(ThirdGenerationPartnershipProjectNumber2)等机构认证,成为未来第三代行动通讯(3G)的标准。事务用户层(Transaction User)事务层(Transaction )传输层(Transport)语法与编码层(Syntax and Encoding)下面是SIP的分层图示,IETF坚持分层,不同模块功能相对独立,各层之间松散耦合。以下是Sip客户、服务端数据传输示意图:Sip Server/ProxySIP ClientSIP ClientSIP/PSTN G/WIPGatewa
20、y/Firewall3.1ResiprocateSIPStack解析之基础类最期望的还是能把Resiprocate的源码脉络能理的清楚,大家能看个明白;并且还想搞清楚它为什么要这样设计,它设计的理念和考虑的关键是些什么。接下来的介绍其中有个人对源码设计的粗浅认识,其间会夹杂作者对面向对象设计的胡乱发挥。首先还是要祭出这面大旗,”类是对概念的描述,面向接口编程;封装变化。”Resiprocate中大部分类就是对RFC3261各种SIP元素、组件的封装,并且也体现了RFC协议设计的层次。在面向对象的设计中我们首先就要厘清问题域的所在;SIPStack的设计就是要充分考虑完整展现RFC定义的各种元素
21、和概念以及让这些独立而又关联的元素互动起来成为一个活的系统。可以这样来考虑,比如我们知道RFC定义了一个SIPMESSAGE的概念;下面是从RFC文档拷贝的内容:SIP消息=起始行G消息头部CRLF(空行)消息体因此SIPMessage这个概念元素还包括了更多的元素和概念;SIPMessage中我们能抽象出更通用的概念我们暂且叫它Message;起始行的概念E文RequestLine以及SattusLine又包括了很多消息头(这是包容的关系),SIPURL也包括消息头,等等,还有什么参数什么的元素呢;当我们在考虑和提炼这些概念和元素的时候,我们思考怎么抽象他们呢,它们又有什么基本的元素及其共性
22、呢?他们之间的关系如何组织呢?Resiprocate的源码告诉了我们如何去设计和封装这些概念的上佳实现。在Resiprocate中一些RFC3261中定义元素的对应:建议:利用CRC卡片的方式去记录理解Resiprocate中的大量的类及其关系。CRC:类、关系、控制。3.1.1DUM的设计浅析:抽象接口:CLASSHANDLED,CLASSInviteSessionHandler(诸如此类)对象之源:CLASSHANDLED(多态和控制的基础)交互控制:CLASSHandle,CLASSHandleManager概念封装成类典型:CLASSDialog,CLASSDialogId,CLASS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Resiprocate SDP 协议 详细 分析 35
限制150内