7.1. Basic Message Flow with Early Media and SIP Identity (早期媒体与 SIP Identity 的基本消息流)
在建立会话之前, Alice 与 Bob 均生成自签名证书, 用于单次会话或 (更常见地) 在多次会话中复用. 本例中 Alice 呼叫 Bob, 并假定 Alice 与 Bob 共用同一代理.
本示例展示 Alice 为 passive (被动) 端点, Bob 为 active (主动) 端点时的 SIP 消息流: Bob 一收到 Alice 的 INVITE 且 offer 的 m= 行指定 DTLS, 即开始与 Alice 就 RTP 与 RTCP 流协商 DTLS 关联. 一旦 Bob 向 Alice 发送 DTLS Finished, 早期媒体 (RTP 与 RTCP) 即可从 Bob 流向 Alice. 双向媒体 (RTP 与 RTCP) 可在 Alice 收到 SIP 200 响应且 Alice 已发送 DTLS Finished 之后传输.
Alice 到其代理的 SIP 信令经 TLS 传输, 以保证 Alice 与其身份服务之间的完整性保护信道. 代理之间的传输亦应某种方式加以保护, 尤其在未使用 SIP Identity 时.
Alice Proxies Bob |(1) INVITE | | |---------------->| | | |(2) INVITE | | |----------------->| | |(3) hello | |<-----------------------------------| |(4) hello | | |----------------------------------->| | |(5) finished | |<-----------------------------------| | |(6) media | |<-----------------------------------| |(7) finished | | |----------------------------------->| | |(8) 200 OK | | <------------------| |(9) 200 OK | | |<----------------| | | |(10) media | |<---------------------------------->| |(11) ACK | | |----------------------------------->|
Message (1): INVITE Alice -> Proxy
此为 Alice 经 TLS 传向其代理的初始 INVITE (该代理兼作 Alice 的身份服务), 以保证完整性保护信道. Alice 在 SDP 中通过 a=setup:actpass 表明可为主动或被动端点. Bob 选择作为 DTLS 客户端并发起会话. SDP 中还包含 fingerprint 属性, 由 Alice 的自签名证书计算得出.
该 offer 包含默认 m= 行提供 RTP, 以便 answerer 不支持 SRTP 时仍可处理. 但优先使用 SRTP 传输的潜在配置. SDP 能力协商细节见 [MMUSIC-SDP].
INVITE sip:[email protected] SIP/2.0
To: <sip:[email protected]>
From: "Alice"<sip:[email protected]>;tag=843c7b0b
Via: SIP/2.0/TLS ua1.example.com;branch=z9hG4bK-0e53sadfkasldkfj
Contact: <sip:[email protected]>
Call-ID: 6076913b1c39c212@REVMTEpG
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: xxxx
Supported: from-change
v=0
o=- 1181923068 1181923196 IN IP4 ua1.example.com
s=example1
c=IN IP4 ua1.example.com
a=setup:actpass
a=fingerprint: SHA-1 \
4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
t=0 0
m=audio 6056 RTP/AVP 0
a=sendrecv
a=tcap:1 UDP/TLS/RTP/SAVP RTP/AVP
a=pcfg:1 t=1
Message (2): INVITE Proxy -> Bob
INVITE 由 Alice (及 Bob) 的代理转发至 Bob. Alice 的代理已插入 Identity 与 Identity-Info 头字段. 为简化, 本例将两侧代理画成单一元素. Bob 验证 INVITE 所提供的身份.
INVITE sip:[email protected] SIP/2.0
To: <sip:[email protected]>
From: "Alice"<sip:[email protected]>;tag=843c7b0b
Via: SIP/2.0/TLS proxy.example.com;branch=z9hG4bK-0e53sadfkasldk
Via: SIP/2.0/TLS ua1.example.com;branch=z9hG4bK-0e53sadfkasldkfj
Record-Route: <sip:proxy.example.com;lr>
Contact: <sip:[email protected]>
Call-ID: 6076913b1c39c212@REVMTEpG
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE
Max-Forwards: 69
Identity: CyI4+nAkHrH3ntmaxgr01TMxTmtjP7MASwliNRdupRI1vpkXRvZXx1ja9k
3W+v1PDsy32MaqZi0M5WfEkXxbgTnPYW0jIoK8HMyY1VT7egt0kk4XrKFC
HYWGCl0nB2sNsM9CG4hq+YJZTMaSROoMUBhikVIjnQ8ykeD6UXNOyfI=
Identity-Info: https://example.com/cert
Content-Type: application/sdp
Content-Length: xxxx
Supported: from-change
v=0
o=- 1181923068 1181923196 IN IP4 ua1.example.com
s=example1
c=IN IP4 ua1.example.com
a=setup:actpass
a=fingerprint: SHA-1 \
4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
t=0 0
m=audio 6056 RTP/AVP 0
a=sendrecv
a=tcap:1 UDP/TLS/RTP/SAVP RTP/AVP
a=pcfg:1 t=1
Message (3): ClientHello Bob -> Alice
在 Alice 身份有效的前提下, 图中 (3) 表示 Bob 直接向 Alice 发送 DTLS ClientHello. 本例会向 Alice 发送两条 ClientHello: 一条到 ua1.example.com:6056 (RTP), 另一条到端口 6057 (RTCP), 图中为简洁只画一条箭头.
Message (4): ServerHello+Certificate Alice -> Bob
Alice 对 RTP 与 RTCP 关联均回应 ServerHello, Certificate 与 ServerHelloDone. 两种关联使用同一证书. 若使用 RTP/RTCP 复用 [RFC5761], 则只需单一关联.
Message (5): Certificate Bob -> Alice
Bob 对 RTP 与 RTCP 关联均发送 Certificate, ClientKeyExchange, CertificateVerify, change_cipher_spec 与 Finished. 同样, Bob 对两关联使用同一服务器证书.
Message (6): Early Media Bob -> Alice
此时 Bob 可向 Alice 发送早期媒体 (RTP 与 RTCP). 注意 Alice 尚不能信任该媒体, 因尚未收到指纹. UA 用户界面应向 Alice 标明媒体尚未经可信的安全验证.
Message (7): Finished Alice -> Bob
Bob 收到 Message (7) 所指消息之后, Alice 发送 change_cipher_spec 与 Finished.
Message (8): 200 OK Bob -> Alice
Bob 接听时发送包含其证书指纹的 200 OK SIP 消息. Bob 在 acfg 参数中指明实际传输配置为基于 DTLS 的 SRTP.
SIP/2.0 200 OK
To: <sip:[email protected]>;tag=6418913922105372816
From: "Alice" <sip:[email protected]>;tag=843c7b0b
Via: SIP/2.0/TLS proxy.example.com:5061;branch=z9hG4bK-0e53sadfkasldk
Via: SIP/2.0/TLS ua1.example.com;branch=z9hG4bK-0e53sadfkasldkfj
Record-Route: <sip:proxy.example.com;lr>
Call-ID: 6076913b1c39c212@REVMTEpG
CSeq: 1 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: xxxx
Supported: from-change
v=0
o=- 6418913922105372816 2105372818 IN IP4 ua2.example.com
s=example2
c=IN IP4 ua2.example.com
a=setup:active
a=fingerprint: SHA-1 \
FF:FF:FF:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
t=0 0
m=audio 12000 UDP/TLS/RTP/SAVP 0
a=acfg:1 t=1
Message (9): 200 OK Proxy -> Alice
Alice 从代理收到消息, 并验证 Message (7) 相关流程中呈现的证书. 端点此时可向 Alice 表明呼叫已受保护.
Message (10): RTP+RTCP Alice -> Bob
此时 Alice 亦可开始向 Bob 发送 RTP 与 RTCP.
Message (11): ACK Alice -> Bob
最后 Alice 向 Bob 发送 SIP ACK.