SIP SUBSCRIBE
订阅协议参考标准
https://tools.ietf.org/html/rfc6665
订阅注册事件包参考标准
https://tools.ietf.org/html/rfc3680
订阅消息流程如下
SUBSCRIBE 关键点
Event Package: 定义了通知者向订阅者报告一组状态信息,rfc3680中定义了需要的事件包
Event Template-Package: 定义一组事件包状态
Notification:通知者发送NOTIFY到订阅者
SUBSCRIBE必须具有expires字段,并且相应200ok必须有expires字段,当expires 值为0时,为取消订阅
注册与订阅的expire字段需要分割开来,注册默认超时时间3600s订阅默认超时时间3761s,防止联合刷新造成的潜在问题
subscribe 能够订阅一组联系人的注册状态,当expires 为0时,标准中定义需要发送所有注册联系人的注册状态,而其它时候通知注册状态同事变化状态的联系人
收到 404,405,410,416,480-485,489,501或604响应,则订阅者必须考虑终止订阅
如果是订阅者希望重新订阅,他通过使用新生成的Call-ID及新的唯一的fromtag
收到notify时需要检查是否是自己需要的订阅,否则返回481订阅不存在、不支持event中的event-packet,返回489,bad event,为了防止事件欺骗,notify中必须包含Subscription-State来指示订阅状态。Subscription-State field is active,已被接受或已获授权,如果包含expires则订阅者需要修改订阅持续时间,如果Subscription-State" value is "pending" ,"Subscription-State" value is "terminated",
SUBSCRIBE请求的身份验证也将始终通过401(未授权)响应执行
订阅者需要解析application/reginfo+xml 携带的xml信息
通知者应该使用403(禁止)或603(拒绝)回复请求回应
RFC3325规范增加了P-Asserted/Preferred-Identity两个头域,也是用来携带主叫号码信息。其中,P-Asserted-Identity主要在信任域的server之间、proxy之间、server与Proxy之间进行传递,而P-Preferred-Identity主要在UA与server/proxy之间传递
必须具有Accept: application/reginfo+xml告知UAS通过xml格式通知订阅者
订阅状态机如下
SUBSCRIBE格式
SUBSCRIBE sip:joe@example.com SIP/2.0
Via: SIP/2.0/UDP app.example.com;branch=z9hG4bKnashds7
From: sip:app.example.com;tag=123aa9
To: sip:joe@example.com
Call-ID: 9987@app.example.com
CSeq: 9887 SUBSCRIBE
Contact: sip:app.example.com
Event: reg
Max-Forwards: 70
Accept: application/reginfo+xml
NOTIFY格式
NOTIFY sip:app.example.com SIP/2.0
Via: SIP/2.0/UDP server19.example.com;branch=z9hG4bKnasaii
From: sip:joe@example.com;tag=xyzygg
To: sip:app.example.com;tag=123aa9
Call-ID: 9987@app.example.com
CSeq: 1288 NOTIFY
Contact: sip:server19.example.com
Event: reg
Max-Forwards: 70
Content-Type: application/reginfo+xml
Content-Length: 98
<?xml version="1.0"?>
<reginfo xmlns="urn:ietf:params:xml:ns:reginfo" version="0" state="full">
<registration aor="sip:joe@example.com" id="a7" state="init" />
</reginfo>
一般来说,我们会在注册成功后进行订阅。