频道栏目
首页 > 网络 > 网络协议 > 正文

SIP协议学习2

2013-10-29 13:44:16            作者:makezwl
收藏   我要投稿

SIP协议学习2
 

一、    在windows下利用vc6.0编译pjsip源码

首先阅读文档readme.txt,查找在win32平台源码的编译方法。自己总结方法如下:

a.设置pjsua为当前活动工程

b.因为编译的时候提醒缺少config_site.h文件,所以在pjlib/include/pj/下新建一个空的config_site.h文件。

c. 提醒找不到IPHlpApi.h,因为microsoft已经不维护vc6.0所以缺少,下载最新的Platform SDKfor internet 加入Tools -> Option ->Directories,在Library files和include

d.编译出现unresolved external symbol _pj_get_sys_info错误,将pjlib\src\pj下的os_info.c加入pjlib工程

编译在pjsip-apps\bin下生成pjsua_vc6.exe。

1.     在Linux下编译pjsip源码

   $ ./configure

   $ make dep&& make clean && make

在/pjproject-2.1.0/pjsip-apps/bin下可以看到

pjsua-i686-pc-linux-gnu和pjsystest-i686-pc-linux-gnu

3    利用编译源码生成的app,模拟一次会话的建立,利用wireshark抓包分析sip协议。

Windows端ip;172.16.2.138

linux端ip;172.16.2.63

 

二、首先windows端运行pjsua_vc6.exe

 

 

 

 

先选择m,创建一个新的呼叫,然后输入sip:172.16.2.63(linux端地址)。然后终端打印如下信息,大致可分为三部分

 

 

1.起始行

   INVITE sip:172.162.63 SIP/2.0

   INVITE表示邀请用户参加一个会话,sip版本2.0

2.消息头字段

 

Via:SIP/2.0/UDP172.16.2.138:5060;rport;branch=z9hG4bKPj9d24f4650227482987e044d641050ef6

这里给出了请求经过的路径,应答请求将按照这个路径传送应答请求。分别是传输层协议、客户名和地址,及接收响应的端口号

Max-Forwards: 70

标明请求被转发的最大次数

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

请求发送者

To: sip:172.16.2.63

请求接收者

Contact:<sip:172.16.2.138:5060;ob>

一个用来直接访问发送者的url

Call-ID: fdc4d3c08c594ac499b184fbdbc35550

一个全局的唯一标志,用来唯一标志这个呼叫

CSeq: 2322 INVITE

用来标识发送不同请求

Allow: PRACK, INVITE, ACK, BYE, CANCEL,UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS

Supported: replaces, 100rel, timer,norefersub

Session-Expires: 1800

Min-SE: 90

以上标识服务器制定传送地址有关响应的附加信息

User-Agent: PJSUA v1.16.0win32-5.1/i386/msvc-12.0

发送请求代理相关信息

Content-Type: application/sdp

消息体类型

Content-Length:   450

消息体长度

3,标志消息结束的空行

4,SDP消息体(这是可选的,有些时候没有)

v=0 协议版本

o=- 3585476598 3585476598 IN IP4 172.16.2.138

   依次是会话见者的用户名,会话标识,版本,网络类型,地址

s=pjmedia

会话名称

c=IN IP4 172.16.2.138

连接数据

t=0 0

   起始时间和终止时间

a=X-nat:0

   会话/媒体属性:值

m=audio 4000 RTP/AVP 98 97 99 104 3 0 89 96

   媒体类型,端口,呼叫者希望收发的格式

接下来是看到的是响应消息,没有可选的消息体

SIP/2.0 100 Trying

100是状态码,Trying表示在连接

Via:SIP/2.0/UDP172.16.2.138:5060;rport=5060;received=172.16.2.138;branch=z9hG4bKPj9d24f4650227482987e044d641050ef6

Call-ID: fdc4d3c08c594ac499b184fbdbc35550

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

To: <sip:172.16.2.63>

CSeq: 2322 INVITE

Content-Length:  0

三、在linux端运行pjsua-i686-pc-linux-gnu即可看到一个连接请求

输入200,表示接受连接,可以看到成功连接的响应消息

SIP/2.0200 OK

Via:SIP/2.0/UDP172.16.2.138:5060;rport=5060;received=172.16.2.138;branch=z9hG4bKPj9d24f4650227482987e044d641050ef6

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

To:<sip:172.16.2.63>;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

CSeq:2322 INVITE

Contact:<sip:172.16.2.63:5060>

Allow:PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER,MESSAGE, OPTIONS

Supported:replaces, 100rel, timer, norefersub

Session-Expires:1800;refresher=uac

Require:timer

Content-Type:application/sdp

Content-Length:   274

 

v=0

o=-3585447798 3585447799 INIP4 172.16.2.63

s=pjmedia

b=AS:84

t=00

a=X-nat:0

m=audio40000 RTP/AVP 98 96

c=INIP4 172.16.2.63

b=TIAS:64000

a=rtcp:40001 IN IP4 172.16.2.63

a=sendrecv

a=rtpmap:98speex/16000

a=rtpmap:96telephone-event/8000

a=fmtp:960-15

接下来可以看到接收端发给请求端的ACK确认消息,其实中的to,from,call-id,cseq字段从上面invite请求复制而来。

ACKsip:172.16.2.63:5060 SIP/2.0

Via:SIP/2.0/UDP172.16.2.138:5060;rport;branch=z9hG4bKPj1fb3c29b50914f4db87a8bd92ce0921f

Max-Forwards:70

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

To:sip:172.16.2.63;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

CSeq:2322 ACK

Content-Length:  0

四、解除连接

在接收端输入h,表示发送一个BYE给连接端

BYEsip:172.16.2.138:5060;ob SIP/2.0

Via:SIP/2.0/UDP172.16.2.63:5060;rport;branch=z9hG4bKPjYBk6NnV2mwIut0wJaHNxU7S6h3eq42IJ

Max-Forwards:70

From:<sip:172.16.2.63>;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

To:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

CSeq:18290 BYE

User-Agent:PJSUA v2.1 Linux-2.6.35.22/i686/glibc-2.12

Content-Length:  0

接受到BYE端后会发送一个接受到BYE确认消息200过来

SIP/2.0200 OK

Via:SIP/2.0/UDP172.16.2.63:5060;rport=5060;received=172.16.2.63;branch=z9hG4bKPjYBk6NnV2mwIut0wJaHNxU7S6h3eq42IJ

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

From:<sip:172.16.2.63>;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

To:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

CSeq:18290 BYE

Content-Length:  0

用wireshark对这次会话可以抓取到6次

 

 

 

这六次依次是

      1.客户端向服务器端发送消息INVITE消息,

2.服务器段同意呼叫,发送100,状态码表示请求已收到,正在处理中。

3.  发送200表示请求已经完成。

4.  客户端向服务器端发送ACK,证实已经收到。

5.客户端突然不想参加此次会话,向服务器发送BYE。

6.  结束确认200。

 

 

相关TAG标签
上一篇:SIP协议学习1
下一篇:TCP/IP,HTTP,SOAP等协议之区别
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站