Skip to content

Phase 4:RFC 3261 §17 四个事务 FSM + 时间轮 + 事务表 - #9

Draft
lixuanqun wants to merge 1 commit into
cursor/transport-udp-3c36from
cursor/transactions-3c36
Draft

Phase 4:RFC 3261 §17 四个事务 FSM + 时间轮 + 事务表#9
lixuanqun wants to merge 1 commit into
cursor/transport-udp-3c36from
cursor/transactions-3c36

Conversation

@lixuanqun

Copy link
Copy Markdown
Owner

概述

实装 RFC 3261 §17 全部四个事务 FSM 以及配套基础设施。这是协议栈的核心机器。

🔗 stacked on PR #8

设计

TimerScheduler —— ScheduledExecutorService + 虚拟线程派发

  • 单线程 scheduler 把每个定时器入队
  • 触发后切到虚拟线程跑回调,永不阻塞 timer wheel
  • 接口很窄,将来换成 HashedWheelTimer 不动调用方

Timing —— RFC §A 11 个定时器常量

  • T1=500ms / T2=4s / T4=5s
  • Timer A / E / GtimerN(attempt) 实现指数退避(封顶 T2)
  • Timer B = F = H = 64*T1 = 32s
  • 可靠传输上 Timer D/I/J/K = 0(立即终结)

TransactionKey —— (branch, sent-by, method) 三元组

  • 强制 RFC 3261 magic cookie z9hG4bK
  • ACK 匹配用 overrideMethod=INVITE(让 ACK 命中原 INVITE 服务端事务)

TransactionTable —— ConcurrentHashMap

MessageSender —— 单方法 SPI(send(message, peer) → CompletableFuture<Void>

  • 事务层不耦合 transport,便于单测用 RecordingSender

四个 FSM

FSM RFC § 状态 计时器
NonInviteClientTransaction §17.1.2 Trying → Proceeding → Completed → Terminated E (retx) / F (timeout) / K (completion wait)
NonInviteServerTransaction §17.2.2 Trying → Proceeding → Completed → Terminated J (lifetime)
InviteClientTransaction §17.1.1 Calling → Proceeding → Completed/Terminated A (retx, 指数退避) / B (timeout) / D (completion wait)
InviteServerTransaction §17.2.1 Proceeding → Completed → Confirmed → Terminated G (retx) / H (ACK timeout) / I (absorb retx ACK)

关键 RFC 行为

  • INVITE Client 收到 2xx:立即 Terminate(TU 负责 ACK + retransmit)
  • INVITE Client 收到 3xx-6xx:自动构造并发送 ACK(§17.1.1.3),保持 Completed 直到 Timer D
  • INVITE Client 在 Completed 收到 retransmit final:重发 ACK
  • INVITE Server 收到 2xx:立即 Terminate(TU 接管)
  • INVITE Server 收到 3xx-6xx 后等 ACK:ACK 来 → Confirmed → Timer I → Terminated
  • Non-INVITE Server 在 Completed 收到 retransmit:重发上一响应

测试

5 个测试类,18 个 dynamic-test items

  • TransactionKeyTest — 4 个(成功派生 / 缺 branch / 缺 magic cookie / ACK 重写)
  • NonInviteClientTransactionTest — 4 个
  • NonInviteServerTransactionTest — 3 个
  • InviteClientTransactionTest — 4 个(含自动 ACK 生成、retransmit ACK 重发)
  • InviteServerTransactionTest — 3 个

RecordingSender 测试 fixture 让所有 FSM 在 1.5 秒内跑完,无需真实网络

验证

mvn -B verify → 9 modules SUCCESS, 140 tests, 0 failures
  sip-message:        10
  sip-codec:          69
  sip-transport-nio:   7
  sip-transaction:    18 ← 新增
  compliance:         36
Open in Web Open in Cursor 

模块结构
- Timing:RFC §A 全部 11 个定时器 (T1/T2/T4, Timer A/B/D/E/F/G/H/I/J/K)
  · timerA/E/G(attempt) 指数退避(封顶 T2/T1 的 2^n)
- TimerScheduler:单线程 scheduler + 虚拟线程派发的简洁实现
  · 回调跑在虚拟线程上,不阻塞 timer wheel
  · 可换成 HashedWheelTimer 而不影响调用方
- TransactionKey:RFC §17.1.3/§17.2.3 三元组 (branch, sent-by, method)
  · 强制 RFC 3261 magic cookie 'z9hG4bK'
  · ACK 匹配可覆盖 method=INVITE
- TransactionTable:ConcurrentHashMap<TransactionKey, Transaction>
- MessageSender:发送 SPI(解耦事务层与 transport,便于单测)

四个 FSM(RFC §17)
- NonInviteClientTransaction (§17.1.2)
  · Trying → Proceeding → Completed → Terminated
  · Timer E 重传(UDP 才有)、Timer F 超时、Timer K 完成等待
- NonInviteServerTransaction (§17.2.2)
  · Trying → Proceeding → Completed → Terminated
  · Timer J 寿命;重传请求时重放上一响应
- InviteClientTransaction (§17.1.1)
  · Calling → Proceeding → (Completed | Terminated)
  · Timer A 重传(指数退避)、Timer B 超时、Timer D 完成等待
  · 2xx → 立即 Terminated(TU 负责 ACK)
  · 3xx-6xx → 自动发 ACK(§17.1.1.3);重传 final → 重发 ACK
- InviteServerTransaction (§17.2.1)
  · Proceeding → Completed → Confirmed → Terminated
  · 2xx → 立即 Terminated(TU 接管)
  · 3xx-6xx → Timer G 重传、Timer H 超时等 ACK;ACK → Confirmed
  · Timer I 在 Confirmed 等吸收重传 ACK

测试覆盖(18 个)
- TransactionKeyTest:4 个(成功派生、缺 branch、缺 magic cookie、ACK 重写)
- NonInviteClientTransactionTest:4 个(200 OK、Provisional+Final、retransmit absorb、Timer E)
- NonInviteServerTransactionTest:3 个(初次请求、完成态、retransmit 重发响应)
- InviteClientTransactionTest:4 个(2xx 立即 Terminate、非 2xx → ACK、retransmit 重发 ACK、方法校验)
- InviteServerTransactionTest:3 个(2xx 立即 Terminate、非 2xx → ACK → Confirmed、retransmit INVITE)

RecordingSender 通用测试 fixture 让 FSM 完全可测,无需真实 transport。

mvn verify:9 模块 SUCCESS,总 140 tests。

Co-authored-by: li xuanqun <793005378@qq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants