功能介绍

SIP并没有为所建立的会话定义存活机制。

虽然用户代理能够通过会话特定的机制推断会话是否超时,可是代理server却做不到这点。

如此一来。代理server有时会无法推断会话是否还是活动的。

比如,当一个用户代理在会话结束时发送BYE消息失败,或者因为网络问题BYE消息丢失,代理server将不会知道会话已经结束。在这样的情况下,代理server将保持呼叫的状态而且无法知道呼叫状态信息何时失效。

为了解决问题,RFC4028为SIP会话定义了一种存活机制。用户代理或代理server周期性发送re-INVITE或UPDATE请求用来保持会话的活动。会话更新请求的间隔通过其定义的协商机制决定。

假设在间隔内没有收到会话更新请求,该会话被觉得已经终止。

工作原理

UAC通过INVITE消息发起,这个消息包含一个带有可选标签“timer”的Supported头字段,用来表明支持Session
Timer功能。该请求通过代理server传递,所经过的任代理server都能够根据他们的兴趣建立会话定时器。每一个代理server都能够在请求中插入一个Session-Expires头字段和一个Min-SE头字段(前提是请求中还没有这些字段),或者改动上述已存在头字段的值。

Min-SE头字段为会话更新间隔建立最小刷新时间。

这个头字段的目的是防止怀有恶意的代理server设置随意短的更新间隔以致它的邻居代理负荷超载。

处理请求的每一个代理server能够提高这个下限(实际上就是提高刷新的周期),可是不能减少下限。

Session-Expires头字段为会话更新间隔建立最长刷新时间。不论什么服务于该请求的代理能够减少这个值。但必须大于Min-SE头字段指定的值。

假设Session-Expires的间隔太小(小于代理server要维护的Min-SE头字段的值)。那么代理server将拒绝这个请求并返回一个422响应。该响应包括一个Min-SE头字段表明它所支持的最小会话间隔。UAC再次尝试发送请求。这次请求中包括了Min-SE头字段,头字段等于先前接收到的全部422响应中最大的Min-SE头字段。

这样一来。最小定时器就能满足所经过的全部代理server的约束条件。

在几次INVITE/422消息的重复传送后,请求终于到达UAS。UAS能够调整会话间隔的值就好像它自己也是一个代理server。

之后。它将这个终于的会话间隔增加2xx响应的Session-Expires头字段。

Session-Expires头字段还包括一个“refresher”參数用来表示更新的运行者(是当前的UAC还是UAS)。当2xx响应沿代理server返回时,不论什么代理server能够观察这个终于的会话间隔但不能改动它。

通过响应中的Session-Expires头字段,UAC和UAS都知道会话定时器是活动的。它何时终止以及谁在更新会话。在终止前的某个时刻,当前活动的更新者生成一个会话更新请求,能够是一个re-INVITE或者UPDATE请求。

假设更新者始终得不到这个会话更新请求的响应,它就会发送一个BYE消息结束会话。相同。假设还有一端在会话终止前始终收不到会话更新请求。它也会发送一个BYE消息结束会话。

相关參数

Session-Expires头字段用于传达SIP会话的会话间隔。该字段仅仅包括在INVITE或UPDATE请求。也包括在INVITE或UPDATE消息的不论什么一个2xx响应中。

当在已经协商确定Session-Expires值,那么该会话将在Session-Expires/2的时间进行会话更新,该更新方式能够是re-INVITE或者UPDATE的请求。

Min-SE头字段表示会话间隔的最小值。以秒为单位。

当它被用在INVITE或UPDATE请求中时。用来表示该会话所要使用的会话间隔的最小值。

422回应代码出如今会话协商过程中,当Session-Expires的间隔太小(小于UAS所支持的Min-SE头字段的值)时。UAS将回应要求UAC又一次协商

最新文章

  1. 词法分析程序 LEX和VC6整合使用的一个简单例子
  2. spring的事务操作
  3. mongo自带测试
  4. 根据Entity Framework6.X 数据生成代码(仅获取表名)
  5. javascript DOM对象转jquery对象
  6. html 选择器之基础选择器
  7. Vue.js实现下拉无限刷新分页
  8. WPF Path总结(一)
  9. 第二十二篇-Guideline基准线
  10. JVM的基本结构及其各部分详解(二)
  11. 关注 硬件 发展, 转载一篇介绍 VHDL 的文章
  12. IDEA配置maven,jdk,编码
  13. VSTS 免费代码git/tfs托管体验-使用代码云托管
  14. 记录下log4j的两种配置方式
  15. 2、Android-UI(自定义控件&ListView)
  16. 0407-服务注册与发现-Eureka深入理解-元数据、高可用HA
  17. 【c++习题】【17/4/13】stack
  18. python发送邮件(带附件)
  19. Hello,移动WEB—px,dp,dpr像素基础
  20. C#是类型安全语言

热门文章

  1. zzulioj--1824--BOOM(模拟水)
  2. 84.Node.js -Mongoose 方法
  3. 13.MongoDB 连接命令格式
  4. POJ 3667 线段树+标记
  5. Python 从入门到精通 全程最佳实现梳理
  6. WebView的坑[持续更新]
  7. 鼠标滑过,解决ul下 li下a的背景与父级Li不同宽的问题
  8. List<List<model>>如何更快捷的取里面的model?
  9. Java Web学习总结(20)——基于ZooKeeper的分布式session实现
  10. hibernate session.save()和session.persist()的区别