SIP是VoIP的基石,相当于HTTP协议在Web服务器里的角色。如果你熟悉HTTP协议,那么你可以在SIP协议中找到许多和HTTP中熟悉的东西,例如请求头,请求体,响应码之类概念,这是因为SIP协议的设计,很大程度上参考了HTTP协议。
如果想要学习VoIP,那么SIP协议是你务必掌握敲门砖。
SIP组件
- UAC: 例如sip终端,软电话,话机
- UAS: sip服务器
- UA: ua既可以当做uac也可以当做uas
- 代理服务器
- 重定向服务器
- 注册服务器
- 网关
- PSTN 公共交换电话网
SBC 边界会话控制器
sbc(session border controller)
sip注册过程
下面简化注册逻辑,省略了验证和过期等字段:
- 对于分机来说,注册服务器的地址是需要设置的
- 分机向注册服务器发请求,说:你好,注册服务器,我是8005,我的地址是200.180.1.1,以后你可以用这个地址联系我。
- 注册服务器回复:好的,注册成功
sip服务器的类型
代理服务器
重定向服务器
背靠背UA服务器
背靠背UA服务器有两个作用
- 隐藏网络拓扑结构
- 有些时候,路由无法到达,只能用背靠背UA服务器
常用sip请求方法
比较常用的是下面的
常用的几个是:register, invite, ack, bye, cancel。除了cancel和ack不需要认证外,其余的请求都需要认证。
register自不必说,invite和bye是需要认证的。
对于我们不信任的ua,我们不允许他们呼叫。对于未认证的bye,也需要禁止。后者可以防止恶意的bye请求,挂断正常的呼叫。
invite除了re-invite的情况,其余的都属于初始化请求,需要着重关心的。而对于bye这种序列化请求,只需要按照record-route去路由。
sip响应状态码
sip对话流程图
从上图可以看出,从invite请求到200ok之间的信令,都经过了代理服务器。但是200ok之后的ack,确没有经过代理服务器,如果想要所有信令都经过代理服务器,需要在sip消息头record-routing 指定代理服务器的地址
请求与响应报文
事务与对话的区别
重点:
- 从INVITE请求到最终的响应(注意1xx不是最终响应,非1xx的都是最终响应)之间,称为事务。一个事务可以带有多个消息组成,并经过多个ua。
- ack请求比较特殊,但是ack不是事务。如果被叫接通后,超时未收到主叫方的ack, 会怎样?是否会再次发送200OK
- tcp三次握手建立连接,sip:invite->200ok->ack,可以理解为三次握手建立对话。
- bye请求和200ok算作一个事务
- dialog建立的前提是呼叫接通,如果呼叫没有接通,则没有dialog。
- dialog可以由三个元素唯一确定。callId, from字段中的tag, to字段中的tag。