微服务协议之 SIP

作者: 老瓦在霸都 | 来源:发表于2018-06-21 21:56 被阅读8次

    微服务协议之 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 的主要实体

    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

    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                     |
          |----------------------------------------------->|
    
    
    
        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 给下一跳

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

    相关文章

      网友评论

        本文标题:微服务协议之 SIP

        本文链接:https://www.haomeiwen.com/subject/xzncyftx.html