sdp
在SIP协议的包含的内容是SDP时,应该把Content-Type设置成application/sdp。
b=<bwtype>:<bandwidth> bwtype可以是CT或AS,CT方式是设置整个会议的带宽,AS是设置单个会话的带宽。缺省带宽是千比特每秒。
TIAS = Transport Independent Application Specific maximum, a bandwidth modifier,详见http://www.networksorcery.com/enp/rfc/rfc3890.txt。
sip
100 trying是临时响应。 比如服务器给你一个回应,意思你的请求已经收到,在处理中。
200 OK 是针对SIP INVITE消息,作为final reponse,SDP的内容部分双方已经交换完毕。
180 ring 是振铃,代表invite消息已经送到到 被叫侧,通知主叫侧被叫已经振铃。
时序图:
sip->hold
实现由很多种,不知道哪个是标注?
说法1:c=IN IP4 0.0.0.0 就hold了。
说法2:sip属性设置
sendonly
sendrecv
recvonly
说法3:SIP的Hold是通过给对方发送特殊的Invite实现的,消息格式如下,注意SDP消息里三个特殊的地方:
c=IN IP4 0.0.0.0
s=Session Hold
a=sendonly
INVITE sip:900@10.2.4.107:5060 SIP/2.0
Via: SIP/2.0/UDP 10.2.4.105:5060;rport;branch=z9hG4bK1719108605
Route: <sip:10.2.4.200;ftag=887892942;lr=on>
From: 800 <sip:800@10.2.4.200>;tag=887892942
To: <sip:900@10.2.4.200>;tag=527292637
Call-ID: 1721169583@10.2.4.105
CSeq: 1174960511 INVITE
Contact: <sip:800@10.2.4.105:5060>
Max-Forwards: 70
User-Agent:
Content-Type: application/sdp
Content-Length: 181
v=0
o=800 1174960510 1174960511 IN IP4 10.2.4.105
s=Session Hold
c=IN IP4 0.0.0.0
t=0 0
m=audio 5000 RTP/AVP 18 100
a=rtpmap:100 telephone-event/8000
a=sendonly
a=ptime:20
对方回复的200 OK 也是在SDP消息里有所区别:
s=Session be-Hold
c=IN IP4 0.0.0.0
a=recvonly
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.2.4.105:5060;rport=5060;branch=z9hG4bK1719108605
Record-Route: <sip:10.2.4.200;ftag=887892942;lr=on>
From: 800 <sip:800@10.2.4.200>;tag=887892942
To: <sip:900@10.2.4.200>;tag=527292637
Call-ID: 1721169583@10.2.4.105
CSeq: 1174960511 INVITE
Contact: <sip:900@10.2.4.107:5060>
Supported: 100rel
Supported: tdialog
Supported: timer
Allow: INVITE, ACK, OPTIONS, BYE, CANCEL, INFO, REFER, NOTIFY, PRACK, MESSAGE, UPDATE
Content-Type: application/sdp
Accept: application/sdp
Content-Length: 184
v=0
o=800 1174960510 1174960511 IN IP4 10.2.4.105
s=Session be-Hold
c=IN
Cancel请求
Cancel请求是用来取消一个之前已经发送过得请求的,如果这个请求已经得到了应答,那么Cancel请求是失效的。所以Cancel请求一般都用是用来取消invite请求的,因为invite的请求得到最终应答的时间比较长。对于一个有状态的UAS来说,Cancel请求是点对点的,就是Cancel请求需要每个proxy服务器进行处理和应答。而无状态服务器只是转发这个cancel请求。
update
如果会话未建立,则UPDATE用于修改会话的状态。用户可以使用UPDATE更改编解码器。
如果会话建立,则使用重新邀请来更改/更新会话。
Re-invite和Update的区别
在SIP中,re-invite和update都是用来修改变session参数的。不同的是,update对dialog的状态没有影响,而re-invite会改变对话的状态。所以update可以在第一个invite被应答之前发送(即收到invite的200ok之前)。也就是说,update可以被用来控制早期媒体。而re-invite只能在第一个invite被应答之后发送(即在通话已经建立之后)。
一般来说,在通话建立以后用update和re-invite改变session参数都可以。但是此时多用re-invite。因为update要立即被响应。这样,如果session参数的修改需要用户参与的话,用update就不合适了。大多数时候,呼叫建立起来之后再修改session参数的话,都需要用户的参与,比如点一个同意对话框,所以用re-invite就更普遍一些。