转载地址:http://blog.renren.com/blog/250046791/466595416
1.1 学习VOIP软件X-Lite的使用;
1.2 学习SIP协议的工作流程;
1.3 了解VOXALOT的工作机制;
1.4 练习使用wireshark抓包软件;
1.5 利用wireshark抓包软件分析SIP协议的通信过程
PC: win7;
CPU: Intel Core2
内存:2G;
主频:2.0GHz
wireshark: v 1.2.6
VOIP软件 :X-Lite Version 3.0 build 56125
3.1概念简述:
.SIP:会话发起协议(Session Initiation Protocol)是一个应用层的信令控制协议。用于创建、修改和释放一个或多个参与者的会话。这些会话可以好似Internet多媒体会议、IP电话或多媒体分发。会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。
SDP:会话描述协议(Session Description Protocol或简写SDP)描述的是流媒体的初始化参数。此协议由IETF发表为 RFC 2327。
RFC:Request For Comments (RFC),是一系列以编号排定的文件。文件收集了有关因特网相关资讯,以及UNIX和因特网社群的软件文件。目前RFC文件是由Internet Society(ISOC)所赞助发行。基本的因特网通讯协定都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于因特网新开发的协定及发展中所有的记录。因此几乎所有的因特网标准都有收录在RFC文件之中。RFC(Request For Comments)-意即“请求评议”,包含了关于Internet的几乎所有重要的文字资料。
.RTP:实时传送协议(Real-time Transport Protocol或简写RTP)。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTSP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础。RTP协议和RTP控制协议RTCP一起使用,而且它是建立在用户数据报协议上的。
.RTCP:实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是[[实时传输协议|实时传输协议(RTP)]]的一个姐妹协议。RTCP由RFC 3550定义(取代作废的RFC 1889)。RTCP为RTP媒体流提供信道外(out-of-band)控制。RTCP本身并不传输数据,但和RTP一起协作将多媒体数据打包和发送。RTCP定期在流多媒体会话参加者之间传输控制数据。RTCP的主要功能是为RTP所提供的服务质量(Quality of Service)提供反馈。
3.2 SIP协议简介
A.SIP通信概述:
正常的SIP通话过程包含三个过程:会话连接、通话过程和会话结束过程。通话流程图如下图(3)所示:
B.SIP客户端注册过程
刚启动X-Lite的时候,X-Lite会将本地号码注册到相应的域名服务器上。注册过程如下图所示:
发送注册request |
验证成功 |
Y |
N
C.SIP会话发起
我们假设Alice向Bob发起会话请求,则过程如下图所示:
图(4)会话发起过程
a) Alice首先发起一个INVITE数据包到其代理服务器,如上图中INVITE F1;每个INVITE数据包包头含有如下数据域:
图(5)INVITE数据包包含域
l Via:Alice用来接收响应包的终端地址。因为,在SIP协议中,是允许主叫方重定位此次通话的。也即是,可以允许主叫方用A手机拨打C的号码,但是却通知C将信息传到B手机。该域中还包括一个branch,用来标识此次交互。
l Max-Forwards:该域表示包被允许传送的最大通信距离
l To:被叫方的ID
l From:主叫方ID
l Call-ID:基于”To”和”From”的会话ID。和前两者共同标识一个唯一的会话
l CSeq:标识在一次会话中request发送的个数
l Contact:标识数据包发起者
l Content-Type:标识数据包内容的类型
l Content-Length:标识数据包内容的长度
b) Alice的代理端收到Alice的请求之后,会要求Alice对自己的身份进行认证。
这个认证过程如下图所示:
代理端向Alice发送认证请求包407 |
Alice出示证件 |
Y |
N |
c) Alice的代理端将INVITE路由到Bob的代理端,并返回一个100 Trying数据包
代理端通过INVITE数据包中的”To”域,获取到INVITE的下一个目的地址,即Bob的代理端。然后将该数据包转发出去。而后,再向自己的上一跳返回一个100 Trying数据包,通知Alice,连接正在建立中。
d) Bob的代理端将INVITE转发给Bob,并返回100 Trying数据包
Bob的代理端在收到INVITE后,通过本地数据库查找到Bob,然后将该INVITE数据包发给Bob。同时返回一个100 Trying数据包给上一跳。
e) Bob接受Alice的呼叫,并返回180 Ring和200 OK数据包到Alice
Bob收到从自己的代理端来的INVITE并开始响铃。同时,将响铃信号发送给代理端,代理端。之后,该Ringing包将沿着INVITE的逆向路径到达Alice。如果,Bob在接到响铃后,接听电话,那么Bob的客户端将发送一个200 OK包,该包到达Alice的路径和上面的Ringing数据包的路径一样。此时连接其实已经建立起来。
f) Alice返回ACK确认,从而建立起连接
Alice收到相应的200 OK包之后,将向Bob返回一个ACK包进行确认。到此,该连接正式建立起来。
D.SIP通话过程
在建立起会话之后,通信双方通过各自的代理服务器进行通信。通信的内容则采用一种称作RTP的协议来传输。通信的内容:可以包括语音、视频和电子邮件。
E.SIP会话结束
会话结束动作可以由通信双方中的任何一端发起。会话结束动作由数据包BYE标识。一旦某个用户收到BYE包,那么就会返回一个ACK数据包,从而彻底中断连接
实验内容 |
实验结果 |
搭建实验平台,获得sip账号 |
成功 |
通过美国的远程服务器实现点到点通话 |
成功 |
局域网内注册成为sip Server并分配分机 |
成功 |
登录局域网内的sip server成功注册本分机 |
成功 |
局域网内作为分机与另一分机通话 |
成功 |
a)去官网下载wiresharp软件
http://www.wireshark.org/download.html
b)运行安装程序,即可完成安装
a) 去官方网站下载X-Lite
http://www.counterpath.com/x-lite.html
b) 运行下载好的安装程序,即可完成安装。
为了使得我们能够顺利利用X-Lite进行免费通话,我们需要到VOXALOT去注册账号。该账号的作用类似于我们的手机号码。
注册VOXALOT的网站:http://www.voxalot.com/
本次实验中,我注册的账号为:198772服务器为:us.voxalot.com
Display Name: 本地显示用户名
User Name: 申请的账号名
Password: 账号对应的口令
Authorization user name: 采用默认(空白)
Domain: 服务器端域名
proxy: 代理端域名
Dialing plan: 采用默认设置
u 运行wireshark,启动wireshark,设置正确的抓包规则,开始抓包.
u 拨打对方电话,进行通话
获取对方的号码之后,按照正常拨打电话的流程即可完成电话的拨打。
u 结束通话,分析数据包
在结束通话之后,停止wireshark抓包动作。在Filter域中输入”sip”。
5.3局域网内注册成为sip Server并分配分机
启动minisipserver,自动将服务器ip配置为当前主机ip,并分配四个分机100,101,102,103
5.4分机登录局域网内的sip server(我的主机)并注册
用户100和101注册成功,miniSipServer的MySql数据库中自动记录用户100和101的ip地址,便于在以后的通信中查找102用户的地址。
用户注册过程中抓包如下:
5.5局域网内作为分机与另一注册过的分机通话
在结束通话之后,停止wireshark抓包动作。在Filter域中输入”sip”。
6.1客户端向服务器端注册
从上图中可以看出,客户端在启动的时候,会主动向服务器端注册。注册过程如下:
a) 客户端向服务器端发送Request REGISTER数据包,请求注册,该包的SIP头如下:
b) 服务器端需要客户端出示证明,因此针对上面的注册包,返回一个401包;
c) 客户端再次向服务器端发起Request REGISTER数据包,请求认证,其SIP头如下:
从上面两幅图中可以看出,第二次申请认证的数据包中,明显多了一个Authorization域。
d) 针对上面的申请,服务器端返回一个Status 200 OK包,表示通过认证。
e) 注册成功后,客户端向服务器端查询当前的连接状况,因此发送Request SUBSCRIBE
f) 同样服务器端要求客户端再次出示“证件”,于是发送了Status: 407 Proxy Authentication Required
g) 客户端再次发起查询数据包,并在其中添加相应的认证,如下图所示:
6.2 客户端之间建立连接
从上面的数据可以看出通信流程:
a) 客户端向服务器端发送Request INVITE数据包,请求和198771建立连接
b)服务器端转发相应的INVITE数据包(上图中没反映出来),并且向客户端返回一个100 Trying数据包
c)当被呼叫端发出Ring信后号,代理端再返回相应的Ring数据包
d)当被呼叫端接受呼叫后,发出Status 200 OK数据包,并被代理端转发到客户端
6.3 客户端之间通信
当经过上述步骤,建立连接之后,就开始双方的通信过程。通信过程中使用RTP协议进行通信数据的传送。
上图中所示即为双方通信过程。其中111.186.57.199为主叫服务器IP;111.186.57.3为被呼叫客户端IP。
通过和上面连接建立时的图片相比较,可以发现,当经过代理端建立连接之后的通话数据包将不再通过代理端传输,而是直接在通话双方之间传输。这个是非常合理的,因为双方经过连接建立过程已经相互得知对方的IP地址,因此就没有必要再通过服务器端来传送数据包。这样使得通话的实时性更加可靠。
由于使用miniserver的sip协议过程与上述过程大致相似,本论文中不进行详细分析。
6.4通话音频还原
WireShark自身就集成有语音播放器,可以播放通话中的语音信息。(之前的VoIP界面点击Player进入,解码后如下图所示)
图12.WireShark Player
此外,通过WireShark强大的功能与相关格式转换工具Cool Edit,我们能够成功地将储存在RTP报文中的语音信息还原。
具体为选取通话中的RTP报文,进入Telephony->RTP->Stream Analysis。
图13.Stream Analysis工具
然后将之通过Save payload转化为.raw格式的音频文件,最终通过Cool Edit软件进行格式转换,转换成wav格式。
在试验过程中,我发现通过wireshark自带的Telephony功能,只能够将抓获的通话数据包还原,但是不能播放还原之后的数据包中的声音,只有当X-lite开启record功能时,才能正确截取数据包中的声音。然而当我做完实验,与别人交流时,却发现有些同学在做实验时,X-lite没有开启record功能也能正确截取数据包中的声音,该问题是我大为困惑。后来仔细比对之后,才明白是软件问题。虽然X-lite和3CX Phone的Server-Client软件都能成功地进行VOIP电话,然而WireShark进行报文截取及报文分析过程中,虽然能够识别SIP协议的相关报文,并能作出流程图,但却无法识别具体通话中所使用的RTP。在WireShark中显示“Unknown RTP version”,可能是X-Lite使用的RTP版本与WireShark不兼容。导致WireShark无法根据RTP报文还原出语音。
通过此次实验,我学到了如下东西:
a) Wireshark软件的使用
b) X-Lite电话的使用
C)对SIP协议有了一个比较深入的认识
d)对VOIP的通话过程和工作原理也有了比较侧地的认识。
由于是大二学生,以前并没有接触过wireshark软件,导致本实验开始时困难重重。但是在学长们的帮助下,还是顺利完成了实验,并且收获不小。
注:由于本次实验进行了多次,而且每次地点不同,导致IP地址也各不相同。而且由于对wirreshark软件的深入了解,声音提取实验是在之后的实验中进行的。所以原始报文比较多,不好意思……
附录1:SIP常见数据包类型和作用
数据包 |
作用 |
备注 |
Request: Invite |
邀请对方参与会话 |
数据包头中各域的解释: via: 记录SIP的版本/使用传输协议,以及会话发起者。 branch:记录此次会话 Max-Forwards:最大传输跳数 Contact:本机的IP地址以及正在使用的传输协议 To: 呼叫的目的方 From:呼叫的发起方 Call-ID:标识此次通话的ID; 它和To、From唯一标识一个会话 CSeq:每次发起request,该域就增加1;同时后面标识使用的method,该包的作用 Content-Type:描述数据包的内容 Content-Length:内容message body长度。以8进制计数,单位为byte
|
Status 407 |
代理端要求客户端认证 |
|
Request:ACK |
针对上面407的回复 |
|
Status:100 Trying |
通知上一跳节点正在为之转发数据包 |
|
Status:477 |
下一条出错 |
|
Request:SUBSCRIBE |
查询当前的服务否可用 |
|
Status:200 OK |
标识对请求的肯定回答 |
|
Request:NOTIFY |
在subscribe查询过程中,如果会话状态发生改变,则发出的通知包,收到这个数据包的节点会返回一个Status 200 |
|
Request:REGISTER |
客户端向代理端发起注册请求 |
|
Status: 401 |
代理端不接受发客户端注册请求包中的证书信息。之后,客户端可以通过回复Status 200,来“强制”代理端查看相应的信息 |
|
Request:CANCEL |
用于结束一次呼叫请求request |
|
Status: 603 |
被叫端拒绝连接 |
|
Status: BYE |
作用同CANCEL,但是不需要OK进行确认 |