微服务协议之 SIP

微服务协议之 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 的主要功能有

  1. 用户位置: 确定用于通信的终端系统
  2. 用户可达性: 确定被叫方参与通信的意愿
  3. 用户能力: 确定通信媒体及其具体参数
  4. 会话建立: 搭建主叫和被叫方的会话, 协商彼此的通信参数
  5. 会话管理: 转移及终止会话, 修改会话参数以及调用服务
微服务协议之 SIP_第1张图片

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, From tag(local tag), To 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_第2张图片

SIP 协议的消息非常类似 HTTP, 以一个 invite 消息为例

请求Request:

INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 10.224.2.213:5060;branch=z9hG4bK56689e88;rport=5060
Max-Forwards: 70
Contact: 
To: 
From: "device" ;tag=as537b785a
Call-ID: [email protected]
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: 
To: ;tag=ba83ca20b87b4d14+10.224.56.150
From: "device" ;tag=as537b785a
Call-ID: [email protected]
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:[email protected]:5060 SIP/2.0
Via: SIP/2.0/UDP 10.224.2.213:5060;branch=z9hG4bK202b0771;rport=5060
Max-Forwards: 70
Contact: 
To: ;tag=ba83ca20b87b4d14+10.224.56.150
From: "device" ;tag=as537b785a
Call-ID: [email protected]
CSeq: 102 ACK
User-Agent: Asterisk PBX
Content-Length: 0

典型工作流程

参见 RFC3665: 会话起始协议基本呼叫流程示例Session Initiation Protocol (SIP) Basic Call Flow Examples

  1. 直接呼叫
   Alice                     Bob
     |                        |
     |       INVITE F1        |
     |----------------------->|
     |    180 Ringing F2      |
     |<-----------------------|
     |                        |
     |       200 OK F3        |
     |<-----------------------|
     |         ACK F4         |
     |----------------------->|
     |   Both Way RTP Media   |
     |<======================>|
     |                        |
     |         BYE F5         |
     |<-----------------------|
     |       200 OK F6        |
     |----------------------->|
     |                        |
  1. 用户注册
    Bob                        SIP Server
     |                               |
     |          REGISTER F1          |
     |------------------------------>|
     |      401 Unauthorized F2      |
     |<------------------------------|
     |          REGISTER F3          |
     |------------------------------>|
     |            200 OK F4          |
     |<------------------------------|
     |                               |
  1. 重定向呼叫
  • 会话建立前
    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            |                   |
      |----------------------->|                   |
      |                        |                   |
      |                        |                   |

  1. 代理呼叫
   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 给下一跳

例如:

微服务协议之 SIP_第3张图片

A 发送 SIP Invite 给 B, B 在 SIP 200 消息中包含如下头域

Record-Route:  sip-uri-a  //-->由 proxy-a 添加 
Record-Route:  sip-uri-b //-->由 proxy-b 添加 
Record-Route:  sip-uri-c //-->由 proxy-c 添加 

则 B 必需在自己的 SIP ACK 消息中添加如下头域:

Route: sip-uri-c //--> 先到 proxy-c 
Route: sip-uri-b //--> 再到 proxy-b 
Route: sip-uri-a //--> 再到 proxy-a 

通过它的 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

微服务协议之 SIP_第4张图片

它具体描述了会话的媒体, 通信, 时序等参数, 以下面消息为例

# 版本
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 - - - -

你可能感兴趣的:(微服务协议之 SIP)