11、SIP协议介绍Internet的许多应用都需要建立和管理一个会话,会话在这里的含义是在参与者之间的数据的交换。由于考虑到参与者的实际情况,这些应用的实现往往是很复杂的:参与者可能是在代理间移动,他们可能可以有多个名字,他们中间的通讯可能是基于不同的媒介(比如文本,多媒体,视频,音频等)-有时候是多种媒介一起交互。人们创造了无数种通讯协议应用于实时的多媒体会话数据比如声音,影像,或者文本。本SIP(会话初始协议)和这些协议一样,同样允许使用Internet端点(用户代理)来寻找参与者并且允许建立一个可共享的会话描述。为了能够定位精确的会话参与者,并且也为了其他的目的,SIP允许创建基础的networkhosts(叫做代理服务器),并且允许终端用户注册上去,发出会话邀请,或者发出其他请求。SIP是一个轻形的,多用途的工具,可以用来创建,修改和终止会话,它独立运作于通讯协议之下,并且不依赖建立的会话类型。2、SIP协议功能概况SIP是一个应用层的控制协议,可以用来建立、修改、和终止多媒体会话(或者会议)例如Internet电话。SIP也可以邀请参与者参加已经存在的会话,比如多方会议。媒体可以在一个已经存在的会话中方便的增加(或者删除)。SIP显示的支持名字映射和重定向服务,这个用于支持个人移动业务-用户可以使用一个唯一的外部标志而不用关系他们的实际网络地点。SIP在建立和维持终止多媒体会话协议上,支持5个方面:用户定位:检查终端用户的位置,用于通讯。用户有效性:检查用户参与会话的意愿程度。用户能力:检查媒体和媒体的参数。建立会话:”ringing”,建立会话参数在呼叫方和被叫方。会话管理:包括发送和终止会话,修改会话参数,激活服务等等。SIP不是一个垂直集成的通讯系统。SIP可能叫做是一个部件更合适,它可以用作其他IETF协议的一个部分,用来构造完整的多媒体架构。比如,这些架构将会包含实时数据传输协议(RTP)(RFC1889)用来传输实时的数据并且提供QoS反馈,实时流协议(RSTP)(RFC2326)用于控制流媒体的的传输,媒体网关控制协议(MEGACO)(RFC3015)用来控制到公共电话交换网(PSTN)的网关,还有会话描述协议(SDP)(RFC2327)用于描述多媒体会话。因此,SIP应该和其他的协议一起工作,才能提供完整的对终端用户的服务。虽然基本的SIP协议的功能组件并不依赖于这些协议。SIP本身并不提供服务。但是,SIP提供了一个基础,可以用来实现不同的服务。比如,SIP可以定位用户和传输一个封装好的对象到对方的当前位置。并且如果我们利用这点来通过SDP传输会话的描述,立刻,对方的用户代理可以得到这个会话的参数。如果我们用这个像传输会话描述(SESSIONDESCRIPTIONSD)一样呼叫方的照片,一个”呼叫ID”服务很容易就建立了。这个简单的例子说明了,SIP作为一个基础,可以在其上提供很多不同的服务。2SIP并不提供会议控制服务(比如议席控制或者投票系统),并且并没有建议会议应该则那样管理。可以通过在SIP上建立其他的会议控制协议来发起一个会议。由于SIP可以管理参与会议的各方的会话,所以会议可以跨异构的网络,SIP并不能,也不打算提供任何形式的网络资源预留管理。安全对于提供的服务来说特别重要。要达到理想的安全程度,SIP提供了一套安全服务,包括防止拒绝服务,认证服务(用户到用户,代理到用户),完整性保证,加密和隐私服务。SIP可以基于IPV4也可以基于IPV63、术语在这个文档中,关键词”必须”,”不允许”,”要求”,”可以”,”不可以”,”应该”,”不应该”,”建议”,”不建议”,”可能”,”可选”是根据BCP14,RFC2119[2]的规范描述SIP实现需要的不同层次4、实施概览这节通过简单的示例介绍了SIP的基本实现。本节是通过自然的而非正则的示例来介绍的。第一个例子说明了SIP的基本功能:定位一个断点,发出通讯请求,通过协商会话参数建立会话,拆卸刚才建立的会话。图一表示一个典型的Alice和Bob两个用户间的SIP消息交易交换例子.(每一个消息采用字母”F”和一个用来指向正文的一个数字做标记)在这个例子里,Alice在她的PC上使用一个SIP的应用程序(比如说一个软的电话),呼叫Bob在Internet上的一个SIP电话。这个例子也掩饰了两个SIP代理之间,怎样为Alice和Bob建立会话连接。ThistypicalarrangementisoftenreferredtoastheSIPtrapezoidasshownbythegeometricshapeofthedottedlinesinFigure1.Alice通过Bob的SIP标志“呼叫”Bob,这个SIP标志是统一分配的资源(UniformResourceIdentifierURI)称作SIPURI。SIPURI在19.1节中定义。它很像一个email地址,典型的SIPURI包括一个用户名和一个主机名。在这个范例中,SIPURI是sip:bob@biloxi.com,biloxi.com是Bob的SIP服务提供商。Alice有一个SIPURI:sip:alice@atlanta.com。Alice可以输入Bob的URI,也可以直接在地址本的一个超级链接上点击一下Bob的URI。SIP也提供保密URI,称作SIPSURI。例如:sips:bob@biloxi.com。一个基于SIPSURI的通话保证这个通话是安全的,并且对呼叫者和被叫的所有的SIP消息是加密传输的(叫做TLS)。在TLS中,请求是通过加密方式传输给被叫方,但是这个加密机制是基于被叫方宿主服务器的实现的。SIP是基于一个类似HTTP协议的请求应答的通讯模式。每一个通讯都包含对某个功能的请求,并且起码需要一个应答。在这个应答中,Alice的软电话发送一个含有Bbo的SIPURI抵制的INVITE通讯请求。INVITE是一个SIP请求的例子,表示请求方(Alice)希望服务方(Bob)应3答。INVTE请求包含一系列的包头域(Headerfields)。包头中包含很多属性并且包含了传输消息的附加信息。在INVITE中有如下的字段:呼叫的唯一标志,目的抵制,Alice的地址,Alice和Bob建立会话的类型。INVITE请求(图1中的F1)可能看起来像这样的:INVITEsip:bob@biloxi.comSIP/2.0Via:SIP/2.0/UDPpc33.atlanta.com;branch=z9hG4bK776asdhdsMax-Forwards:70To:Bobsip:bob@biloxi.comFrom:Alicesip:alice@atlanta.com;tag=1928301774Call-ID:a84b4c76e66710@pc33.atlanta.comCSeq:314159INVITEContact:sip:alice@pc33.atlanta.comContent-Type:application/sdpContent-Length:142(Alice’sSDPnotshown)atlanta.com...biloxi.com.proxyproxy...Alice’s............................................Bob’ssoftphoneSIPPhone|||||INVITEF1||||---------------|INVITEF2|||100TryingF3|---------------|INVITEF4||---------------|100TryingF5|---------------|||--------------|180RingingF6|||180RingingF7|---------------||180RingingF8|---------------|200OKF9||---------------|200OKF10|---------------||200OKF11|---------------|||---------------||||ACKF12||-------------------------------------------------||MediaSession||================================================||BYEF13||-------------------------------------------------||200OKF14||-------------------------------------------------|||图一:SIP矩形表达的SIP会话建立例子。4在文本消息的第一行,包含了请求的类型(INVITE)。在这行之后的是这个请求的头域。这个例子中包含了最少需要的头域集合。简单介绍一下:VIA域包含了Alice接收发送请求的服务器地址(pc33.atlanta.com)。同样这个包含了一个分支参数来标志Alice和这个服务器的会话事务。TO域包含了显示姓名(Bob)和一个SIP或者SIPSURI(sip:bob@biloxi.com)请求将首先传输到这个URI中。显示姓名(Displaynames)在RFC2822中描述。From域也同样包含一个显示姓名(Alice)和一个SIP或者SIPSURI(sip:alice@atlanta.com)这个URI用来标志请求的原始发起者。这个域也包含了一个TAG参数,这个TAG参数是一个随机字串(1928301774),是软电话(softphone)在URI上增加的一个随机串。用来做标志用途的。Call_ID包含一个全局的唯一标志,用来唯一标志这个呼叫,通过随机字串和softphone的自己名字或者IP抵制混和产生的。通过TOTAG,FROMTAG和CALL-ID完整定义了Alice和Bob之间的端到端的SIP关系,并且表示这个是一个对话性质的关系。CSEQ或者CommandSequence包含了一个整数和一个请求名字。这个Cseq数字是顺序递增的。每当对话中发起一个新的请求都会引起这个数字的顺序递增。Contact域包含一个SIP或者SIPSURI用来表示访问Alice的直接方式,通常由用户名和一个主机的全名(FullyQualifiedDomainNameFQDN)组成。当FQDN作为首选的时候,许多终端用户由于不会由名字登记(而导致不能访问Alice的主机),所以IP地址是可选的。VIA域告诉大家本请求发送到哪里并且应答到哪里,Contract域告诉大家将来的请求将发送到哪里(奇怪…不是Alice发起的么,将来的请求应该是Bob才对啊)。Max-Forwards:最大转发数量限制了通讯中转发的数量。它是由一个整数组成,每转发一次,整数减一。Content-type包含了消息正文的描述(消息正文在本范例中没有列出)Content-length:包含消息正文的长度(字节数)完整的SIP包头域的定义在20节。会话的细节,比如媒体的类型,codec,或者采样速率,没有通过SIP来描述。这个可以通过SIP的消息正文来描述,可以通过其他定义的协议在正文中进行描述。有一种是会话描述协议(SessionDescripotionProtocolSDP)(RFC2327[1])。这个SDP消息(没有在例子中列出)通过SIP的消息中传送,就像通过附件发送EMAIL一样,或者说通过HTTP传输的网页一样。由于softphone并不知道bob或者bob的sip服务器biloxi.com在哪里,所以softphone发送INVITE请求到Alice的sip服务器,atlanta.com。这个atlanta.comSIP服务器应该已经在Alice的softphone中配置了,或者可以通过DHCP获得。a