zoukankan      html  css  js  c++  java
  • SIP协议学习笔记

    友情提示:初次接触SIP(Session Initiation Protocol)协议的同学,强烈建议先将文末参考文章中的链接,先看至少二遍!
     
    一、SIP协议是一个文本协议
    言外之意:不同于二进制难以阅读,SIP是仅凭肉眼就能看懂大意的协议。来一个示例:
     
    INVITE的请求示例:
    INIVTE sip:jerry@california.tel.com
     Via: SIP/2.0/UDP[4444::2:3:4:5];branch=8ulse1
     Route:<sip:[5555::a:b:c:d];lr>
     Route:<sip:telcomx@scscf1.tel.com;lr>
     Contact:<sip:[4444::2:3:4:5]:1537>
     From:<sip: tom@telcomx.tel.com>;tag=6e87wa9
     To:<sip: jerry@california.tel.com>
     Call-ID: apb03a0s09dkjdfoaidy49555
     CSeq: 1 INVITE
     Max-Forwards: 70
     Content-Length:183
    (必须的空行)
    (SDP 请求消息体)
    

    注:类似HTTP协议有GET/POST/PUT/DELETE等基本操作一样,SIP中有INVITE/BYE/REGISTER等操作,INVITE通常用于A向B发起呼叫。

    第2行,表示是这SIP协议,版本为2.0,采用UDP协议传输。

    INVITE的响应示例:

    SIP/2.0 183 Session in Progress 
     Via: SIP/2.0/UDP scscf2.california.tel.com;branch=12fd3 
     Via: SIP/2.0/UDP icscf2.california.tel.com;branch=24re3 
     Via: SIP/2.0/UDP scscf1.tel.com;branch=64w32 
     Via: SIP/2.0/UDP pcscf1.tel.com;branch=412d2 
     Via: SIP/2.0/UDP[4444::2:3:4:5];branch=8ulse1 
     Route-Route:<sip pcscf2.california.tel.com;lr> 
     Route-Route:<sip scscf2.california.tel.com;lr> 
     Route-Route:<sip scscf1.tel.com;lr> 
     Route-Route:<sip pcscf1.tel.com;lr> 
     Route:<sip:telcomx@scscf1.tel.com;lr> 
     Contact:<sip:[4444:5:6:7:8]:1078> 
     From:<sip: jerry@california.tel.com>;tag=e42q14d 
     To:<sip: tom@telcomx.tel.com>;tag=6e87wa9 
     Call-ID: apb03a0s09dkjdfoaidy49555 
     CSeq: 2 183 
     Max-Forwards: 70 
     Content-Length:165 
    (必须的空行)
    (SDP 请求消息体)
    

     
    二、SIP协议所处的位置

    下面是从网上淘来的一张图

    可以看到,SIP跟HTTP一样,属于应用层协议。SIP下层即可使用UDP,也可以使用TCP。

    三、相关术语

    3.1 UAC/UAS

    UAC 即User Agent Client 通常指发起呼叫的应用。UAS 即User Agent Server 通常指被叫端,主要负责接受、重定向或者拒绝请求,给到来的请求发送响应。UAC与UAS是一个相对的概念,当某个SIP终端(比如:软电话应用)向外拨打时,它就是UAC,而反过来,对方打电话给它,它变成被叫时,就是UAS。

    3.2 Register Server 

    通常SIP终端(不管是软电话还是硬话机)使用前,要先向某个服务器,发出REGISTER请求注册自己,负责处理REGISTER请求的服务器,即为Register Server。

    打个比方:某老板很忙,是一个空中飞人,经常来去不定,每次出行前只告诉助理自己的联系方式,别人要找他,必须先问助理:老板在哪?怎么联系?助理相当于就是Register Server.

    3.3 Location Server

    用于跟踪用户位置,Location Server与Register Server只是逻辑上的划分,通常都由一个物理实体充当2种角色。

    3.4 Proxy Server

    负责接收和转发 SIP 请求,如果有需要,也可以解析并修改SIP部分信息,但是不允许影响请求或会话的状态。

    打个比方:张三要追李四的闺蜜,但是不知道怎么联系,李四说对他说,你写个情书,我帮你转交给她,这事儿包在我身上,这时候李四就是张三的Proxy Server.

    3.5 Redirect Server

    将请求的地址映射成新地址,对请求进行重定向,与Proxy Server的区别在于不转发INVITE。

    还是刚才那个比方:张三要追李四的闺蜜,不知道怎么联系,李四说,我把闺蜜的微信号给你,你自己去加好友吧,成不成得靠你自己,我只能帮你到这儿了。这时候李四只是张三的Redirect Server,最终INVITE发起请求,还是张三自己来。

    3.6 B2BUA

    所谓的Back To Back User Agent (背靠背用户代理)。简单点讲,这是UAC+UAS的合体,FreeSwitch就是一个B2BUA的经典案例。

    把上述术语都画到一张图里,感受下:

    四、SIP请求方法列表及响应码含义

    请求名称 含义 参考协议
    REGISTER 将URI注册到Location服务器  RFC 3261
    INVITE  发起电话呼叫  RFC 3261
    ACK  确认INVITE请求  RFC 3261 
    BYE  挂断电话  RFC 3261
    CANCEL  取消Pending中的请求  RFC 3261
    OPTIONS    RFC 3261
    SUBSCRIBE  订阅事件  RFC 6665
    NOTIFY  通知事件  RFC 6665
    PRACK  临时确认  RFC 3262
    UPDATE    RFC 3311
    MESSAGE 发送文本消息  RFC 3428
    REFER    RFC 3515
    PUBLISH    RFC 3903
    INFO    RFC 6086

     常见响应码:

    分类 代码 含义  最终状态?
    1xx   临时应答   No
      100 试呼叫(Trying)  
      180 振铃(Ringing)  
      181 呼叫正在前转(Call is Being Forwarded)  
    2xx   会话成功  Yes
      200 成功响应(OK)  
    3XX   重定向  Yes 
      302 临时迁移(Moved Temporarily)  
    4xx   请求失败 Yes 
      400 错误请求(Bad Request)  
      401 未授权(Unauthorized)  
      403 禁止(Forbidden)  
      404 用户不存在(Not Found)  
      408 请求超时(Request Timeout)  
      480 暂时无人接听(Temporarily Unavailable)  
      486 线路忙(Busy Here)  
    5xx   服务器错误 Yes 
       504 服务器超时(Server Time-out)  
    6xx   全局错误 Yes 
       600 全忙(Busy Everywhere)  
     
    参考文章:

  • 相关阅读:
    WEB引入Google思源黑体
    Linux安装最新版Node.js
    JS判断值是否是数字
    高效jQuery的奥秘
    一个Web前端工程师或程序员的发展方向,未来困境及穷途末路
    javascript 模块化 (切记:学习思想)
    学习 正则表达式 js java c# python 通用
    Promise如何解决回调地狱
    VSCode 开发插件 推荐
    js移动端自适应动态设置html的fontsize
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/sip-protocal.html
Copyright © 2011-2022 走看看