SIP协议
会话初始协议(Session Initiation Protocol)是一个控制发起、修改和终结交互式多媒体会话的信令协议。
SIP是一个基于文本的协议,这一点与HTTP和SMTP类似。我们来对比一组简单的HTTP请求与SIP请求。
1 | HTTP: |
两者类似,请求均有三部分组成:在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 | freeswitch> sofia global siptrace on |