SIP协议分为普通心跳和会话心跳。
普通心跳
由于SIP本身没有定义心跳,因而在实践中一般采用OPTIONS消息作为心跳,OPTIONS原来是用来作为获取对方能力的消息,正好也可以检测对方当前服务状态,比较合适。
正常情况下,UAS收到OPTIONS心跳,什么也不用做,直接回复200即可。
但是这种心跳的问题在于,如果服务异常重启,那么之前的会话则无法检测,因此规范也定义了会话级心跳。
会话心跳
SIP的会话心跳,是在初始请求时携带 timer
标识,标识自己支持会话刷新,UAS在响应的时候也可以标识自己是否支持。实际应用中,是可配置的一般可以简单的由对方来发送心跳,本地响应即可。
在确认支持会话刷新机制后,会话在接通后,其中一端可启动定时器定期刷新会话,可以使用 UPDATE
或者 INVITE
,相对于能力是请求响应中可以获取到。一般实践中,UPDATE
消息应用于接通前,因此接通后使用 INVITE
消息。
INVITE
的 Session-Expires
字段会携带时间和刷新者,响应需要对应的关系如下
UAC是否支持 | 请求refresher参数 | 响应refresher参数 |
---|---|---|
否 | none | uas |
否 | uac | NA |
否 | uas | NA |
是 | none | uas 或 uas |
是 | uac | uac |
是 | uas | uas |
一般要求对方主动刷新的时候,本地响应相对比较简单,参照上面表格响应即可。本地主动刷新需要设定时器参照刷新周期内,在大于 Min-SE
时间的任意时间发起(默认很多服务为90秒)。实测很多运营商服务都是90秒检测,失败后直接 BYE
挂机。