SIP HOLD

http://blog.sina.com.cn/s/blog_5a8b44fa0100w7tv.html


在RFC5359中描述了SIP服务的常见的几个例子。对这些服务的概念,流程,消息进行了比较详细的介绍。近期时间比较空闲,重新温习一下,不少概念澄清了。在CU上的blog一直没有什么东西可以写,将这个RFC简单介绍一下。
第一个服务的例子就是callhold(呼叫保持)。流程如下图所示:
                       Alice                     Proxy                       Bob
                         |       INVITE F1     |                           |
                         |--------------->|                           |
                         |                               |     INVITE F2   |
                         |(100 Trying) F3 |------------->|
                         |<---------------|                           |
                         |                               |180 Ringing F4|
                         | 180 Ringing F5 |<-------------|
                         |<---------------|                           |
                         |                               |   200 OK F6     |
                         |       200 OK F7     |<-------------|
                         |<---------------|                           |
                         |         ACK F8         |                           |
                         |--------------->|       ACK F9       |
                         |                               |------------->|
                         |       Both way RTP Established     |
                         |<=============================>|
                         |                               |INVITE(hold) F10
                         |INVITE(hold) F11|<-------------|
                         |<---------------|                           |
                         |       200 OK F12   |                           |
                         |--------------->|     200 OK F13 |
                         |                               |------------->|
                         |                               |         ACK F14   |
                         |         ACK F15       |<-------------|
                         |<---------------|                           |
                         |                     No RTP Sent!               |
                         |                               |   INVITE F16   |
                         |     INVITE F17     |<-------------|
                         |<---------------|                           |
                         |     200 OK F18     |                           |
                         |--------------->|   200 OK F19   |
                         |                               |------------->|
                         |                               |       ACK F20     |
                         |         ACK F21       |<-------------|
                         |<---------------|                           |
                         |       Both way RTP Established     |
                         |<=============================>|
                         |         BYE F22       |                           |
                         |--------------->|     BYE F23       |
                         |                               |------------->|
                         |                               |     200 OK F24 |
                         |       200 OK F25   |<-------------|
                         |<---------------|                           |

                                   图1 Call Hold示例
在上面的这个场景中,Alice呼叫Bob,呼叫建立后,Bob将这个呼叫保持,过段时间后,又取消了呼叫保持,恢复了正常通话。然后Alice结束了通话。
在上面的这个过程中,可以看到hold的动作是由Bob向proxy发送了一个比较特殊的Invite。这个invite之所以特殊,就是特殊在invite消息中的sdp部分。不同的UA发送的这个sdp参数不一样。比较早期的UA实现是将sdp的c地址改为0.0.0.0。现在比较流行的做法是如果会话中有媒体流的话,将sdp的a改为a=inactive;如果是没有媒体流的话,将a属性改为a=sendonly。
下面是对F10的介绍:
F10 INVITE Bob -> Proxy 1

           INVITE sips:alice@client.atlanta.example.com SIP/2.0
           Via: SIP/2.0/TLS client.biloxi.example.com:5061
             ;branch=z9hG4bKnashds7
           Route: <sips:ss1.example.com;lr>
           Max-Forwards: 70
           From: Bob <sips:bob@biloxi.example.com>;tag=314159
           To: Alice <sips:alice@atlanta.example.com>;tag=1234567
           Call-ID: 12345601@atlanta.example.com
           CSeq: 1 INVITE
           Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
           Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
           Supported: replaces
           Content-Type: application/sdp
           Content-Length: ...

           v=0
           o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
           s=
           c=IN IP4 client.biloxi.example.com
           t=0 0
           m=audio 3456 RTP/AVP 0
           a=rtpmap:0 PCMU/8000
            a=sendonly
