Sip基础三

来源:互联网 发布:matlab 2014a for mac 编辑:程序博客网 时间:2024/05/18 01:11

SIP是基于一个类似HTTP协议的请求应答的通讯模式,每一个通讯都包含对某个功能的请求,并且起码需要一个应答。

通过简单的例子介绍sip协议

INVITE sip:bob@biloxi.com SIP/2.0 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds 
Max-Forwards: 70 
To: Bob <sip:bob@biloxi.com> 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710@pc33.atlanta.com 
CSeq: 314159 INVITE 
Contact: <sip:alice@pc33.atlanta.com> 
Content-Type: application/sdp 
Content-Length: 142 
(Alice’s SDP not shown) 

在文本消息的第一行,包含了请求的类型(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传输的网页一样。


Alice和Bob两个用户间的SIP消息交换例子:


Alice通过Bob的SIP标志"呼叫"Bob,这个SIP标志是统一分配的资源(URI)

由于software并不知道bob或者bob的sip服务器在哪里,所以software发送INVITE请求到Alice的sip服务器atlanta.com,这个atlanta.com服务器应该在software中已经配置了。atlanta是一台代理服务器,代理服务器接收SIP请求并根据请求转发。在这个例子中,代理服务器接收到INVITE请求,并且回送一个100(Trying)应答给Alice的softphone。100(Trying)应答表示INVITE请求已经收到,并且代理服务器正在转发INVITE请求。atlanta.com代理服务器收到INVITE请求之后,就去找biloxi.com可能通过DNS服务来找提供这个biloxi.com的SIP服务器。在转发请求之前,atlanta.com代理服务器会在via头上增加一个一段包含自己地址的值(INVITE已经包含了Alice的的地址VIA域)。最后,转发INVITE请求到biloxi.com或者能到达biloxi.com的代理服务器。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,可能是通过一个回铃音,或者屏幕上的一个消息提示。

Bob决定响应这个呼叫。当他拿起电话,他的SIP电话发送200(OK)回应给发送者,表示这个电话已经接起来了。这个200(OK)包含了一个消息体,这个消息体包含SDP媒体描述,这个媒体描述包含Bob希望和Alice建立何种媒体连接。同样,SDP消息也是两段交换:Alice发送一个给Bob,Bob发送一个回给Alice。这个两段的交换提供基本的兼容性协商,并且基于简单的SDP提出/应答交换模型。如果Bob不想响应这个呼叫或者正在响应别的呼叫,一个错误的响应会代替正常的200(OK)回送出去,这样,就不会有连接建立。
SIP完整的返回代码在21节有介绍。Bob发出的200(OK)(图F9消息)可能长得像这样的:

SIP/2.0 200 OK 
Via: SIP/2.0/UDP server10.biloxi.com ;branch=z9hG4bKnashds8;received=192.0.2.3 
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com ;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2 
Via: SIP/2.0/UDP pc33.atlanta.com ;branch=z9hG4bK776asdhds ;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710@pc33.atlanta.com 
CSeq: 314159 INVITE 
Contact: <sip:bob@192.0.2.4> 
Content-Type: application/sdp 
Content-Length: 131 
(Bob’s SDP not shown) 
应答的第一行包含了应答代码(200)和原因(ok)。剩下的行包含了包头域。VIA,TO,FROM,CALL-ID, Cseq包头域是从INVITE请求包中直接拷贝过来的。(有三个VIA域值-一个是Alice SIP电话增加的,一个是atlanta.com代理加的,一个是biloxi.com代理加的)。

200(OK)应答通过两个代理并且发送到Alice的softphone上,Alice的softphone收到这个应答,停止振铃,并且标志电话Bob已经接听。最后,Alice的电话发送一个确认消息,ACK,到Bob的SIP电话来确认接收到了这个最后的200(ok)应答。ACK信号是直接由Alice的softphone发送到Bob的SIP phone上,跨过了两个代理服务器。这是因为两个端点(Alice和Bob)通过INVITE/200(OK)的请求应答包中的Contact包头域都知道互相之间的地址了,这个地址是最开始发起INVITE请求的时候所不知道的。所以,不需要两个代理服务器再查找对方的地址了,所以代理服务器不参与接下来的通话流了。这就完成了一个完整的使用INVITE/200/ACK 三方握手来建立SIP会话的过程。


在通话结束的时候,Bob首先断开(挂机hangs up),并且发送一个BYE的消息。这个BYE的消息将直接送到Alice的softphone,同样是跳过代理的。Alice通过发送200(OK)应答来确认收到了这个BYE消息,这个消息终止了会话并且应答了BYE的请求。ACK在这里不需要发送-一个ACK信号只在响应一个INVITE的响应的时候被发送。我们稍晚一点会讨论这个INVITE的特别处理,但是基于SIP的可靠性的机制,一个通话的时间可以认为包含电话振铃和挂机的时间。基于这样的原因,SIP请求的处理通常根据是否INVITE请求进行分类,INVITE类和非INVITE类请求分开处理。


下面是描述建立会话的细节:

F1 INVITE Alice->atlanta.com proxy


INVITE sip:bob@biloxi.com SIP/2.0 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 
Max-Forwards: 70 
To: Bob <sip:bob@biloxi.com> 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Contact: <sip:alice@pc33.atlanta.com> 
Content-Type: application/sdp 
Content-Length: 142 

(Alice's SDP not shown)



F2 100 Trying atlanta.com proxy -> Alice


SIP/2.0 100 Trying 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 

To: Bob <sip:bob@biloxi.com> 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Content-Length: 0 


F3 INVITE atlanta.com proxy -> biloxi.com proxy 


INVITE sip:bob@biloxi.com SIP/2.0 
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
Max-Forwards: 69 
To: Bob <sip:bob@biloxi.com> 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Contact: <sip:alice@pc33.atlanta.com> 
Content-Type: application/sdp 
Content-Length: 142 

(Alice’s SDP not shown) 


F4 100 Trying biloxi.com proxy -> atlanta.com proxy


SIP/2.0 100 Trying 
Via: SIP/2.0/UDP 
bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 
;received=192.0.2.2 

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com> 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Content-Length: 0 


F5 INVITE biloxi.com proxy -> Bob 


INVITE sip:bob@192.0.2.4 SIP/2.0 
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1 
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 ;received=192.0.2.2 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
Max-Forwards: 68 
To: Bob <sip:bob@biloxi.com> 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Contact: <sip:alice@pc33.atlanta.com> 
Content-Type: application/sdp 
Content-Length: 142 
(Alice’s SDP not shown)


F6 180 Ringing Bob -> biloxi.com proxy


SIP/2.0 180 Ringing 
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1;received=192.0.2.3 
Via: SIP/2.0/UDP 
bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 ;received=192.0.2.2 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
Contact: <sip:bob@192.0.2.4> 
CSeq: 314159 INVITE 
Content-Length: 0 


F7 180 Ringing biloxi.com proxy -> atlanta.com proxy 


SIP/2.0 180 Ringing 
Via: SIP/2.0/UDP 
bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 ;received=192.0.2.2 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
Contact: <sip:bob@192.0.2.4> 250
CSeq: 314159 INVITE 
Content-Length: 0 


F8 180 Ringing atlanta.com proxy -> Alice 


SIP/2.0 180 Ringing 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
Contact: <sip:bob@192.0.2.4> 
CSeq: 314159 INVITE 
Content-Length: 0 


F9 200 OK Bob -> biloxi.com proxy 


SIP/2.0 200 OK 
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1 ;received=192.0.2.3 
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 ;received=192.0.2.2 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 251
Contact: <sip:bob@192.0.2.4> 
Content-Type: application/sdp 
Content-Length: 131 
(Bob’s SDP not shown) 


F10 200 OK biloxi.com proxy -> atlanta.com proxy 


SIP/2.0 200 OK 
Via: SIP/2.0/UDP 
bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1 ;received=192.0.2.2 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Contact: <sip:bob@192.0.2.4> 
Content-Type: application/sdp 
Content-Length: 131 
(Bob’s SDP not shown) 


F11 200 OK atlanta.com proxy -> Alice 


SIP/2.0 200 OK 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=192.0.2.1 252
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 INVITE 
Contact: <sip:bob@192.0.2.4> 
Content-Type: application/sdp 
Content-Length: 131 
(Bob’s SDP not shown) 


F12 ACK Alice -> Bob 


ACK sip:bob@192.0.2.4 SIP/2.0 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9 
Max-Forwards: 70 
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
From: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 314159 ACK 
Content-Length: 0 


在Alice和Bob之间的媒体会话现在建立了。Bob首先挂机。注意Bob的SIP

电话维持它自己的Cseq号码空间,在这里,是231开始的。由于Bob发起请
求,那么To和From URI和tags交换了。


F13 BYE Bob -> Alice 


BYE sip:alice@pc33.atlanta.com SIP/2.0 
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10 253
Max-Forwards: 70 
From: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
To: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 231 BYE 
Content-Length: 0 
F14 200 OK Alice -> Bob 
SIP/2.0 200 OK 
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10 
From: Bob <sip:bob@biloxi.com>;tag=a6c85cf 
To: Alice <sip:alice@atlanta.com>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 231 BYE 
Content-Length: 0


0 0
原创粉丝点击