SIP在建立会话时没有定义会话的存活时间,需要代理服务器通过会话超时机制判断会话是否活动。如果代理服务器不具备这种功能,当用户由于网络或别的原因,bey消息在会话结束的时候未能发出、或者发出的bey消息未抵达代理服务器的时,代理服务器将不知道会话已经结束。
为了解决这种情况 RFC4028 引入了一种存活机制,用户代理周期性的发送re_INVITE或者UPDATA请求保持会话。会话请求的更新间隔由会话协商机制确定。如果在间隔会没有收到更新请求,会话被认为已经终止。用户代理发送BEY消息,代理服务器移除该呼叫。
工作原理:
UAC在发送INVITE的时候在support 中添加timer;表示支持会话更新功能。该请求通过代理服务器最终到达被叫段。在传递的过程中每个代理都可以插入一个session-expires头字段和Min_SE字段(如果消息中没有这个字段)或者修改。Min_SE是指该代理支持的会话更新下限,session_expires字段表示现在会话更新的间隔值。如果session_expires的值小于当前代理的Min_SE字段值,代理服务器将拒绝这次请求并返回422响应,422中携带服务器支持的Min_SE。UAC按照422中的Min_SE值进行再次协商。
经过多次这样的协商Min_SE值就能满足所有的服务器需求。
具体过程如图
session_expires 字段
session_expires用于传输SIP会话间隔。会话在session_expires/2的时间进行更新。
Min_SE 字段
Min_SE 会话间隔最小值,以秒为单位。默认值为90。
422 应答码
当请求的session_expires值小于服务器的Min_SE时,回应422 进行协商。
session_timer机制重点
1、通过Support:timer ;判断终端是否支持 session_timer功能;
2、会话更新时间为session_expires/2值;
3、会话更新可以是UAC、也可以是UAS发起,但是无论哪个发起的都应有相应的应答;
4、在session_expires/2时间没有得到请求的应答,则发送bey消息拆除当前的会话;如果在session_expires/2的时间内没有得到更新请求,则发送bey消息拆除当前的会话。