Skip to content

Phase 8:NioTlsTransport + NioWebSocketTransport(TLS + WS 完整实装) - #14

Draft
lixuanqun wants to merge 2 commits into
cursor/more-rfc4475-fixtures-3c36from
cursor/tls-transport-3c36
Draft

Phase 8:NioTlsTransport + NioWebSocketTransport(TLS + WS 完整实装)#14
lixuanqun wants to merge 2 commits into
cursor/more-rfc4475-fixtures-3c36from
cursor/tls-transport-3c36

Conversation

@lixuanqun

Copy link
Copy Markdown
Owner

概述

完整 Transport 矩阵收尾:在已有 UDP / TCP 之上加 TLS(RFC 3261 §26.2)WebSocket(RFC 7118)

🔗 stacked on PR #13

NioTlsTransport

  • 复用 TCP transport 的 framing 与连接复用
  • 通过 SSLContext 注入:证书 / 信任锚 / mTLS 配置完全应用层掌控
  • 出站连接强制启用 HTTPS-style endpoint identification(RFC 5922 SIPS 强制
  • TLSv1.3 默认

TLS 测试基建

  • 预生成 PKCS12 keystore via keytool(CN=localhost + SANs),入库 src/test/resources/test-keystore.p12
  • .gitattributes 标记 *.p12 / *.jks binary
  • TestSslContext 工厂:server / client SSLContext(trust-all 仅测试用)

NioWebSocketTransport (RFC 7118 + RFC 6455)

WebSocketFrame

  • 完整 RFC 6455 §5.2 帧编解码
  • 客户端自动 32-bit random mask、服务端不掩码
  • 拒绝 > 4 MB payload

WebSocketHandshake

  • 服务端:解析 GET 请求 + 计算 Sec-WebSocket-Accept = base64(SHA1(key+GUID))
  • 客户端:发起 + 协商 Sec-WebSocket-Protocol: sip(RFC 7118)
  • 失败给 HTTP 400 / 426

NioWebSocketTransport

  • 一个 SIP 消息 = 一个 TEXT 帧(RFC 7118 §4.1)→ 帧边界即消息边界,不需要 Content-Length framing
  • 角色区分:server(accept loop)/ client(pure dial)
  • PING → PONG 自动回响、CLOSE 双向 echo

测试

transport-nio 模块从 7 个增到 12 个集成测试

  • 3 UDP(已有)
  • 4 TCP(已有)
  • 2 TLS(新增)
  • 3 WS(新增)

每个 transport 至少覆盖:客户端→服务端发送、服务端回响、连接复用。

验证

mvn -B verify → 10 modules SUCCESS, ~210 tests
transport-nio: 12 集成测试全绿

现在所有 RFC 3261 §18 + RFC 7118 传输方案都齐了

Transport 实装位置 状态
UDP NioUdpTransport
TCP NioTcpTransport
TLS NioTlsTransport
WS NioWebSocketTransport
WSS (NioWebSocketTransport over TLS — 未单独实装;可后续叠加) 🟡
SCTP 不在路线图
Open in Web Open in Cursor 

cursoragent and others added 2 commits May 11, 2026 21:58
… 5922)

实装
- 复用 TCP transport 的 framing 与连接复用模式
- 通过 SSLContext 注入证书 / 信任锚 / mTLS 配置(应用层完全控制)
- 出站连接启用 HTTPS-style endpoint identification(RFC 5922 SIPS 要求)
- TLSv1.3 默认,对端可降级到 TLSv1.2(由 SSLContext 协议版本配置)

测试
- 预生成 PKCS12 keystore via keytool(CN=localhost + SAN dns/ip)
- TestSslContext:server/client SSLContext 工厂(trust-all 用于测试,
  生产严禁;在 KDoc 中明确说明)
- NioTlsTransportTest(2 个):
  · clientCanSendInviteToServerOverTls — INVITE + SDP body 帧定通过
  · serverCanReplyOverSameTlsConnection — 双向 200 OK 走同一 TLS 连接

.gitattributes:*.p12/*.jks 标记 binary。

mvn verify:transport-nio 模块 9 集成测试(3 UDP + 4 TCP + 2 TLS)全绿。

Co-authored-by: li xuanqun <793005378@qq.com>
…455)

帧编解码(WebSocketFrame)
- 完整 RFC 6455 §5.2 帧格式:FIN/RSV/opcode/mask/len-short/len-extended
- read:自动 mask 反演;reject 超过 4MB payload
- write:客户端帧自动加 32-bit random mask;服务端帧不掩码

握手(WebSocketHandshake)
- 服务端:解析 GET 请求、校验 Sec-WebSocket-Key/Version、
  生成 Sec-WebSocket-Accept = base64(SHA1(key+GUID))
- 客户端:发起请求带 Sec-WebSocket-Protocol: sip(RFC 7118),
  校验 101 响应的 Accept 与本地计算一致
- 失败时给出 HTTP 错误响应(400 / 426)

NioWebSocketTransport
- 复用 TCP transport 的连接复用模式
- 每个 SIP 消息 = 一个 TEXT 帧(RFC 7118 §4.1)→ 不需要 Content-Length framing
- 角色区分:server(accept loop)/ client(pure dial)
- PING 自动 PONG 回响、CLOSE 双向 echo
- send 串行化用 ReentrantLock

测试(NioWebSocketTransportTest,3 个)
- clientCanSendSipOverWebSocket
- multipleMessagesPerConnectionReuseHandshake — 一个 WS 连接复用 3 次
- serverCanReplyOnSameWebSocket — 双向通信

mvn verify:transport-nio 12 集成测试(3 UDP + 4 TCP + 2 TLS + 3 WS)全绿。

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