SIP 请求方法(1)-INVITE

        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
### PJSIP Re-Invite 实现方式 Re-invite 请求用于在 SIP 对话已建立的情况下更改会话参数。当发送 re-invite 时,这会影响对话状态并可能引起新的协商过程。 #### 发送 Re-invite 的条件 只有在最初的 INVITE 被成功响应(即收到 200 OK 并确认)之后才能发起 re-invite[^1]。这意味着通话已经建立,双方都处于稳定连接状态下。 #### 使用 PJSIP 库实现 Re-invite 为了利用 PJSIP 库执行 re-invite 操作,通常涉及以下几个方面: 1. **准备新 SDP 提供** 创建一个新的 SDP 提供,其中包含了希望更新后的媒体属性配置。 2. **构建和发送 Re-invite 消息** 构建带有最新 SDP 的 re-invite 请求并通过网络层传输至远端实体。 3. **处理回应** 接收来自对方的最终响应 (通常是 200 OK),随后再次发送 ACK 来完成整个流程。 以下是基于 C++ 和 PJSIP SDK 编写的简单示例代码片段展示如何发出 re-invite: ```cpp // 假设 'call' 是当前活动呼叫对象实例 pj_status_t status; // 准备SDP提供... pjsua_call_media_info media_info; memset(&media_info, 0, sizeof(media_info)); /* 设置所需的媒体设置 */ ... status = pjsua_call_set_hold(call->id, &media_info); if (status != PJ_SUCCESS) { // 错误处理逻辑... } // 或者更通用的方式直接调用重新邀请方法 status = pjsua_call_reinvite_with_sdp(call->id, NULL /* 新SDP */ ); if (status != PJ_SUCCESS) { // 失败处理... } ``` 此段代码展示了两种不同的途径来触发 re-invite 行为:一种是通过 `set_hold` 方法间接操作;另一种则是显式地使用 `reinvite_with_sdp` API 进行自定义 SDP 修改后再重邀约。 ### 关于 Re-invite 的常见问题 1. 如果远程设备不支持某些提议的功能怎么办? 当尝试引入不兼容的新特性时,可能会遇到拒绝或部分接受的情况。此时应当设计合理的回退机制以维持基本通信功能正常运作。 2. 如何判断何时应该采用 update 而不是 re-invite? Update 更适合那些不需要改变现有对话关系特性的场景,比如调整音量大小等不影响整体架构的小改动。而对于涉及到资源分配变更的重大事项,则更适合选用 re-invite 方案。 3. 是否有可能因频繁发送 re-invites 导致性能下降甚至崩溃? 频繁的操作确实可能导致系统负载增加以及潜在的安全风险。建议合理规划每次请求的时间间隔,并遵循 RFC 中推荐的最佳实践指南来进行优化。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值