SIP协议在VoIP中的应用(三)

一、什么是SIP协议

  SIP协议又名会话发起协议,它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。SIP协议是应VoIP语音电话的产生而产生的,SIP协议的作用如下:

  • 用户定位:确定参加通信的终端用户的位置,定位方式是SIP URL。
  • 用户通信能力协商:确定通信的媒体类型和参数,封装SDP信息。
  • 用户意愿交互:确定被叫是否乐意参加某个通信。
  • 建立呼叫:包括向被叫“振铃”,确定主叫和被叫的呼叫参数。
  • 呼叫处理和控制:包括呼叫重定向、呼叫转移、终止呼叫等等。

  SIP协议可以应用于IP网中实现基本的语音通信增值业务,也是IMS通信网络的核心协议。SIP协议与其它相关协议的关系图如下:

  SIP协议主要是为VoIP服务的,VoIP的通话模式有PC2PC、PC2PHONE、PHONR2PHONE、PHONE2PC四种,要实现VOIP语音电话,需要信令协议、媒体传输协议、其它支撑协议等三类协议的支持。以下是IP电话的协议族,其中H323、SIP、RTSP属于信令协议,RSVP、RTCP、RTP属于媒体传输协议。

二、SIP网络基本架构

  要充分理解SIP协议的作用和功能,先看看如下SIP网络的分布式架构,图中可以看到SIP协议穿梭于不同的服务器之间。

  1. UserAgent:是一个软终端或者是一个支持SIP协议的电话,对接收到的行为进行代理,发送到SIP网络中。它包含UserAgentClients和UserAgentServer两个实体,前者用于发起SIP事务请求,将动作转换为invite消息(比如拨号),后者用于接收SIP事务请求,将invite消息转换为动作(比电话振铃)。
  2. ProxyServer:用于转发SIP消息。
  3. LocationServer:是一个数据库,用于存放终端用户当前的位置信息,向RedirectServer或者ProxyServer提供被叫用户位置信息。
  4. RedirectServer:将用户新的位置信息返回给呼叫方,呼叫方可根据新的位置重新发起呼叫。
  5. RegisterServer:提供注册请求,完成用户地址的注册、用户鉴权。

  

三、SIP协议地址

  SIP网络采用了英特网的URL,支持IP地址和PSTN地址。一般的地址格式为:name@domain。举例:

  • 姓名@域名:sip:name@wcom.com 
  • 昵称<sip:姓名@域名>:sip:nicename<sip:name@zs.com>
  • 电话号码@电话运营商域名:sip:+1-613-555-1212@wcom.com;user=phone

四、SIP协议的消息结构

  SIP协议的消息类型主要有以下几种:

  • SIP请求消息:
  1. INVITE:发起会话请求。
  2. ACK:对INVITE请求的响应消息的确认。
  3. BYE:结束会话。
  4. CANCEL:取消尚未完成的请求。
  5. REGISTER:注册。
  6. OPTIONS:查询服务器的能力。
  7. INFO:用于传送 mid-call 信令信息,同一时刻只能有一个 INFO 事务存在。
  8. PRACK:临时响应(Provisional Response)确认。用于确认收到了临时响应。
  9. NOTIFY:事件通知,具体的事件包括、业务状态的改变、用户状态的改变等等。
  10. SUBSCRIBE:订阅/取消(Expires=0)事件通知。
  11. PUBLISH:发布事件状态。
  12. MESSAGE:针对即时消息 (IM)的扩展,用于传送即时消息。
  13. REFER:指示接收者 (Request-URI所标识的) 应该使用请求中提供的信息联系第三方。
  • SIP响应消息:响应消息是对请求的回应,类型有如下几种:
  1. 1xx:提供信息性消息。
  2. 2xx:报告请求成功。
  3. 3xx:报告重定向。
  4. 4xx:表示请求错误。
  5. 5xx:通知服务器错误。
  6. 6xx:报告一般错误。

  SIP中常用的响应状态码:100(试呼叫)、180(振铃)、181(呼叫前转)、182(排队)、183(可靠性临时响应)。

  SIP请求消息的结构如下:

