参考《sip中文参考手册.pdf》已经放在在csdn的资源里
该协议的实现在exosip和osip2两个工程里。
phapi调用了exosip的接口
SIP:会话控制协议
1.1简介
作用:
1、根据SIP帐号定位用户(IP)。
2、商讨会话(语音通话,视频连接之类)的参数(语音编码之类)。
3、建立、终止回话。
4、其他没有在qutecom中用到的功能不记。
在QuteCom项目里可以简单认为使用SIP协议做以下几件事:
1、User1向SIP服务器注册一个形如:sip:User1@xxxx.com的账号
2、User1打电话给一个用户SIP:User2@xxxx.com,此时服务器通过SIP协议找到User1的IP地址(定位)
3、服务器处理User1向User2发起的邀请(INVITE),找到用户后,通过SIP协议协商通话的参数,比如User1向User2提供了一个语音编码的选项表(G711,G723,G726,G729等等),User2收到邀请(INVITE)后查看列表和自己支持的列表,假如自己的列表首选的是G723,那么发送一个OK(200)消息给User1。这样两方就协商好了通话的音频编码为G723(或者其他)。这就是商讨会话参数
4、建立、终止会话,基本上就是打电话,接电话之类。就是发送各种消息改变通话状态。这部分内容茫茫多,将另外写一篇笔记。
特点:
1、基于文本,例如发起邀请的INVITE请求格式为:
全是字符串格式的格式,类似HTTP协议,SMTP协议。这样的好处是可读行好,解析也方便。如解读方用正则表达式就可以十分方便解析出各种参数。
1.2 INVITE格式解析
第1~12行是SIP的包头,其中第一行为请求类型(INIVITE),其后至12行为该请求的头域,格式为(xx:yy)。第13~25是该SIP包携带的SDP包(即为该SIP包的消息正文)
第1行:请求的类型(INVITE)。
第2行:VIA域指定SIP版本2.0,传输协议为UDP。包含了Alice 接收发送请求的服务器地址(pc33.atlanta.com)。同样这个包含了一个分支参数来标志Alice和这个服务器的会话事务。
第3行和第4行:指定发起者和接收者。
第5行:Call_ID 包含一个全局的唯一标志,用来唯一标志这个呼叫,通过随机字串和softphone的自己名字或者IP地址混和产生的。通过TO TAG, FROM TAG 和CALL-ID 完整定义了Alice和Bob之间的端到端的SIP 关系,并且表示这个是一个对话性质的关系。
第6行:CSEQ 或者Command Sequence 包含了一个整数和一个请求名字。这个Cseq 数字是顺序递增的。每当对话中发起一个新的请求都会引起这个数字的顺序递增。
第7行:服务器,IP:Port
第8行:Content-Type: application/sdp 表示该SIP消息携带的消息正文类型为sdp包。
第9行:Max-Forwards规定了最大转发数量,它通讯中本消息转发的最大次数,每转发一次减一。这个可以不理他。
第10行:User-Agent,用户客户端描述。这里说明客户端是Linphone版本为3.2.1 使用的eXosip2库版本为3.3.0。这个可以是wengophone/qutecom等等。
第11行:Subject: Phone call。说明这个SIP包的主题是一个Phone Call。这个可以不理它。
地12行:Content-Length: 315 表示该SIP消息携带的内容的长度为315字节
第18行代表的所负载类型 m=audio 表示负载是声音数据,
7078 RTP/AVP 表示使用RTP传输,发起方RTP端口7078.
111,110,0,3,8,101是负载的编码/解码方式的数字表示。
第19~23表示对应(111,110,0,3,8,101)的具体格式。
18~23行给对方提出选项,对方可以选择其中之一codec用于建立会话。如对方可以选择GSM作为语音编码作为双方的编码。这就是SIP的“会话协商”功能。
"a=rtpmap:3 GSM/8000/1"的具体意义如下
3:代表RTP负载GSM的数字代码。
GSM:类型描述
8000:语音数据取样率8kHz
1:单声道
特别注意18~23行的编码选项:如果对方不支持里面的codec之一则无法建立通话。