day4-Timer协议与100rel协议

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

  1. 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
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