SIP 请求方法(1)-INVITE

£可爱£侵袭症+ 提交于 2020-11-29 12:30:17

        SIP请求的类型,也称作SIP方法。RFC3261 中定义了六种方法。另外八种方法有独立的RFC扩展描述。

        SIP请求或方法在协议中被视为“动词”,因为它们请求另一个UA或服务器执行一项特定的动作。INVITE、 REGISTER、BYE、ACK、 CANCEL 和 OPTIONS是SIP最初定义的六种方法。REFER、SUBSCRIBE、NOTIFY、PUBLISH、MESSAGE、UPDATE、 INFO 和 PRACK这些方法是在扩展的RFC中定义的。

        UA收到不支持的请求方法时,回应501 Not Implemented response消息。方法名是大小写敏感的,为了区分头域字段,方法名通常全部使用大写字母,而头域字段内容允许大小写混合。注意:代理服务器转发请求不需要理解请求的方法。代理服务器把未知的方法视为OPTIONS处理,换句话说,它应该尽可能地把请求转发给宿端。这样,UA引入新特性或方法就不需要中间代理的额外支持。UA应当在请求和应答消息中携带Allow头域以说明它所支持的方法。

INVITE

        INVITE方法用于UA之间建立媒体会话。在电信领域中,它类似于ISDN的Setup消息或ISUP里的初始地址消息 (IAM)。 对于INVITE请求的最终应答,都需要用ACK方法确认。

        INVITE消息通常带有消息体,消息体包含主叫方的媒体信息。消息体还可以包含其它会话信息,比如说资源列表。如果INVITE消息中没有携带媒体信息,那么就要在UAC发出的ACK中携带。如果ACK中的媒体信息是不能接受的,那么主叫方必须发一条BYE消息以终止会话。这时不能用CANCEL方法,因为会话已经建立了。媒体会话建立的时间点是UAC与UAS间INVITE, 200 OK, 和 ACK消息交互完成那一刻。成功的INVITE请求在两个UA间建立一个dialog,它一直持续到其中一方发出BYE的时候,这时会话终止。

        UAC生成INVITE消息建立dialog时,创建一个全局唯一的Call-ID,这个ID在呼叫持续期间一直使用。同时初始化CSeq计数(它不一定为1,但必须是整数),此后每发一个新的请求,CSeq值递增,但Call-ID不变。To 和 From 头域以远端和本端地址填充。INVITE请求中携带From tag,UAS生成To tag并在应答消息中携带。ACK以及dialog内的后续请求沿用200 OK中的To tag。To tag、From tag,和Call-ID的组合构成dialog的唯一标识符。

        在dialog中发的INVITE请求,引用初始INVITE请求的Call-ID、To tag 和From tag。这类消息称为re-INVITE,用于变更会话的特征或刷新dialog的状态。CSeq命令序列号递增,这样UAS就能区分re-INVITE和初始INVITE的重发。

        如果re-INVITE被拒绝或者处理失败,那么会话继续,就像re-INVITE没有发生一样。如果初始INVITE还没收到最终应答,那么UAC不允许发re-INVITE,如果这时需要变更会话参数,可以用UPDATE请求。还有一种场景,两个UA同时向对方发re-INVITE。这个以通过Retry-After头域来处理。这种情况在电话中称为glare,当中继两端同时占据中继线时发生。

        INVITE消息中的Expires头域告诉UAS请求的有效时间。UAS可以在Expires头域指定的时间范围内一直显示来提醒。一旦会话建立,Expires头域立刻失去意义,它不表示媒体会话的持续时间。如果要限制媒体会话的持续时间,可以通过Session-Expires头域表达,如果携带这个头域,之后还可以通过re-INVITE 或 UPDATE 刷新。

以下是一个携带SDP消息体的INVITE请求实例:

INVITE sip:411@salzburg.example.org;user=phone SIP/2.0
Via: SIP/2.0/UDP salzburg.example.org:5060;branch=z9hG4bK1d32hr4
Max-Forwards:70
To: <sip:411@salzburg.at;user=phone>
From: Christian Doppler <sip:c.doppler@salzburg.example.org> ;tag=817234
Call-ID: 12-45-A5-46-F5-43-32-F3-C2
CSeq: 1 INVITE
Subject: Train Timetables
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, REFER, SUBSCRIBE, NOTIFY
Contact: sip:c.doppler@salzburg.example.org
Content-Type: application/sdp
Content-Length: ...

v=0
o=doppler 2890842326 2890844532 IN IP4 salzburg.example.org
s=
c=IN IP4 50.61.72.83
t=0 0 
m=audio 49172 RTP/AVP 97 98 0
a=rtpmap:97 iLBC/8000
a=rtpmap:98 SPEEX/8000
a=rtpmap:0 PCMU/8000

        除了头域required之外,这个请求还携带了几个可选头域:Subject、Allow。注意Request-URI中包含的是电话号码。

        下表中列出了INVITE请求所必须的头域字段。

 

 

INVITE 中所必须的头域字段

Via

To

From

Call-ID

CSeq

Contact

Max-Forwards
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!