Session Initiation Protocol (INVITE)   //表示一个SIP协议请求,消息类型为INVITE
    Request-Line: INVITE sip:1052@10.20.14.18:57106;ob SIP/2.0 //请求行:包含了请求方式、请求地址、协议版本
    Message Header   //消息头
        Via: SIP/2.0/UDP 10.20.14.15;rport;branch=z9hG4bK16Ft7BFNa3D8c  //标识请求路径,防止环路
        Max-Forwards: 70   //到达目的经过的中转站的最大值,网络每经过一跳都会自减一,如果值为0,则终止请求
        From: "90005_018076175750" <sip:90005_018076175750@10.20.14.15>;tag=87e0c69U7DS6m   //发起方地址
        To: <sip:1052@10.20.14.18:57106;ob>  //接收方地址
        Call-ID: 10e221cd-de61-123b-0f8b-f4b5200b7502  //标识一个INVITE
        [Generated Call-ID: 10e221cd-de61-123b-0f8b-f4b5200b7502]  
        CSeq: 59641416 INVITE  //用于匹配请求和响应消息
        Contact: <sip:mod_sofia@10.20.14.15:5060>    //给出后续直接通信的地址,给出后可以不用via里的地址
        User-Agent: FreeSWITCH-mod_sofia/1.10.7-release+git~20220830T085235Z~cda9d15f48~64bit   //包含发出请求的用户信息
        Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE   //标识代理服务器支持的请求类型
        Supported: timer, path, replaces
        Allow-Events: talk, hold, conference, presence, as-feature-event, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer 
        Content-Type: application/sdp  //消息体类型
        Content-Disposition: session 
        Content-Length: 420            //消息体长度
        X-FS-Support: update_display,send_info    
        Remote-Party-ID: "90005_018076175750" <sip:90005_018076175750@10.20.14.15>;party=calling;screen=yes;privacy=off
    Message Body   //消息体
        Session Description Protocol  //表示是一个sdp协议文本,下面是sdp协议内容
            Session Description Protocol Version (v): 0
            Owner/Creator, Session Id (o): FreeSWITCH 1668365019 1668365020 IN IP4 10.20.14.15
            Session Name (s): FreeSWITCH
            Connection Information (c): IN IP4 10.20.14.15
            Time Description, active time (t): 0 0
            Media Description, name and address (m): audio 25398 RTP/AVP 9 0 8 101
            Media Attribute (a): rtpmap:9 G722/8000
            Media Attribute (a): rtpmap:0 PCMU/8000
            Media Attribute (a): rtpmap:8 PCMA/8000
            Media Attribute (a): rtpmap:101 telephone-event/8000
            Media Attribute (a): fmtp:101 0-15
            Media Attribute (a): ptime:20
            Media Description, name and address (m): video 16624 RTP/AVP 102
            Bandwidth Information (b): AS:3072
            Media Attribute (a): rtpmap:102 VP8/90000
            Media Attribute (a): rtcp-fb:102 ccm fir
            Media Attribute (a): rtcp-fb:102 ccm tmmbr
            Media Attribute (a): rtcp-fb:102 nack
            Media Attribute (a): rtcp-fb:102 nack pli
            [Generated Call-ID: 10e221cd-de61-123b-0f8b-f4b5200b7502]

  SIP响应消息的结构如下:

Session Initiation Protocol (200)   //表示一个SIP协议响应,响应类型是200
    Status-Line: SIP/2.0 200 OK     //请求行:包含了请求方式、请求地址、协议版本
    Message Header
        Via: SIP/2.0/UDP 10.2.1.166:5060;branch=z9hG4bK218159826
        From: <sip:90005_018076175750@10.2.1.166>;tag=1739940613
        To: <sip:96138_952138@10.20.14.15:5080>;tag=raXecm9vtQ87B
        Call-ID: 4179317446@10.2.1.166
        [Generated Call-ID: 4179317446@10.2.1.166]
        CSeq: 20 INVITE
        Contact: <sip:96138_952138@10.20.14.15:5080;transport=udp>
        User-Agent: FreeSWITCH-mod_sofia/1.10.7-release+git~20220830T085235Z~cda9d15f48~64bit
        Accept: application/sdp
        Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY
        Supported: timer, path, replaces
        Allow-Events: talk, hold, conference, refer
        Content-Type: application/sdp
        Content-Disposition: session
        Content-Length: 218
        Remote-Party-ID: "96138_952138" <sip:96138_952138@10.20.14.15>;party=calling;privacy=off;screen=no
    Message Body     //消息体,内容为空

