首页 > 学院 > 开发设计 > 正文

7.sip协议

2019-11-06 08:54:38
字体:
来源:转载
供稿:网友

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,称为B2BUA3) SIP基本方法 REGISTER 注册联系信息 INVITE 初始化一个会话,发起一个呼叫 ACK 对INVITE消息的最终响应 CANCEL 取消一个处理的请求 BYE 终止一个会话 OPTIONS 查询服务器和能力

2.SIP注册

Alice可能在学习,可能在家,可能在世界任意个角落,只要能上网,就能与全世界通信她作为被叫方,为了让Freeswitch随时找到她,她需要向Freeswitch注册Alice向Freeswitch发起注册请求,Freeswitch返回401,对Alice发起ChalengeAlice将自己的用户名密码与收到的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
上一篇:BZOJ1110[砝码Odw]题解

下一篇:6.拨号计划

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表