SIP是VoIP的基石,相当于HTTP协议在Web服务器里的角色。如果你熟悉HTTP协议,那么你可以在SIP协议中找到许多和HTTP中熟悉的东西,例如请求头,请求体,响应码之类概念,这是因为SIP协议的设计,很大程度上参考了HTTP协议。

如果想要学习VoIP,那么SIP协议是你务必掌握敲门砖。

SIP组件

Jietu20190613-202632.jpg

  • UAC: 例如sip终端,软电话,话机
  • UAS: sip服务器
  • UA: ua既可以当做uac也可以当做uas
  • 代理服务器
  • 重定向服务器
  • 注册服务器
  • 网关
  • PSTN 公共交换电话网

SBC 边界会话控制器

sbc(session border controller)

SIP协议简介 - 图2

sip注册过程

Jietu20190613-202931.jpg

下面简化注册逻辑,省略了验证和过期等字段:

  1. 对于分机来说,注册服务器的地址是需要设置的
  2. 分机向注册服务器发请求,说:你好,注册服务器,我是8005,我的地址是200.180.1.1,以后你可以用这个地址联系我。
  3. 注册服务器回复:好的,注册成功

sip服务器的类型

image.png

代理服务器

Jietu20190613-203538.jpg

重定向服务器

Jietu20190613-203648.jpg

背靠背UA服务器

背靠背UA服务器有两个作用

  1. 隐藏网络拓扑结构
  2. 有些时候,路由无法到达,只能用背靠背UA服务器

Jietu20190613-203834.jpg

常用sip请求方法

比较常用的是下面的

Jietu20190626-182315.jpg

常用的几个是:register, invite, ack, bye, cancel。除了cancel和ack不需要认证外,其余的请求都需要认证。
register自不必说,invite和bye是需要认证的。

对于我们不信任的ua,我们不允许他们呼叫。对于未认证的bye,也需要禁止。后者可以防止恶意的bye请求,挂断正常的呼叫。

invite除了re-invite的情况,其余的都属于初始化请求,需要着重关心的。而对于bye这种序列化请求,只需要按照record-route去路由。

sip响应状态码

Jietu20190613-204117.jpg

sip对话流程图

SIP协议简介 - 图10 SIP协议简介 - 图11 从上图可以看出,从invite请求到200ok之间的信令,都经过了代理服务器。但是200ok之后的ack,确没有经过代理服务器,如果想要所有信令都经过代理服务器,需要在sip消息头record-routing 指定代理服务器的地址

请求与响应报文

Jietu20190613-204429.jpgJietu20190613-204440.jpg

image.png
image.png

事务与对话的区别

Jietu20190613-212029.jpg
重点:

  • 从INVITE请求到最终的响应(注意1xx不是最终响应,非1xx的都是最终响应)之间,称为事务。一个事务可以带有多个消息组成,并经过多个ua。
  • ack请求比较特殊,但是ack不是事务。如果被叫接通后,超时未收到主叫方的ack, 会怎样?是否会再次发送200OK
  • tcp三次握手建立连接,sip:invite->200ok->ack,可以理解为三次握手建立对话。
  • bye请求和200ok算作一个事务
  • dialog建立的前提是呼叫接通,如果呼叫没有接通,则没有dialog。
  • dialog可以由三个元素唯一确定。callId, from字段中的tag, to字段中的tag。

sip底层协议

Jietu20190613-213615.jpg

image.png

voip总体架构

Jietu20190613-213703.jpg