SIP协议入门指南
前置声明:本文是本人关于 SIP 资料的一个梳理结果,80%的内容都是摘自各个参考资料的一部分,20%是自己在 12-14 年间 SIP 相关工作的理解感悟,然后根据自己拟定的目录大纲进行整合。本文所有版权不归我,如有侵权,请告知,必删。
为什么要写这么一篇文章?
我司(Legrand)核心产品是楼宇视频对讲设备,在业界的名气还不错。
视频通 话或者视频会议技术栈通常是 SIP 标准协议,我们当然也不例外。
自从我专做 iOS 开发之后,我就很久不玩 SIP 了,但是这些 SIP 的东西还是没有完全忘记。最近领导给我们开了 Q2 业绩会,提出老旧系统改造,包括 SIP Server 升级,NAT 打洞啊,目的是为了提高系统的稳定性,节省服务器的资源开销。
这些工作跟我没啥关系,因为我不做服务器,但是勾起了我多年的回忆。随即产生一个想法,就是给当年完全不懂 SIP 的自己写一篇入门文章,当做是对自己过去工作、技术的一个总结。
OK,废话不多数,正文开始。
SIP 的概念
SIP,英文全称 Session Initiation Protocol,中文翻译叫会话初始协议,是一个控制发起、修改和终结交互式多媒体会话的信令协议。它是由 IETF(Internet Engineering Task Force,Internet 工程任务组)定义的,最早发布于 1999 年 3 月的 RFC 2543,后来在 2002 年 6 月发布了新的标准 RFC 3261。
SIP 是一个基于文本的协议,在这一点上与 HTTP 和 SMTP 相似,易于读取和调试。
SIP URI
我们来对比一个简单的 SIP 请求与 HTTP 请求:
- SIP:
INVITE sip:alice@sipserver.com SIP/2.0
- HTTP:
GET /index.html HTTP/1.1
在 HTTP 中, 请求由三部分组成,GET
指明一个获取 资源(文件)的动作,而 /index.html
则是资源的地址,最后是协议版本号。而在 SIP 中,同样也有三部分,INVITE
表示发起一次请求,alice@sipserver.com
为请求的地址,称为 SIP URI,最后也是版本号。
其中,SIP URI 很类似一个电子邮件,其格式为“协议:名称@主机”。与 HTTP 和 HTTPS 相对应,有 SIP 和 SIPS,后者是加密的;名称可以是一串数字的电话号码,也可以是字母表示的名称;而主机可以是一个域名,也可以是一个 IP 地址。
对等协议
SIP 是一个对等的协议,类似 P2P。不像传统电话那样必须有一个中心的交换机,它可以在不需要服务器的情况下进行通信,只要通信双方都彼此知道对方地址(或者,只有一方知道另一方地址)。
例如,bob 的 IP 地址是 192.168.1.10,端口是 5000,alice 的 IP 地址是 192.168.1.11,端口是 6000。当 bob 呼叫 alice 时,他只需要直接呼叫 alice 的 SIP 地址:sip:alice@192.168.1.11:6000
,反过来 alice 呼叫 bob 时,只需要呼叫 bob 的 SIP 地址:sip:bob@192.168.1.10:5000
。
下面是 bob 呼叫 alice 的完整流程:
bob alice
| |
| INVITE |
|-------------------->|
| 100 Trying |
|<--------------------|
| 180 Ringing |
|<--------------------|
| 200 OK |
|<--------------------|
| ACK |
|-------------------->|
| |
|<---RTP------------->|
|<---RTP------------->|
|<---RTP------------->|
| ... |
| |
| BYE |
|<--------------------|
| 200 OK |
|-------------------->|
| |
UA
在 SIP 网络中,alice 和 bob 都叫做用户代理(UA, User Agent)。UA 是在 SIP 网络中发起或响应 SIP 处理的逻辑功能。UA 是有状态的,也就是说,它维护会话(或称对话)的状态。
UA 有两种功能:一种是 UAC(UA Client 用户代理客户端),它是发起 SIP 请求的一方,如 bob。另一种是 UAS(UA Server),它是接受请求并发送响应的一方,如 alice。由于 SIP 是对等的,如果 alice 呼叫 bob 时(有时候 alice 也主动叫 bob 一起吃饭),alice 就称为 UAC,而 bob 则执行 UAS 的功能。一般来说,UA 都会实现上述两种功能。
Proxy Server
设想 bob 和 alice 是经人介绍认识的,而他们还不熟悉,bob 想请 alice 吃饭就需要一个中间人(M)传话,而这个中间人就叫代理服务器(Proxy Server)。
Redirect Server
还有另一种中间人叫做重定向服务器(Redirect Server),它类似于这样的方式工作 ── 中间人 M 告诉 bob,我也不知道 alice 在哪里,但我老婆知道,要不然我告诉你我老婆的电话,你直接问她吧,我老婆叫 W。这样,M 就成了一个重定向服务器,而他老婆 W 则是真正的代理服务器。这两种服务器都是 UAS,它们主要是提供一对欲通话的 UA 之间的路由选择功能。具有这种功能的设备通常称为边界会话控制器(SBC,Session Border Controller)。
Register Server
还有一种 UAS 叫做注册服务器。试想这样一种情况,alice 还是个学生,没有自己的手机,但它又希望 bob 能随时找到她,于是当她在学校时就告诉中间人 M 说她在学校,如果有事打她可以打宿舍的电话;而当她回家时也通知 M 说有事打家里电话。只要 alice 换一个新的位置,它就要向 M 重新“注册”新位置的电话,以让 M 能随时找到她,这时候 M 就是一个注册服务器。
Alice SIP Server
| |
| REGISTER |
|------------------------------->|
| SIP/2.0 401 Unauthorized |
|<-------------------------------|
| REGISTER |
|------------------------------->|
| SIP/2.0 200 OK |
| |