SIP协议介绍
1、sip简介
-
SIP默认使用UDP 5060端口,但也可以使用TCP 5060
-
SIP使用Server-Client模型
-
SIP的四项基本功能:定位用户,将SIP地址解析为IP地址;协商Session的feature(特征)和capability;在进行呼叫时改变会话参数;负责会话的建立和中断
-
SIP地址形式:sip:1112223344@mycompany.comsip:1112223344@10.1.1.1
-
presence概念。用户可为自己设置offline、busy等状态
2、sip组件
- User Agent : UA是SIP的基本组件,可分为UAC(User Agent Client)和UAS(User Agent Server)。发起呼叫的为UAC,接收呼叫的为UAS。很多设备都可做UA,如IP电话,pc,路由器等。
- Proxy Server :proxy server起到call routing(呼叫线路)、authentication(身份验证)、authorization(授权)、address resolution(解决寻址)、loop detection(循环检查)的功能。
UAC(用户代理客户端)发起呼叫时会先把call setup message发给proxy server(代理服务器),如果proxy server知道UAS(用户代理服务器)的位置,会把call setup message转发给UAS(是next hop),否则会找其他的server查询。UAS接收到call setup后会给proxy server响应,proxy server再把这个响应返回给UAC。当呼叫建立之后,proxy server有2种选择。第一、呼叫建立之后还处于UAC和UAS之间的signaling path之间(Record-Route),以监视call change message或call termination message。第二、退出UAC和UAS之间的signaling path不再参与会话。
- Redirect Server(重定向服务器)
UA、Proxy Server可与Redirect Server通讯,以查找另一个endpoint的位置。这在一个移动网络内尤其有用,Redirect Server可以通知其clients,某一用户是否临时或永久的移动到另一位置。甚至可以通知某一用户移动到了多个位置(例如一个用户同时拥有多部IP电话)如此一来当其他UAC呼叫这样的UAS时,proxy server会先拦住这样的会话,之后让UAS的多部电话同时振铃或依次振铃,这就是“find me”或“follow me”功能。在ccm 4.2中,这个功能是由unity实现的。cisco的router可以做redirect server。
- Registrar Server(注册服务器)
UA可以向Registrar Server注册自己的位置信息,Registrar Server将位置信息保存在数据库中(也可保存在其他server的数据库中)以回复其他server发来的location request。cisco的路由器和ccm 5.x可做registrar server.
- Location Server(本地服务器)
负责维护Location Database。
- Back-to-back user agent (B2BUA)背靠背用户代理
B2BUA同时扮演UAC和UAS的角色。calling UA发起呼叫至B2BUA,此时B2BUA扮演UAS角色,之后B2BUA在以UAC的角色呼叫called UA。这样做的好处是,B2BUA有更细的控制粒度,甚至是改变呼叫请求的内容。ccm5.x可作为B2BUA。
- Presence Server(状态服务器)
负责维护presence信息,并发送status notification
3、SIP Messages(methods)
1> REGISTER
UA client使用此message向server注册以标明自己的
2> INVITE
UAC发送此信息用以邀请UAS加入会话(包括一对一通话或conference),其实就是一个call setup message
3> ACK
为INVITE回复一个确认信息。
4> CANCEL
用来中止一个还没建立(在建立过程当中)的呼叫
5> OPTIONS
用来查询server的capability
6> BYE
用来中断呼叫
7> INFO*
当message body中包含数据时,使用INFO message。
8> PRACK*
用于回复一个临时性的请求。
9> REFER*
使用这个REFER指向另一个电话,从而完成call transfer.
10> SUBSCRIBE*
告诉server一旦发生特定事件时,愿意接收一个通知
11> NOTIFY*
用来通知subscriber发生了特定的事件,也可用于传送DTMF
12> UPDATE*
在接到初始INVITE的回复时,UAC用UPDATE修改一个呼叫的参数,例如QoS。
*INFO、PRACK、REFER、SUBSCRIBE、NOTIFY、UPDATE这6种message,cisco gatew只被动接收,而不会自动产生
4、 SIP Response
Class of Response Status Code Explanation
100 Trying
180 Ringing
Informational/provisional 181 Call Is Being Forwarded
182 Queued
183 Session Progress
Success 200 OK
300 Multiple Choices
301 Moved Permanently
Redirection 302 Moved Temporarily
305 Use Proxy
380 Alternative Service
Client-error 400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
410 Gone
413 Request Entity Too Large
414 Request URL Too Large
415 Unsupported Media Type
416 Unsupported URI Scheme
420 Bad Extension
421 Extension Required
423 Interval Too Brief
480 Temporarily Not Available
481 Call Leg or Transaction Does Not Exist
482 Loop Detected
483 Too Many Hops
484 Address Incomplete
485 Ambiguous
486 Busy Here
487 Request Terminated
488 Not Acceptable Here
491 Request Pending
493 Undecipherable
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
Server-error 503 Service Unavailable
504 Server Timeout
505 SIP Version Not Supported
513 Message Too Large
600 Busy Everywhere
603 Decline
Global failure 604 Does Not Exist Anywhere
606 Not Acceptable
5、SIP Message Example
SIP-GW#debug ccsip messages
Sent:
INVITE sip:3401@10.6.2.10:5060 SIP/2.0 //这里是UAS的地址
Via: SIP/2.0/UDP 10.6.3.1:5060;branch=z9hG4bKA1798 //每一跳都会在Via中写上自己的地址
From: <sip:4105553501@10.6.3.1>;tag=105741C-1D5E //这里UAC的地址
To: <sip:3401@10.6.2.10>
Date: Fri, 06 Jan 2006 05:35:01 GMT
Call-ID: E937365B-2C0C11D6-802FA93D-4772A3BB@10.6.3.1 //这个呼叫的唯一标识
Supported: 100rel, timer //支持的extension
Min-SE: 1800 //minimum session interva
Cisco-Guid: 3892269682-738988502-2150410557-1198695355 //唯一标识发起INVITE的UAC
User-Agent: Cisco-SIPGateway/IOS-12.x
Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, COMET, REFER, SUBSCRIBE, NOTIFY, INFO,
UPDATE, REGISTER //支持的methods
CSeq: 101 INVITE //call sequence number
Max-Forwards: 70 //最多有多少个proxy或gateway可以forward这个呼叫
Remote-Party-ID: <sip:4105553501@10.6.3.1>;party=calling;screen=no;privacy=off
Timestamp: 1014960901
Contact: <sip:4105553501@10.6.3.1:5060>
Expires: 180
Allow-Events: telephone-event
Content-Type: application/sdp //包含SDP message
Content-Length: 202
6、SDP(会话描述协议)
SIP使用SDP(Session Description Protocol)来协商capability和call feature。
v=0 //v=版本号
o=CiscoSystemsSIP-GW-UserAgent 7181 811 IN IP4 10.6.3.1 //o=originator的组织
s=SIP Call //s=SDP的描述信息
c=IN IP4 10.6.3.1 //c=originator的IP地址
t=0 0 //t=time value
m=audio 18990 RT //m=originator希望使用的media
SIP-CME#P/AVP 0 19
c=IN IP4 10.6.3.1
a=rtpmap:0 PCMU/8000 //a=media的属性
a=rtpmap:19 CN/8000
a=ptime:20
7、Call Flow(译:调用流)
1> Call Flow Between Two SIP Gateways
在这个场景里,GW-A扮演UAC的角色,GW-B扮演UAS的角色
1) 左边的模拟电话摘机,拨叫右边的模拟电话,左边的PBX给GW-A发出call setup message。GW-A向GW-B发起INVITE,其中会包含用于协商capability的SDP,同时GW-A还会向左边的PBX发出call proceeding,告诉它会话正在建立当中。
2) GW-B将收到的INVITE转换为call setup message发送给右边的PBX.同时向GW-A发送SIP Response 100 Trying。右边PBX与右边的模拟话建立连接后,使用call proceeding通知GW-B,GW-B向GW-A发送SIP Response 180 Ringing(告诉GW-A给左边的模拟电话发送拨通音)
3) GW-A会将SIP Response翻译为PBX能够看懂的指令并发送给左边PBX
4) 右边的模拟电话摘机后,PBX发送connect通知GW-B,之后GW-B会给GW-A发送SIP Response 200 OK。GW-A会再将SIP Respose 200 OK翻译为connect发送给左边的PBX。
5) 最终一条ACK由左边的PBX产生,延GW-A,GW-B发送给右边的PBX。此时通话建立,随后的就是RTP语音流了.
6) 左边的模拟电话挂机,左边的PBX产生disconnect,GW-A将其转换为Bye发送给GW-B,同时会给左边的PBX发送一条release信息。
7) 右边的PBX收到GW-B发送的disconnect后,会回复一条release信息,GW-B再向GW-A发送SIP Response 200 OK。至此,通话中断。
2> Call Flow Using a Proxy Server(Record-Route is disabled)
UA都可以在Proxy Server和Registrar Server上注册
1) UAC向Proxy Server发送INVITE,其中会包含SDP信息,URI地址为右边模拟电话的号码。
2) Proxy Server收到INVITE后将URI地址改写为GW-B的地址,然后发送给GW-B。
3) GW-B收到INVITE后给PBX发送call setup message,并给UAC回复SIP Response 100 Trying(这个Response由GW-B产生,发送个Proxy Server,再由它转发给UAC,而不是由Proxy Server自己产生Response)
4) GW-B与PBX建立连接后,PBX通知GW-B,GW-B给UAC发送SIP Response 180 Ringing(这个Response由GW-B产生,发送个Proxy Server,再由它转发给UAC,而不是由Proxy Server自己产生Response)。
5) UAC摘机后,PBX向GW-B发送connect,GW-B将其转换为SIP Response 200 OK发送给UAC(先发送给Proxy Server,再由Proxy Server转发给UAC)。Proxy没工作在Record-Route下,因此从此刻开始,Proxy Server推出SIP Signaling Path,之后的SIP message直接在UAC和GW-B之间交换.
6) UAC直接给GW-B回复ACK。通话正式建立,之后开始发送RTP语音流。
7) UAC挂机后直接给GW-B发送BYE,GW-B回复SIP Response 200 OK。通话中断。
3、Call Flow Using Multiple Servers
多数情况下,当UAS不在local domain内才会使用到如Redirect Server、Registrar Server等。Redirect Server会返回UAS或者next-hop server的详细信息。
1) GW-B向Registrar Server注册模拟电话的E.164号码。
2) Registar Server向GW-B回复SIP Response 200 OK。
3) UAC发送INVITE至Proxy-A。
4) Proxy-A发现called number不在local domain内,即将INVITE转发至Redirect Server。
5) Redirect Server回复Response 300告诉Proxy-A,如果拨叫右边模拟电话,next-hop server是Proxy-B。
6) Proxy-A向Proxy-B发送INVITE。
7) Proxy-B收到INVITE后向自己的Registar Server查询E.164号码。
8) Registar Server返回next-hop server是GW-B
9) Proxy-B向GW-B发送INVITE。