五、SIP协议建立呼叫流程

  1、用户注册:注册就是SIP客户端主动告诉软交换设备SIP客户端自己的地址,当有其他用户想要呼叫自己的时候能够顺利通知到自己。用户每次开机都需要向服务器注册,当SIP客户端的地址发生改变后也需要重新注册。注册信息必须定时刷新。

  • 用户开机首次发起注册:此时没有鉴权信息,服务器鉴权失败将返回401错误码。
  • 再次注册:客户端输入鉴权信息,再次发起REGISTER请求,服务器鉴权成功后返回200状态码,并返回注册成功的消息。

  2、通话建立:通话方式有普通方式和TLS连接方式,这相当于http和https的关系。

  • 终端A创建INVITE请求:该请求携带sdp协议内容到达网关服务器,网关会返回100 Trying的响应来告知终端A网关正在尝试连接被呼叫终端B。
  • 网关向终端B转发INVITE请求:请求到达终端B后会返回100 Trying的响应来告诉网关它已经接收到消息,正在进行处理,随后又向网关发送180 Ringing的请求表示它已经在"振铃"了。
  • 网关向终端A转发180Ringing请求:通知终端A被叫端B正在振铃,同时A在收到信息后播放回铃音。
  • 终端B在用户接听后向网关发送200 OK消息:此消息将携带sdp协议内容,网关在收到该消息后转发给终端A。
  • 终端A发送ACK请求:终端A在收到B的200OK消息后,向网关发送ACK请求,网关转发到终端B,B在收到ACK请求后,开始建立RTP(媒体传输)连接,通话正式开始。
  • 客户端挂机:任何一个终端主动挂机,都会向网关发送Bye请求,网关转发给对端。
  • 挂机确认:对端在收到Bye请求后响应200OK消息,表示挂机正常。 

六、TLS安全传输协议

  TLS(Transport Layer Security Protocol),即安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性,从而保证安全和可靠的传输。

       TLS连接在TCP链路建立之后、SIP会话开始之前建立。建立TLS连接之后,通信双方后续的数据传输就是在安全的通道中传输。

  SIP会话结束的时候,可以释放或保留TLS连接,如果连接被保留,称为TLS长连接在配置TLS加密的时候需要选择是否保留长连接。由于每次连接建立过程会比较消耗CPU性能,因此,一般一对多的通信采用TLS短连接,固定两点之间的连接,建议使用TLS长连接,如SIP中继。

七、RTP、SRTP媒体传输协议与媒体协商

  在前面的SIP通话建立过程中看到,SIP会话建立后,两个通话终端之间就可以开始传输RTP媒体流,媒体流的传输同样有普通方式(RTP)和加密传输方式传输(SRTP),双方通信时采用RTP协议还是采用SRTP协议,由通信双方协商确定。只有两端同时支持SRTP加密时,才能传输SRTP媒体流。

  SRTP使用AES算法对数据流进行加密,为了数据流的完整性和正确性,防止黑客破坏、伪造或重传过去的数据,SRTP还提供了消息认证、完整性保护和重放保护。

  双方协商媒体传输的过程称为媒体协商,媒体协商通过一种叫做SDP会话描述协议的协议来约束,是在SIP发起会话的时候进行的,前面提到在创建INVITE请求时就携带了SDP信息,SDP消息的示例如下:

      v=0
      o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
      s=SDP Seminar
      i=A Seminar on the session description protocol
      u=http://www.example.com/seminars/sdp.pdf
      e=j.doe@example.com (Jane Doe)
      c=IN IP4 161.44.17.12/127
      t=2873397496 2873404696
      m=aideo 49170 RTP/AVP 0  //传输的媒体
      m=aideo 51372 RTP/SAVP 0
      a=crypto:1 AES_CM_128_HMAC_SHA1_80  //加密算法
      inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32  //密钥信息
      a=orient: portrait

  具体参数请参阅SDP格式描述相关资料,下图是媒体协商的过程描述:

 

posted @ 2023-03-14 16:19  我若安好,便是晴天  阅读(353)  评论(0编辑  收藏  举报