• 【电话交换】SIP协议笔记


    一、协议介绍

    SIP(SessionInitiationProtocol,会话发起协议)是由IETF提出的IP电话信令协议.它的主要目的是为了解决IP网中的信令控制,以及同软交换的通信,从而构成下一代的增值业务平台,对电信、银行、金融等行业提供更好的增值业务。

    SIP协议是一种基于文本的类似于HTTP的协议,报文结构与HTTP也一样,即包括请求行,头域字段,body。报文结构如下:

    start-line
    message-header
    CRLF
    [ message-body ]

    1、 start-line

    分请求行和状态行。

    请求行由请求类型、请求目的地址和协议版本号构成。

    请求类型有:INVITE,ACK,OPTIONS,BYE,CANCEL和REGISTER。

    状态行是被叫方向主叫方返回的状态信息,如1xx,2xx,3xx,4xx,5xx,6xx。

    请求类型:

    INVITE:用于发起呼叫请求。INVITE消息包括消息头和数据区两部分。INVITE 消息头包含主、被呼叫的地址,呼叫主题和呼叫优先级等信息。数据区则是关于会话媒体的信息,可由会话描述协议SDP 来实现。

    BYE:当一个用户决定中止会话时,可以使用BYE 来结束会话。

    OPTIONS:用于询问被叫端的能力信息,但OPTIONS 本身并不能发起呼叫。

    ACK:对已收到的消息进行确认应答。

    REGISTER:用于用户向SIP服务器传送位置信息或地址信息。

    CANCEL:取消当前的请求,但它并不能中止已经建立的连接。

    状态类型:

    1xx:临时消息:表示表示请求消息已经收到,后面将继续处理该请求。

    2xx:成功消息:表示请求已经被成功的理解、接受或执行。

    3xx:重定向消息:表示为了完成请求还需采取更进一步的动作。

    4xx:客户机错误:表示该请求含有语法错误或在这个服务器上不能被满足。

    5xx:服务器错误:表示该服务器不能处理一个明显有效的请求。

    6xx:全局性故障:表示该请求在任何服务器上都不能被实现。

    2、message-header

    常见消息头说明:

    TO:格式:TO:显示名<接收者URI>;tag=n;显示名和tag可选。接收者URI是SIP网络种唯一标识接收终端的标识符。例:TO:DENNY<SIP:caller@WORK.COM>;TAG=11111 或 TO:sip:caller@work.com

    FROM: 消息头FROM给出标识会话发起者的URI。比如:FROM:sip:caller@work.com;tag=hyh8。tag是必需的。

    CALL-ID: 用于全局唯一标识正在建立的会话的标识符。 随机数加UAC标识信息。

    CSeq: 用于标识同一会话中不同事务的序号,通常由一个用作序号的整型数和消息类型组成。整个会话操作过程由不同的事务组成,每一事务所涉及的消息的CSeq序号必须相同。

    Via:为响应消息提供传输路径,当请求消息经过每一跳节点时,每一跳节点都把自身的IP地址信息放入顶层Via中。响应消息则沿着请求消息记录下的传输路径反向传输,首先移走指明自身IP地址信息的顶层消息头

    3、 message-body

    SIP协议一个最主要的作用就是协商媒体信息。媒体信息通过message-body携带,基于SDP会话描述协议。

    对于PSTN语音编码格式,主要有G711A、G711U、G729等。

    SIP协商中主叫方会带上自己支持的所有音频编码列表到被叫方,被叫方一般在回铃时从主叫支持的类型中选出一种或多种自己支持的编码,返回主叫后,双人按顺序选出第一个支持的编码。

    二、流程举例

    (1) UAC发起register请求到UAS

    (2) UAS如果需要验证账号信息,响应一个401 Unauthorized,其中包含用于密码加密的随机字符串

    (3) UAC收到401后携带自己的账号信息(其中密码经过md5加密)重新发起一个register请求

    (4) 服务器校验通过后返回200OK

    (5) UAC发起invite请求,其中携带了主被叫等信息(From、To头域等)

    (6) UAS一般会马上响应100trying告诉UAC正在尝试呼叫被叫

    (7) 被叫响应后UAS返回180到UAC,其中可能携带彩铃媒体信息到UAC

    (8) 被叫接听后返回200给UAC,其中可能携带会话媒体信息到UAC

    (9) UAC返回ack到UAS确认收到200

    三、重要头域解释

    对于UAC或UAS来说,Sip协议是一种有状态的协议,同一个会话的前后相关的信令必须送到相同的UAC或UAS。Sip协议的via、record-route头域正是用于用来指示路由的字段。

    其中几个相关字段说明如下:

    via用于指示response返回的路径,不会影响后续request。

    record-route用于指示同一callid后续请求的路径。

    rport是接收方收到via为内网的请求时,加上 自己看到的发送方的ip(received)和端口(rport),用于NAT。

    四、Sip测试工具

    SIPp是sip协议栈的一个免费开源的测试工具, 它模拟了一些基本的uac和uas功能,并建立和释放多个调用的INVITE和BYE的方法,可以读取xml和csv文件生成注册或呼叫流程,可以动态显示统计信息和动态调整呼叫速率。

    模拟UAS:./sipp -sn uas -i 192.168.1.249 -p 5077 //监听5077端口

    模拟UAC:./sipp -sn uac 192.168.1.249:5077 -i 192.168.1.249 -p 5078 -r 50 -rp 1000 //每1000ms发送50个呼叫

    SIPp还支持使用脚本文件来自定义模拟的UAC或UAS的行为,具体可参考官网文档:http://sipp.sourceforge.net/index.html

    五、协议开发

    常见协议栈有:

    1、pjsip:http://www.pjsip.org/

    2、sofia:http://sofia-sip.sourceforge.net/

    3、osip:https://www.gnu.org/software/osip/

    【参考链接】

    https://blog.csdn.net/huangyifei_1111/article/details/122865544
    https://cloud.tencent.com/developer/article/1183318
    https://cloud.tencent.com/developer/article/1733809
    http://sofia-sip.sourceforge.net/refdocs/building.html
    https://www.packetizer.com/rfc/rfc5359/

  • 相关阅读:
    osgEarth学习
    《C++ Primer》 第12章 类
    C++中 指针与引用的区别
    C++ primer笔记第15章 面向对象编程
    Pandas数据去重和对重复数据分类、求和,得到未重复和重复(求和后)的数据
    Python转页爬取某铝业网站上的数据
    使用Nginx+Tomcat实现分离部署
    使用icomoon字体图标详解
    如何配置PetShop网站
    nopcommerce开源框架技术总结如何实现把controller中的Model的数据传入VIEW中,并生产相应的Html代码
  • 原文地址:https://www.cnblogs.com/opensmarty/p/16400354.html
Copyright © 2020-2023  润新知