SIP Server的基本原理
SIP协议采用Client/Server模型。每一个请求(Request)触发服务器的一个操作;每个操作被称为方法(Method);每个请求除了指明具体方法外,还携带了一系列的头域(Header field),这些头域携带了各种业务信息;除了头域外,消息中还可以携带任意类型的消息体(Body),呼叫中最常使用的SDP信息就是通过消息体在Client和Server之间传递的。Server从接收到请求到处理完毕,要回复多个临时响应(Response),即PRACK (PRovisional ACK, status-code 为1xx, 例如100Trying,180 Ringing),和一个终结响应(status-code 为2xx,例如200 OK, 202 Accepted ),终结响应有且只有一个。
请求和他的所有响应构成一个事务(Transaction),一个完整的呼叫过程包含多个事务,比如呼叫建立和呼叫释放就是两个相互独立的事务。
用户代理(User Agent)是发起或者接收呼叫的逻辑实体。用户代理客户端-UAC(User Agent Client),用于发起请求;用户代理服务器-UAS(User Agent Server),用于接收请求。UAC/UAS的划分是针对一个事务的。在一个呼叫中的多个事务里,UAC和UAS的角色是可以互换的。例如在A和B的呼叫中,A向B发起呼叫,在呼叫建立的事务中,A是UAC,B是UAS;呼叫结束时,B先挂机,在呼叫释放的事务中,B是UAC,A是UAS。换句话说,每个一般的UA都是UAS和UAC的结合体。UA的实际物理形态有:IP Phone,SoftPhone,GateWay......
Proxy Server作为一个网络逻辑实体代理客户端转发请求或者响应;同Proxy Server类似的还有一种设备是B2BUA,顾名思义,就是背背的两个UA组成的一个逻辑实体,它作为UAS终结一个事务,同时作为UAC发起另外一个事务。Proxy Server同B2BUA相比,Proxy Server是一个事务传递过程中的中间节点,而B2BUA将一个事务转变成另一个事务。
在SIP组网中还包括Location Server、Registrar、Redirect Server,分别负责维护地址映射表,注册管理,呼叫重定向。他们和Proxy Server 可以在同一台设备上也可以运行于不同的设备上。SIP Server是Proxy Server、Location Server、Registrar、Redirect Server的总称。
SIP Server采用B2BUA模型。接受请求端为UAS端,代理转发或主动发起请求端为UAC端,整个SIPServr为UAC/UAS的组合体。通过UAC/UAS之间消息交互完成会话的建立、改变、结束的阶段。SIP Server协助网关交换媒体信息,但不参与会话建立后媒体流传输。
消息头 Message Header
请求 Request格式 :
Request-Line: Method SP Request-URI SP SIP-VERSION CRLF
例如 INVITE sip:[email protected] SIP/2.0
常见的Request-Method 参考Allow头域,比如:
Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE
响应 Response格式:
Status-Line: SIP-VERSION SP STATUS-CODE SPReasong-Phrase CRLF
例如 SIP/2.0 100 Trying
常见Status-Code 见博客
头域格式(header-field):
field-name: field-value
在消息头中,允许在冒号的左右有任意个数的空白;但是,在实现中,建议避免域名和冒号中间有空格,并且建议在冒号和值之间使用单个空格(SP);
头域中的不同域名的相关顺序并没有什么意义。虽然如此,我们还是强烈建议与路由相关的域(VIA,ROUTE,Record-Route,Proxy-Require,Max-Forwards,Proxy-Authorization等等)放在消息头的最前边,这样可以提高处理的速度。
相同域名的头域之间的顺序非常重要, 例如Route, Via, Record-Route。只有当单个头域的域值是可以用逗号分割的列表的时候,才可以表达成为同一个域名的多个头域。
Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE
Route: <sip:[email protected]:5070;lr;r2=on>
Route: <sip:[email protected]:5070;lr;r2=on>
Via: SIP/2.0/UDP 172.16.15.131:5070;rport;branch=z9hG4bK1a1.cc13dabde8fa5090d5c35a292e17c740.0
Via: SIP/2.0/UDP 192.168.1.131:8090;branch=z9hG4bK-4edef-1341712f-16b7c44f
Record-Route: <sip:[email protected]:5070;lr;r2=on>
Record-Route: <sip:[email protected]:5070;lr;r2=on>
消息体 Message Body
消息体长度
Content-Length头域中存放了包体的字节长度,例如:
Content-Length: 380
消息体内容
为SDP(session description protocol)包,
type=value[CRLF]
其中缩写:
v <-- sdp Version
o <-- Owner/creator
s <-- Session name
c <-- Connection information
t <-- Time description
m <-- Media description
a <-- media Attribute
例如:
v=0
o=103 1230784262 1230784262 IN IP4 172.16.15.52
s=_
c=IN IP4 172.16.15.52
t=0 0
m=audio 10002 RTP/AVP 0 8 97 98 99 100 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 G726-40/8000
a=rtpmap:98 G726-32/8000
a=rtpmap:99 G726-24/8000
a=rtpmap:100 G726-16/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15,16
a=silenceSupp:off
a=ptime:30
a=sendrecv