这里是将a改为 sendonly
在后续的200OK中,Alice的UA发送的200OK中,sdp部分会将a改为a=recvonly.此后Alice和Bob之间就没有了媒体流的交互了。
恢复正常通话:
Bob需要再发送一个特殊的invite来取消callhold。在这个invite中sdp部分,会将a属性重新修改为sendrecv,下面例子中是将a改为了rtpmap:0 PCMU/8000。
F16 INVITE Bob -> Proxy 1

           INVITE sips:alice@client.atlanta.example.com SIP/2.0
           Via: SIP/2.0/TLS client.biloxi.example.com:5061
             ;branch=z9hG4bKnashds73
           Route: <sips:ss1.example.com;lr>
           Max-Forwards: 70
           From: Bob <sips:bob@biloxi.example.com>;tag=314159
           To: Alice <sips:alice@atlanta.example.com>;tag=1234567
           Call-ID: 12345601@atlanta.example.com
           CSeq: 2 INVITE
           Contact: <sips:bob@client.biloxi.example.com>
           Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
           Supported: replaces
           Content-Type: application/sdp
           Content-Length: ...

           v=0
           o=bob 2890844527 2890844529 IN IP4 client.biloxi.example.com
           s=
           c=IN IP4 client.biloxi.example.com
t=0 0 m=audio 3456 RTP/AVP 0 a=rtpmap:0 PCMU/8000
在Alice随后的200OK中,a属性也是rtpmap:0 PCMU/8000了。这样Alice和Bob就进行了双向的RTP交互了。恢复了正常的通话。
还有另外一种callhold,称之为Consultation Hold,我翻译成咨询保留。相比较上面的callhold多了一个Bob和第三人Carol的通话。下面是示例场景描述:
Alice Proxy Bob Carol | | | | | INVITE F1 | | | |--------------->| INVITE F2 | | | |------------->| | |(100 Trying) F3 | | | |<---------------|180 Ringing F4| | | |<-------------| | | 180 Ringing F5 | | | |<---------------| 200 OK F6 | | | |<-------------| | | 200 OK F7 | | | |<---------------| | | | ACK F8 | | | |--------------->| ACK F9 | | | |------------->| | | Both way RTP Established | | |<=============================>| | | |INVITE(hold) F10 | |INVITE(hold) F11|<-------------| | |<---------------| | | | 200 OK F12 | | | |--------------->| 200 OK F13 | | | |------------->| | | | ACK F14 | | | |<-------------| | | ACK F15 | | | |<---------------| | | | No RTP Sent! | | | | INVITE F16 | | | |<-------------| | | | | INVITE F17 | | |--------------------------------->| | |(100 Trying) F18 | | |------------->| | | | | 180 Ringing F19 | | |<---------------------------------| | | 180 Ringing F20 | | |------------->| | | | | 200 OK F21 | | |<---------------------------------| | | 200 OK F22 | | | |------------->| | | | ACK F23 | | | |<-------------| | | | | ACK F24 |
| |--------------------------------->| | | Both way RTP Established | | | |<=================>| | | BYE F25 | | | |<-------------| | | | | BYE F26 | | |--------------------------------->| | | | 200 OK F27 | | |<---------------------------------| | | 200 OK F28 | | | |------------->| | | | INVITE F29 | | | INVITE F30 |<-------------| | |<---------------| | | | 200 OK F31 | | | |--------------->| 200 OK F32 | | | |------------->| | | | ACK F33 | | | |<-------------| | | ACK F34 | | | |<---------------| | | | Both way RTP Established | | |<=============================>| | | BYE F35 | | | |--------------->| BYE F36 | | | |------------->| | | | 200 OK F37 | | | |<-------------| | | 200 OK F38 | | | |<---------------| | | | | | |
图2 Consultation Hold示例
在上面的场景中Alice和Bob建立呼叫,Alice问Bob一些问题,Bob这个时候回答有些难度,搞不定,需要咨询一下Carol。于是先将Alice这一路通话hold住,然后呼叫Carol。与Carol通话结束后,再将Aliceunhold回来,与Alice正常通话,解决问题(^_^)。
下一个服务是Music on Hold.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值