SIP 100rel 协议规范
1. 协议简介
100rel (Reliable Provisional Responses) 是 RFC 3262 定义的 SIP 扩展,用于确保临时响应(180、183 等)的可靠传输。
- 问题:标准 SIP 中 1xx 响应不可靠,可能丢失
- 解决:通过 RSeq/RAck 机制和 PRACK 方法实现可靠传输
- 应用:早期媒体、振铃通知等场景
2. 完整 SIP 流程
客户端A (UAC) 服务器B (UAS)
| |
|------------- INVITE ------------------>|
| Supported: 100rel |
| |
|<---------- 100 Trying -----------------| (不可靠)
| |
|<-------- 180 Ringing ------------------| (可靠)
| RSeq: 1, Require: 100rel |
| |
|------------- PRACK ------------------->| (确认 180)
| RAck: 1 21805 INVITE |
| |
|<--------- 200 OK (PRACK) --------------|
| |
|<------ 183 Session Progress -----------| (可靠)
| RSeq: 2, Require: 100rel |
| |
|------------- PRACK ------------------->| (确认 183)
| RAck: 2 21805 INVITE |
| |
|<--------- 200 OK (PRACK) --------------|
| |
|<--------- 200 OK (INVITE) -------------| (最终响应)
| |
|-------------- ACK -------------------->|
3. RSeq 序列号规则
RSeq 分配规则(RFC 3262)
- 范围:1 到 2^31 – 1
- 初始值:随机选择
- 递增:每个可靠临时响应 +1
- 作用域:每个 Dialog 内独立
示例
INVITE (CSeq: 21805)
├── 180 Ringing (RSeq: 1) ← PRACK (CSeq: 21806, RAck: 1 21805 INVITE)
│ └── 200 OK (PRACK)
├── 183 Progress (RSeq: 2) ← PRACK (CSeq: 21807, RAck: 2 21805 INVITE)
│ └── 200 OK (PRACK)
└── 200 OK (final response)
4. PRACK 回复规范
RAck 头字段格式
RAck:
<RSeq> <原始CSeq> <原始Method>
实际案例
1. 原始请求
INVITE sip:user@server.com SIP/2.0
CSeq: 21805 INVITE
Supported: 100rel
1. 收到 183 响应
SIP/2.0 183 Session Progress
CSeq: 21805 INVITE
RSeq: 2
Require: 100rel
1. 正确的 PRACK 回复
PRACK sip:user@server.com SIP/2.0
RAck: 2 21805 INVITE
CSeq: 21806 PRACK
关键要点
- RAck 第一个数字:要确认的临时响应的 RSeq 值
- RAck 第二个数字:原始请求的 CSeq 值(不变)
- RAck 第三个字符串:原始请求的方法名
- PRACK CSeq:PRACK 自己的递增序列号
5. 常见错误
500 Server Internal Error
通常由以下原因导致:
- RAck 格式错误
- RSeq/CSeq 不匹配
- PRACK 超时发送
- 服务器状态机异常
Wireshark 过滤器
1. 查看 100rel 相关消息
sip.Method == "PRACK" || sip.RSeq
1. 查看 PRACK 错误
sip.Status-Code == 500 && sip contains "PRACK"
6. 参考规范
- RFC 3262: Reliability of Provisional Responses in SIP
- SIP Timer 协议规范
1. 协议简介
SIP Timer 是 RFC 4028 定义的会话定时器机制,用于检测和刷新 SIP 会话状态,防止会话”僵死”。
- 问题:网络异常、设备重启等导致会话状态不一致
- 解决:通过周期性的 re-INVITE 或 UPDATE 刷新会话
- 应用:长时间通话、网关互联等场景
2. Timer 机制流程
客户端A (UAC) 服务器B (UAS)
| |
|------------- INVITE ------------------>|
| Session-Expires: 1800 |
| Min-SE: 90 |
| |
|<--------- 200 OK -------------------- |
| Session-Expires: 1800;refresher=uac |
| |
|-------------- ACK -------------------->|
| |
| (会话进行中...) |
| |
|------------- re-INVITE --------------->| (刷新)
| Session-Expires: 1800 |
| |
|<--------- 200 OK -------------------- |
| |
|-------------- ACK -------------------->|
3. 关键头字段
Session-Expires
- 会话过期时间(秒)
- 默认值:1800 秒(30 分钟)
- 范围:Min-SE 到任意大值
Min-SE (Minimum Session Expires)
- 最小会话间隔(秒)
- 默认值:90 秒
- 防止过于频繁的刷新
refresher 参数
uac:客户端负责刷新uas:服务器负责刷新
4. 实际案例
1. 初始 INVITE
INVITE sip:bob@example.com SIP/2.0
Session-Expires: 1800
Min-SE: 90
Supported: timer
1. 200 OK 响应
SIP/2.0 200 OK
Session-Expires: 1800;refresher=uac
Require: timer
1. 会话刷新 re-INVITE(在过期前发送)
INVITE sip:bob@example.com SIP/2.0
Session-Expires: 1800
CSeq: 21806 INVITE
5. Timer 规则
刷新时机
- 在 Session-Expires 时间的 50% 时开始刷新
- 例如:1800 秒过期,在 900 秒时开始刷新
刷新方法
- re-INVITE:修改会话参数时使用
- UPDATE:仅刷新定时器时使用
协商规则
- 取双方 Session-Expires 的较小值
- 不能小于任一方的 Min-SE 值
6. 常见错误
422 Session Interval Too Small
SIP/2.0 422 Session Interval Too Small
Min-SE: 120
- 请求的 Session-Expires 小于服务器的 Min-SE
会话超时处理
- 刷新失败或超时:主动发送 BYE 结束会话
- 避免”僵死”会话占用资源
7. 参考规范
- RFC 4028: Session Timers in SIP