0%

FreeSWITCH权威指南(四)

SIP协议

会话初始协议(Session Initiation Protocol)是一个控制发起、修改和终结交互式多媒体会话的信令协议。

SIP是一个基于文本的协议,这一点与HTTP和SMTP类似。我们来对比一组简单的HTTP请求与SIP请求。

1
2
3
4
5
HTTP:
GET /index.html HTTP/1.1

SIP:  
INVITE sip:seven@freeswitch.org.cn SIP/2.0

两者类似,请求均有三部分组成:在HTTP请求中,GET指明一个获取资源(文件)的动作,/index.html则是资源的地址,最后HTTP/1.1是协议版本号;而在SIP中,INVITE表示发起一次呼叫请求,seven@freeswitch.org.cn为请求的地址,也称为SIP URI或AOR(Adress of Record,用户的公开地址),第三部分的SIP/2.0也是版本号。其中,SIP URI类似一个电子邮件地址,其格式为“协议:名称@主机”。这里SIP URI格式中的“协议”与HTTP和HTTPS相对应,也有SIP和SIPS两种(后者是加密的,如sips:seven@freeswitch.org.cn);“名称”可以是一串数字的电话号码,也可以是字母表示的名称;而“主机”可以是一个域名,也可以是一个IP地址。

SIP的基本概念和相关元素

用户代理(User Agent,UA),UA是在SIP网络中发起或响应SIP处理的逻辑实体。

UA是有状态的:

  • UAC(UA Client),它是发起SIP请求的一方

  • UAS(UA Server),它是接受请求并发送响应的一方

一般来说,UA都会实现上述两种功能。

背用户代理(Back-to-Back UA,B2BUA),FreeSWITCH就是一个典型的B2BUA。

边界会话控制器(Session Border Controller,SBC)。它主要位于一堆SIP服务器的边界,用于隐藏内部服务器的拓扑结构、抵御外来攻击等。SBC可能是一个代理服务器,也可能是一个B2BUA。

一般来说,SBC具有两个或多个网络接口卡(网卡),一边连接互联网,一边连接内部的网络。从互联网上对内部SIP服务器的访问只能经过SBC,因而这种拓扑结构能从一定程序上保证内部SIP服务器的安全。其他的部署模式还包括更高级别的防火墙设备,以及把SBC设备放在网络拓扑结构的防火区(DMZ)中等,以最大限度保证安全。

SIP协议的基本方法和头域简介

SIP状态码

  • 1xx组的响应为临时状态,表明呼叫进展的情况;

  • 2xx表明请求已被成功收到、理解和接受;

  • 3xx为重定向,表明SIP请求需要转向到另一个UAS处理;

  • 4xx表明请求失败,这种失败一般是由客户端或网络引起的,如密码错误、空号等,客户端应该重新修改请求,然后重发;

  • 5xx为服务器内部错误,表明服务器出错,不能响应合法的请求;

  • 6xx为全局性错误,如600 Busy Everywhere。
    状态码后面跟着一个原因短语(如200 OK中的OK及刚才讲到的Busy Everywhere),它是对前面的状态码的一个简单解释。

SIP承载

HTTP是用TCP承载的,而SIP则支持TCP和UDP承载。事实上,RFC3261规定,任何SIP UA必须同时支持TCP和UDP 。我们常见的SIP都是用UDP承载的,由于UDP是面向无连接的,在大并发量的情况下与TCP相比可以节省TCP由于每个IP包都需要确认带来的额外开销 。不过,在SIP包比较大的情况下,如果超出了IP层窗口的大小(通常是1500),在经过路由器的时候可能会被拆包,使用UDP承载的SIP消息就可能发生丢失、乱序等,这时候就应该使用TCP。
在需要对SIP加密的情况下,可以使用TLS 。TLS是基于TCP的。

在新的网络时代,又出了一个新的草案,称为SIP over WebSocket

SDP

媒体数据是由SDP(Session Description Protocol,会放描述协议)描述的。SDP一般不单独使用,它与SIP配合使用时会放到SIP协议的正文(Body)中。

媒体流的协商过程称为SOA(Service Offer and Answer,提议/应答)。通俗地讲,它首先由一方提供支持的Codec类型,由另一方选择。

SIP抓包

1
2
3
freeswitch> sofia global siptrace on

freeswitch> sofia global siptrace off