微服务协议之 SIP
在网络的世界里, 可不是只有电脑, 还是各种各样的通信设备, 还有电话, 手机, 网络会议终端, 不仅只有文本, 还有语音, 视频, 远程共享和控制等等, 这些构成了网络聊天, 网络会议, 网络直播等等应用. 在这些应用场景里, 我们都需要建立或中止多媒体会话, 参与会话的各方还要协商彼此通讯的地址,端口,编码等. HTTP 显然不太适用, SIP 应运而生.
SIP 会话初始协议是 IETF 在 1999 年提出的一个在IP网络中实现多媒体实时通信的一种信令协议. 它的协议设计及消息构造大量借鉴了HTTP, 非常易于理解和扩展, 风头直压 ITU 所定义的 H.323 协议
SIP 比 HTTP 要复杂得多, 扩展协议也非常多, 以至于 SIP 协议的作者 Jonathan Rosenberg 为此 写了一个"SIP协议导游手册" - RFC5411 - A Hitchhiker's Guide to the Session Initiation Protocol 来帮助大家找到相应的 SIP 扩展协议文档, 由于这个导游手册写的时间比较早, 之后的一些扩展协议也没能覆盖到, 可见 SIP 蓬勃的生命力, 不过好象这几年有点式微.
SIP 的主要功能有
- 用户位置: 确定用于通信的终端系统
- 用户可达性: 确定被叫方参与通信的意愿
- 用户能力: 确定通信媒体及其具体参数
- 会话建立: 搭建主叫和被叫方的会话, 协商彼此的通信参数
- 会话管理: 转移及终止会话, 修改会话参数以及调用服务
SIP 的主要实体
UA
- User Agent 用户代理:
又可分为- UAC(User Agent Client)
- UAS(User Agent Server)
Servers 服务器
- 注册服务器
- 位置服务器
- 重定向服务器
- 代理服务器 Stateful/Stateless Proxy
B2BUA
背靠背用户代理是一个逻辑实体, 就象背靠背的两个人手递手的传递消息, 既作为接收消息的 UAS, 又作为发送消息的 UAC, 它不是一个单纯的代理服务器, 它维护着对话状态并参与所有请求响应过程
AOR
Address-of-Record 地址记录, 指一个 SIP URI 或 SIPs URI, 可以认为是一个用户的公开地址
Call
指建立的端点间通信的呼叫, 用来搭建多媒体会话
Conference
一个包含多个参会者的多媒体会话
Dialog
对话 Dialog 也称 Call Leg , 呼叫的一条腿, 它表示一个端到端的两个 UA 之间的一段时间内的联系
在每个UA的 dialog 由 CallId, local tag, remote tag 来唯一标识, 只有 2xx 和 101-199 这些带有 To tag 的对于 INVITE 消息的响应才会建立一个 dialog
Session
一个多媒体表示一些多媒体发送者和接收者和它们之间数据流.
一个多媒体会议就是一个多媒体会话的典型例子.
一个被叫者可以在一个会话 session 中被多个不同的 Call 邀请多次
如果使用了 SDP, 一个会话 session 可以由 SDP user name, session id, network type, address type 和 origin 域中的地址类型来定义标识
Transaction
事务指在 Client 和
Server 之间的所有消息, 从 client 发送的第一个请求开始, 直到 server 回应的 final response (最终响应, 响应码不是1xx).
ACK 对于 2xx 响应是单独的事务
SIP 消息
SIP 协议的消息非常类似 HTTP, 以一个 invite 消息为例
请求Request:
INVITE sip:5510571931@sio.com SIP/2.0
Via: SIP/2.0/UDP 10.224.2.213:5060;branch=z9hG4bK56689e88;rport=5060
Max-Forwards: 70
Contact: <sip:6625@10.224.2.213>
To: <sip:5510571931@sip.walterfan.com>
From: "device" <sip:6625@10.224.2.213>;tag=as537b785a
Call-ID: 240a90872b94ee223b82413a3fc35bda@10.224.2.213
CSeq: 102 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Content-Type: application/sdp
Date: Sat, 09 Sep 2017 10:37:32 GMT
User-Agent: Asterisk PBX
Content-Length: 238
v=0
o=root 2476 2476 IN IP4 10.224.2.213
s=session
c=IN IP4 10.224.2.213
t=0 0
m=audio 17092 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
响应 Response:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.224.2.213:5060;branch=z9hG4bK56689e88;rport
Max-Forwards: 70
Contact: <sip:walterfanapp@10.224.56.150:5060>
To: <sip:5510571931@sip.walterfan.com>;tag=ba83ca20b87b4d14+10.224.56.150
From: "device" <sip:6625@10.224.2.213>;tag=as537b785a
Call-ID: 240a90872b94ee223b82413a3fc35bda@10.224.2.213
CSeq: 102 INVITE
Content-Type: application/sdp
Content-Length: 247
v=0
o=CMS 807249 1504753518809 IN IP4 10.224.91.22
s=ciscowalterfan_cms_session
c=IN IP4 10.224.91.22
t=0 0
m=audio 19246 RTP/AVP 0 101
c=IN IP4 10.224.91.22
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20
确认Confirm:
ACK sip:walterfanapp@10.224.56.150:5060 SIP/2.0
Via: SIP/2.0/UDP 10.224.2.213:5060;branch=z9hG4bK202b0771;rport=5060
Max-Forwards: 70
Contact: <sip:6625@10.224.2.213>
To: <sip:5510571931@sip.walterfan.com>;tag=ba83ca20b87b4d14+10.224.56.150
From: "device" <sip:6625@10.224.2.213>;tag=as537b785a
Call-ID: 240a90872b94ee223b82413a3fc35bda@10.224.2.213
CSeq: 102 ACK
User-Agent: Asterisk PBX
Content-Length: 0
典型工作流程
参见 RFC3665: 会话起始协议基本呼叫流程示例Session Initiation Protocol (SIP) Basic Call Flow Examples
- 直接呼叫
Alice Bob
| |
| INVITE F1 |
|----------------------->|
| 180 Ringing F2 |
|<-----------------------|
| |
| 200 OK F3 |
|<-----------------------|
| ACK F4 |
|----------------------->|
| Both Way RTP Media |
|<======================>|
| |
| BYE F5 |
|<-----------------------|
| 200 OK F6 |
|----------------------->|
| |
- 用户注册
Bob SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 401 Unauthorized F2 |
|<------------------------------|
| REGISTER F3 |
|------------------------------>|
| 200 OK F4 |
|<------------------------------|
| |
- 重定向呼叫
- 会话建立前
Alice Bob Carl
| | |
| F1 INVITE | |
|--------------------------->| |
| F2 302 Moved Temporarily | |
|<---------------------------| |
| F3 INVITE |
|----------------------------------------------->|
| F4 200 OK |
|<---------------------------------------------->|
| F5 ACK |
|----------------------------------------------->|
- 会议建立后
参见rfc3515
Alice Bob Carl
| | |
| F1 REFER | |
|----------------------->| |
| F2 202 Accepted | |
|<-----------------------| |
| F3 NOTIFY | |
|<-----------------------| |
| F4 200 OK | |
|----------------------->| |
| | F5 Invite |
| |------------------>|
| | F6 200 OK |
| |<------------------|
| | F7 ACK | | |------------------>|
| F58NOTIFY | |
|<-----------------------| |
| F9 200 OK | |
|----------------------->| |
| | |
| | |
- 代理呼叫
Alice Proxy 1 Proxy 2 Bob
| | | |
| INVITE F1 | | |
|--------------->| | |
| 407 F2 | | |
|<---------------| | |
| ACK F3 | | |
|--------------->| | |
| INVITE F4 | | |
|--------------->| INVITE F5 | |
| 100 F6 |--------------->| INVITE F7 |
|<---------------| 100 F8 |--------------->|
| |<---------------| |
| | | 180 F9 |
| | 180 F10 |<---------------|
| 180 F11 |<---------------| |
|<---------------| | 200 F12 |
| | 200 F13 |<---------------|
| 200 F14 |<---------------| |
|<---------------| | |
| ACK F15 | | |
|--------------->| ACK F16 | |
| |--------------->| ACK F17 |
| | |--------------->|
| Both Way RTP Media |
|<================================================>|
| | | BYE F18 |
| | BYE F19 |<---------------|
| BYE F20 |<---------------| |
|<---------------| | |
| 200 F21 | | |
|--------------->| 200 F22 | |
| |--------------->| 200 F23 |
| | |--------------->|
| | | |
SIP 可以基于 TCP(TLS) 和 UDP (DTLS) 之上传输, 由于它本身已经定义了CallId, CSeq 等头域, 规定了顺序, 超时重传等机制, 所以直接用 UDP 更常见一些
SIP 不仅是搭建会话, 它的路由功能也很强大,分为严格路由和松散路由, 前者会改变 Request-URI, 后者不会, 现在多用松散路由, 核心概念是远端目标与路由集合, 去往目标的路途很遥远, 必须跟随路由表一跳一跳的过去.
Proxy如果发现有Route头域,则Proxy会把消息路由给该头域中的URI,否则就路由给 Request-URI, 并且它会在 SIP 头中添加 Record-route 给下一跳
通过它的 Request-URI, Via , Route , Record-route , RFC3161中举了一个例子
https://tools.ietf.org/html/rfc3261#section-16.12.1
这里 http://www.tech-invite.com/fo-sip/tinv-fo-sip-dialog.html 也有比较详细的图表和演示, 这里不做赘述
SIP的很大一块功能是协商媒体通道的搭建, 它有一个伴生协议 SDP(Session Description Protocol) 参见 RFC4566
它具体描述了会话的媒体, 通信, 时序等参数, 以下面消息为例
# 版本
v=0
# 组织信息: username=root , sess-id=2476 , sess-version=2476 nettype=IN addrtype=IPv4, unicast-address=10.224.2.213
o=root 2476 2476 IN IP4 10.224.2.213
# session 名称为session
s=session
# 连接信息
c=IN IP4 10.224.2.213
# 时间start-time=0, stop-time=0 无始无终
t=0 0
# 媒体信息, 类型为 audio, 可以为 media types "audio", "video", "text", "application", and "message".
# 通信端口为 17092, 荷载为 RTP, Payload 类型有 0 , 8, 101
m=audio 17092 RTP/AVP 0 8 101
# 媒体属性: 0 代表是 g.711 U律
a=rtpmap:0 PCMU/8000
# 媒体属性: 8 代表是 g.711
A律
a=rtpmap:8 PCMA/8000
# 媒体属性: 101 代表是 DTMF按键
a=rtpmap:101 telephone-event/8000
# 媒体属性: DTMF 包含16个键
a=fmtp:101 0-16
# 媒体属性: 不支持静音包
a=silenceSupp:off - - - -
网友评论