分类: 嵌入式
2011-03-22 14:56:49
这节通过简单的示例介绍了SIP的基本实现。本节是通过自然的而非正则的示例来介绍的。
第一个例子说明了SIP的基本功能:定位一个断点,发出通讯请求,通过协商会话参数建立会话,拆卸刚才建立的会话。
图一表示一个典型的Alice和Bob两个用户间的SIP消息交易交换例子.(每一个消息采用字母”F”和一个用来指向正文的一个数字做标记)在这个例子里,Alice在她的PC上使用一个SIP的应用程序(比如说一个软的电话),呼叫Bob在Internet上的一个SIP电话。这个例子也掩饰了两个SIP代理之间,怎样为Alice和Bob建立会话连接。This typical arrangement is often referred to as the "SIP trapezoid" as shown by the geometric shape of the dotted lines in Figure 1.
Alice 通过Bob的SIP标志 “呼叫” Bob,这个SIP标志是统一分配的资源(Uniform Resource Identifier URI)称作SIP URI。SIP URI在19.1节中定义。它很像一个email抵制,典型的SIP URI包括一个用户名和一个主机名。在这个范例中,SIP URI是sip:bob@biloxi.com,biloxi.com是Bob的SIP服务提供商。Alice有一个SIP URI: sip:alice@atlanta.com。 Alice可以输入Bob的URI,也可以直接在地址本的一个超级链接上点击一下Bob的URI。SIP也提供保密URI,称作SIPS URI。例如:sips: 。 一个基于SIPS URI的通话保证这个通话是安全的,并且对呼叫者和被叫的所有的SIP消息是加密传输的(叫做TLS)。在TLS中,请求是通过加密方式传输给被叫方,但是这个加密机制是基于被叫方宿主服务器的实现的。
SIP是基于一个类似HTTP协议的请求应答的通讯模式。每一个通讯都包含对某个功能的请求,并且起码需要一个应答。在这个应答中,Alice的软电话发送一个含有Bbo的SIP URI抵制的INVITE通讯请求。INVITE是一个SIP请求的例子,表示请求方(Alice)希望服务方(Bob)应答。INVTE请求包含一系列的包头域(Header fields)。包头中包含很多属性并且包含了传输消息的附加信息。在INVITE中有如下的字段:呼叫的唯一标志,目的抵制,Alice的地址,Alice和Bob建立会话的类型。INVITE请求(图1中的F1)可能看起来像这样的:
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob
From: Alice
Call-ID: a84b
CSeq: 314159 INVITE
Contact:
Content-Type: application/sdp
Content-Length: 142
(
atlanta.com . . . biloxi.com
. proxy proxy .
. .
softphone SIP Phone
| | | |
| INVITE F1 | | |
|---------------> | INVITE F2 | |
| 100 Trying F3 |---------------> | INVITE F4 |
|<--------------- | 100 Trying F5 |---------------> |
| |<-------------- | 180 Ringing F6 |
| | 180 Ringing F7 |<--------------- |
| 180 Ringing F8 |<--------------- | 200 OK F9 |
|<--------------- | 200 OK F10 |<--------------- |
| 200 OK F11 |<--------------- | |
|<--------------- | | |
| ACK F12 |
| -------------------------------------------------> |
| Media Session |
|<================================================> |
| BYE F13 |
| <------------------------------------------------- |
| 200 OK F14 |
| -------------------------------------------------> |
| |
图一:SIP矩形表达的SIP会话建立例子。
在文本消息的第一行,包含了请求的类型(INVITE)。在这行之后的是这个请求的头域。这个例子中包含了最少需要的头域集合。简单介绍一下:
VIA域包含了Alice接收发送请求的服务器地址(pc33.atlanta.com)。同样这个包含了一个分支参数来标志Alice和这个服务器的会话事务。
TO域包含了显示姓名(Bob)和一个SIP或者SIPS URI(sip:bob@biloxi.com)请求将首先传输到这个URI中。显示姓名(Display names)在RFC 2822中描述。
From域也同样包含一个显示姓名(Alice)和一个SIP或者SIPS URI(sip:alice@atlanta.com)这个URI用来标志请求的原始发起者。
这个域也包含了一个TAG参数,这个TAG参数是一个随鸡字串(1928301774),是软电话(softphone)在URI上增加的一个随鸡串。用来做标志用途的。
Call_ID包含一个全局的唯一标志,用来唯一标志这个呼叫,通过随机字串和softphone的自己名字或者IP抵制混和产生的。通过TO TAG, FROM TAG和CALL-ID完整定义了Alice和Bob之间的端到端的SIP关系,并且表示这个是一个对话性质的关系。
CSEQ或者Command Sequence包含了一个整数和一个请求名字。这个Cseq数字是顺序递增的。每当对话中发起一个新的请求都会引起这个数字的顺序递增。
Contact域包含一个SIP或者SIPS URI用来表示访问Alice的直接方式,通常由用户名和一个主机的全名(Fully Qualified Domain Name FQDN)组成。当FQDN作为首选的时候,许多终端用户由于不会由名字登记(而导致不能访问Alice的主机),所以IP地址是可选的。
VIA域告诉大家本请求发送到哪里并且应答到哪里,Contract域告诉大家将来的请求将发送到哪里(奇怪…不是Alice发起的么,将来的请求应该是Bob才对啊)。
Max-Forwards:最大转发数量限制了通讯中转发的数量。它是由一个整数组成,每转发一次,整数减一。
Content-type包含了消息正文的描述(消息正文在本范例中没有列出)
Content-length:包含消息正文的长度(字节数)
完整的SIP包头域的定义在20节。会话的细节,比如媒体的类型,codec,或者采样速率,没有通过SIP来描述。这个可以通过SIP的消息正文来描述,可以通过其他定义的协议在正文中进行描述。有一种是会话描述协议(Session Descripotion Protocol SDP)(RFC2327[1])。这个SDP消息(没有在例子中列出)通过SIP的消息中传送,就像通过附件发送EMAIL一样,或者说通过HTTP传输的网页一样。
由于softphone并不知道bob或者bob的sip服务器biloxi.com在哪里,所以softphone发送INVITE请求到Alice的sip服务器,atlanta.com。这个atlanta.com SIP服务器应该已经在Alice的softphone中配置了,或者可以通过DHCP获得。atlanta.com SIP服务器是一台代理服务器。代理服务器接收SIP请求并且根据请求转发。在这个例子中,代理服务器接收到INVITE请求,并且回送一个100(Trying)应答给Alice的softphone。100(Trying)应答表示INVITE请求已经收到,并且代理服务器正在转发INVITE请求。SIP的应答是通过一个三位数的数字表示的。SIP应答同样包含TO、FROM、Call-ID,CSEQ和在VIA中的分支参数,这个参数使得Alice的softphone可以把请求和应答关联起来。atlanta.com代理服务器收到INVITE请求之后,就去找biloxi.com可能通过DNS服务来找提供这个biloxi.com的SIP服务器。这在[4]中有描述。最后,转发INVITE请求到biloxi.com或者能到达biloxi.com的代理服务器。在转发请求之前,atlanta.com代理服务器会在via头上增加一个一段包含自己抵制的值(INVITE已经包含了Alice的的地址VIA域)。biloxi.com代理服务器收到这个INVITE请求并且返回一个100(Trying)应答给atlanta.com代理服务器标志这它已经收到这个请求并且正在处理这个请求。这个代理服务器通过查询数据库,通常叫做地址服务,这个服务中包含了bob的当前ip地址。(我们在下一节可以看到这个数据库是怎么回事)biloxi.com代理服务增加另一段包含自己地址的VIA头域并且发送它到bob的sip 电话。
Bob的SIP电话接收到INVITE请求并且提醒bob有一个从Alice的呼入,这样bob可以决定是否响应这个呼入。这个意思就是:bob的电话响了。bob的sip电话发送一个180(Ringing)回应,这个回应减通过两个代理服务器原路返回给Alice。每一个代理服务器通过via头域决定该把这个应答发送给哪里,并且在发送之前把自己的地址从头上拿走。虽然DNS和定位服务在路由最初的INVITE请求,180(ringing)响应可以简单返回给发起者而不需要查找发起者在哪里,并且不需要在代理服务器保留状态,同时,每一个转发INVITE的代理也可以得到INVITE的每一个应答,这样的特性也非常有用。
当Alice的softphone收到180(Ringing)应答的时候,它提示Alice,可能是通过一个回铃音,或者屏幕上的一个消息提示。