1.SIP协议基础
会话初始协议,一个控制发起,修改和终结交互式多媒体会话的信令协议
1) HTTP与SIP协议基础
HTTP:
GET /index.html HTTP/1.1
GET
获取资源的动作
/index.html
资源地址
HTTP/1.1
协议版本号
sip:
INVITE sip:seven@freeswitch.org.cn SIP/2.0
INVITE
发起一次呼叫请求
seven@freeswitch.org.cn
请求的地址,SIP URI-->协议:名词@主机
SIP/2.0
版本号
2) SIP的基本概念和相关元素
点对点通信
SIP是一个对等的协议,可以在不需要服务器的情况下进行通信,只要知道一方的地址
Bob给Alice发送一个INVITE请求
Alice和Bob都称为用户代理(User Agent,UA)
UA分两种:一种是UAC,发起方;UAS,接收方
代理服务器
设想Bob和Alice经人介绍,他们还不熟悉,Bob想请Alice吃饭就要一个中间人M传话,
M就是代理服务器(Proxy Server)
注册服务器
Alice没有手机,但它希望Bob随时找到她,她就告诉中间人M,
有事可以打宿舍固定电话,或家里电话,姥姥家电话...
每次换新位置,重新向M注册,让M随时找到她
背靠背用户代理(Back-to-Back UA,B2BUA)
FreeSwitch就是一个典型的B2BUA
M与W是一对夫妻,Bob认识M,Alice认识W,MW有意撮合Alice,Bob
但两个人太腼腆没有互留电话,
Bob想知道Alice对他感觉,就打电话问M,M问W,W打电话给Alice
Alice告诉W,W告诉M,M转给Bob
MW一个面向Bob一个面向Alice,称为B2BUA
3) SIP基本方法
REGISTER
注册联系信息
INVITE
初始化一个会话,发起一个呼叫
ACK
对INVITE消息的最终响应
CANCEL
取消一个处理的请求
BYE
终止一个会话
OPTIONS
查询服务器和能力
2.SIP注册
Alice可能在学习,可能在家,可能在世界任意个角落,只要能上网,就能与全世界通信
她作为被叫方,为了让Freeswitch随时找到她,她需要向Freeswitch注册
Alice向Freeswitch发起注册请求,
Freeswitch返回401,对Alice发起Chalenge
Alice将自己的用户名密码与收到的Chalenge进行计算,将加密结果赋到下一个REGISTER请求
Freeswitch收到后对Alice信息对比,匹配则认证通过
3.SIP呼叫流程
1) UA间直接呼叫
当Bob呼叫Alice时,直接呼叫Alice的SIP地址,sip:Alice@192.168.4.4:5090
Bob向Alice发送INVITE建立SIP会话,
Alice的UA回100Trying消息,表示收到请求,先等一会
Alice开始振铃 ,并发给Bob180
Bob接收到消息后,开始播放回铃音,提示Bob正在振铃
Alice接了电话,发送200给Bob
Bob收到200向Alice回ACK证实消息,完成三次握手,一个事务
Bob与Alice通话了,他们通话的内容(语音数据)在SIP之外的RTP包传递
最后Alice挂断电话,向Bob发送BYE,
Bob收到BYE,回200OK,通话完成
请求消息:
1xx
临时状态,表明呼叫进展情况
2xx
请求成功收到
3xx
重定向,转向另一个UAS处理
4xx
请求失败,一般是客户端或网络引起
密码错误,空号
5xx
服务器内部错误
6xx
全局性错误
2) 通过B2BUA呼叫
真实世界Bob和Alice经常改变位置,他们的SIP地址会发生变化,
所以,他们通常借助一个服务器来实现通信,这样Bob和Alice通过注册到服务器获得服务器的公有SIP地址
注册服务器的地址是不变的,因此他们的SIP地址就不会改变,
Bob和Alice注册到Freeswitch,分别获得服务器的地址: sip:Bob@192.168.4.4和sip:Alice@192.168.4.4
Bob呼叫Alice
Bob向Freeswitch发送INVITE,请求建立一个呼叫
Freeswitch作为一个UAS接受请求并响应,他先通过100Trying通知Bob接收到他的请求
此时Freeswitch发现它不认识Bob,不确定Bob有没有权限发起呼叫,它向Bob发送407确定身份
Bob回送ACK证实消息向Freeswitch证实收到认证,INVITE事务结束
Bob重新发送INVITE,附带Proxy-Authorization验证消息,该INVITE重新开始一个事务
Freeswitch收到INVITE后,重新回送100Trying,通知Bob呼叫进展
Freeswitch对Bob的认证消息进行验证,发现Bob是本地授权用户,可以继续呼叫,Bob与Freeswitch通信建立,形成一个Channel
路由阶段
Freeswitch根据路由,发现Bob呼叫Alice,它需要建立另一条腿呼叫Alice
Freeswitch通过查找本地数据库,得到Alice的位置,启动UA,向Alice发送一个新的INVITE消息
该INVITE的Call-ID与上次INVITE的不同,这是另一个SIP对话,
消息中多了一个Remote-Party-ID,用来支持主叫号码显示,SIP通话不仅显示电话号码,还显示可选的名字(Bob)
Alice回送100Trying通知Freeswitch它收到INVITE请求,正准备下一步处理
Alice不需要对Freeswitch进行认证,它直接响铃,并向Freeswitch发送180Ringing,通知Freeswitch Alice开始振铃
直接回180, Bob的话机会自己产生一个回铃音,播放给Bob,提示Bob对方正在振铃
回183消息, 183包含媒体SDP,这时 Freeswitch就会产生一个回铃音,通过RTP发送给Bob,Bob的话机不需要自己再产生回铃音,彩铃
Alice听到电话响了, 接起电话, 话机给Freeswitch发送200OK,表示Alice接听
Freeswitch向Alice回送ACK证实消息,证实它接收到200 OK,Freeswitch与Alice通话建立完毕
Freeswitch立即向Bob发送200 OK消息,切断回铃音,接入Alice声音
Bob通过ACK消息通知Freeswitch收到200
通话进稳定阶段,不再有SIP消息交互,所有的语音数据都在RTP传送
Alice挂断电话,她的话机向Freeswitch发送BYE消息,通知Freeswitch拆线
Freeswitch回送200 OK,并释放b-leg
Freeswitch也给Bob发送BYE消息, 通知Bob要拆线,它还包含了挂机原因(Hangup Cause)
NOMAL_CLEARING: 表示正常释放
Bob话机回送200 OK,Freeswitch收到后,也释放a-leg,通话结束
4.深入理解SIP
1) SIP URI
除了使用SIP地址外, 也可以使用域名,如sip:Alice@freeswitch.org.cn
Bob呼叫Alice, Bob是主叫方,他知道服务器的地址,可以直接给服务器发送INVITE, 它不需要注册,
Alice不同, 作为被叫方,为了让服务器能找到它, 必须事先通过REGISTER注册到服务器上
2) SDP和SOA
SIP负责建立和释放会话
会话包含相关的媒体,如视频和音频.
媒体数据由SDP描述
会话建立时,需要媒体协商, 双方才能确定对方的媒体能力以交互数据
Bob呼叫Freeswitch
Freeswitch收到INVITE后, 进行编码协商, SDP携带了Freeswitch协商后的编码PCMA 以及"a=ptime"
ptime表示RTP数据的打包时间,默认20ms
Bob在INVITE中提议: 我支持PCMA,PCMU和ILBC,你看我们用什么通信?
Freeswitch在 200OK 中回复: 我们用PCMA吧
3) 3PCC
第三方电话呼叫控制, 由第三方控制着在另外两者之间建立的一个会话, 由控制着负责会话双方的媒体协商
4) SIP承载
HTTP用TCP承载
SIP支持TCP和UDP承载, RFC3261规定, 任何SIP UA必须同时支持TCP和UDP, 我们常见的SIP都是用UDP承载的
UDP是面向无连接的, 在大并发量的情况下与TCP相比可以节省TCP由于每个IP包需要确认带来的额外开销,
SIP over Web-Socket
当前有些浏览器如Chrome, FireFox实现了WebSocket, 可以通过它承载SIP, 意味着浏览器与普通SIP话机进行音频, 视频通话
5.小结
Freeswitch是一个B2BUA
打开SIP消息的命令
sofia global siptrace on
消息太多
执行fs_cli连接到Freeswitch,打开sip-trace,打一个测试电话后立即用Ctrl D退出fs_cli,慢慢分析
关闭trace
sofia global siptrace off
来源张永光的博客