SIP协议的分析以及opensips注册和通话的研究
毕设题目《基于流媒体的语音视频通话系统》,基于Android实现。关于SIP协议的分析以及opensips注册和通话的研究。
本系统要基于网络进行对讲通话,SIP协议(会话发起协议)用于建立、保持、销毁会话,其功能和日常打电话的流程是一致的。SIP是完成是完成本系统要用到的核心协议。
SIP协议位于网络七层协议中的会话层,位于TCP/IP协议中的应用层。虽然没有做过验证,但是我觉得iOS上的Facetime也是基于此协议。一个手机可以绑定多个SIP地址,注册之前也是要指明要绑定的地址。只不过iOS的注册是自动完成的。
OPTIONS请求可以作为建立会话的一部分,用来查询对方的SIP能力。常见的返回值,也就是SIP执行能力:
INVITE
。用于发起SIP会话请求。ACK
。用于确认SIP请求。CANCEL
。用于取消SIP请求。OPTIONS
。用于查看对方SIP执行能力。BYE
。用于结束SIP请求。
##SIP注册
SIP协议注册到服务器的一般过程:向SIP服务器发起请求,此处为asteriskguide.com
。并发送自己的用户名,此处为8500
。此外,还要附带本机IP地址,作为将来通信使用。Contact代表的就是当前用户的通信地址,其他用户可以通过此地址联系到当前用户,实现发送呼叫请求。
我从WireShark[1]截到的图,也可以看到此通信过程,10.14.5.218
向121.199.55.106
发起注册请求REGISTER
。接着,收到了状态码,200 OK
。SIP协议的设计借鉴了HTTP,返回状态码和HTTP的相同。此处为200。
其中,中间的PUBLISH
是向服务器发送消息,告诉它我们在线[3]。
REGISTER
请求[4]:
TO
是为哪一个用户注册的。是一个完整的SIP用户的SIP URI。发出注册请求的并不一定是SIP用户本身。所以要有FROM
头域FROM
谁发起的注册,就是谁的SIP URI
Call-ID
同一个SIP客户端的Call-ID
是相同的。因为同一个sip客户端会间隔一定的时间就注册一次。在注册服务器里面用户的注册信息保留一定的时间,保存的时间并不是SIP规定的。CSeq
CSeq 值保证REGISTER 请求适当的排序。对于每个使用相同的Call-ID 的REGISTER 请求,UA 必须逐一增加Cseq 值。Expires
注册绑定时间为3600s
此处返回的状态码为200,表示注册成功。此外,相比REGISTER
还增加了Contact
,返回当前用户所有注册过的SIP URI
,我用多台设备注册过,所以返回了多个结果。
##SIP发起会话
使用WireShark绘制的连接、通信、以及断开连接的流程图更直观一些。由sip:mint@121.199.55.106:5060
向sip:ad@10.14.5.202
发送通话请求。当ad收到请求后,会立刻返回100 TRYING
响应,等一段时间之后,再返回180 RINGING
,接通之后,响应200 OK
[5]。
该图中,由mint@121.199.55.106:5060
向ad@10.14.5.202:10060
发起连接请求,内容格式是SDP描述格式,该格式内容会包含音视频传输参数和传输端口。详细内容参考下一节。
系统所用的SIP服务器是opensips。该部分的配置和使用超出了本文范围,不作详细介绍。
参考文献
- RFC3261 SIP: Session Initiation Protocol
- 使用Wireshark进行SIP包解析
- 《Building Telephony Systems with OpenSIPS 1.6》
- sip PUBLISH 与 SUBSCRIBE 方法的区别
- SIP注册过程
- sip “100 trying” instead of “180 ringing”
- SIP中SDP及其RTP的工作过程
原文链接:SIP协议的分析以及opensips注册和通话的研究,转载请注明来源!
–EOF–