友情提示:初次接触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服务器 | |
INVITE | 发起电话呼叫 | |
ACK | 确认INVITE请求 | |
BYE | 挂断电话 | |
CANCEL | 取消Pending中的请求 | |
OPTIONS |
| |
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) |
|
作者:菩提树下的杨过
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。