经过两天的资料收集对SIP有了初步的了解,在网络电话VOIP应用方案中很多都是采用Linux服务器部署电信级SIP Server软件或者使用专门的硬件服务器来提供SIP Server服务,客户端用SIP电话机或软电话,结构组成包括:SIP终端,代理服务器,重定向服务器,注册服务器器,鉴权服务器,SIP Server服务器等,很庞大、很复杂、很无奈(没有多余的电脑给我装Linux,更没有SIP硬件),所以我需要的是Windows下运行的SipServer和SoftPhone,以及一个抓包工具就可以了。
SipServer:MiniSipServer ,下载地址 http://www.myvoipapp.com/download/index.html
SoftPhone: X-Lite ,下载地址 http://www.counterpath.com/x-lite-4-for-windows-download.html
抓包工具:MiniSniffer(这工具有个缺陷就是没有报文时间,不过用习惯了就是它了),点击下载
SIP协议文档:SIP流程图带动画解释.pdf,点击下载
组网结构图:
部署:
1. 安装并启动MiniSipServer,一路Next就行,通过开始菜单启动,默认监听 UDP 5060 端口;系统自带三个默认用户,密码和用户名一样,在下一步要用到。
2. 安装并配置X-Lite
X-Lite需要.NetFramework4.0和VC2010 SP1,安装时联网下载。
完整的配置方法参考 Setup IP PBX for small business step by step,介绍比较全面
配置“本机”上的X-Lite(userID:100 password:100 );“测试机”上的X-Lite(userID:101 password:101)
3.通过X-Lite让测试机和本机通话
在本机和测试机上都运行X-Lite软件后,在MiniServerIP中点击“分机”查看用户在线状态,登陆的用户图标是绿色;在命令行下可以查看连接。如下图:
。
4. 抓包并分析SIP协议
a.关掉MiniSipServer和两个X-Lite,运行MiniSniffer抓包工具,并开始抓包。
b.运行 MiniSipServer和测试机上的X-Lite,因为MiniSniffer好像抓不到本机端口之间的数据包也为了便于分析数据就运行测试机上的 X-Lite客户端。记住在运行之前打开MiniServerSip的报文跟踪功能。
c.对比抓包和跟踪信息,经过对比分析抓包和MiniSipServer自身的报文跟踪信息是一致的,所以为了以后调试和学习Sip协议完全可以使用 MiniSniffer做为辅助工具。
为了便于分析,保存Sniffer中的报文。
d.分析报文,根据 RFC3261 中文版 第22.3章的描述,注册流程分为4步:
1)上行Register
Via: SIP/2.0/UDP 192.168.1.114:16938;branch=z9hG4bK-d8754z-c32c649d175a5310-1---d8754z-;rport
Max-Forwards: 70
Contact: <sip:101@192.168.1.114:16938;rinstance=82948d058fa12715>
To: "101"<sip:101@192.168.1.132>
From: "101"<sip:101@192.168.1.132>;tag=aafd535b
Call-ID: MDhjYTg0NzVmODk0ZGNhYzI0YTMyYjE0ZTE1ZTZkODk.
CSeq: 1 REGISTER
Expires: 3600
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User-Agent: X-Lite 4 release 4.1 stamp 63214
Content-Length: 0
2)下行认证要求407报文
Via: SIP/2.0/UDP 192.168.1.114:16938;received=192.168.1.114;rport=16938;branch=z9hG4bK-d8754z-c32c649d175a5310-1---d8754z-
From: "101"<sip:101@192.168.1.132>;tag=aafd535b
To: "101"<sip:101@192.168.1.132>;tag=2a4824
CSeq: 1 REGISTER
Call-ID: MDhjYTg0NzVmODk0ZGNhYzI0YTMyYjE0ZTE1ZTZkODk.
Allow: INVITE, OPTIONS, ACK, CANCEL, BYE, REFER, SUBSCRIBE, NOTIFY, MESSAGE
User-Agent: miniSipServer V6.1.5 (20 clients) build Dec 1 2011
Proxy-Authenticate: Digest realm="myvoipapp.com",algorithm=MD5,nonce="18bf67854ae23d6d2cd772af69535f91",stale=FALSE
Content-Length: 0
3)上行包含认证信息的Register
Via: SIP/2.0/UDP 192.168.1.114:16938;branch=z9hG4bK-d8754z-5509a16f1ceae597-1---d8754z-;rport
Max-Forwards: 70
Contact: <sip:101@192.168.1.114:16938;rinstance=82948d058fa12715>
To: "101"<sip:101@192.168.1.132>
From: "101"<sip:101@192.168.1.132>;tag=aafd535b
Call-ID: MDhjYTg0NzVmODk0ZGNhYzI0YTMyYjE0ZTE1ZTZkODk.
CSeq: 2 REGISTER
Expires: 3600
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Proxy-Authorization: Digest username="101",realm="myvoipapp.com",nonce="18bf67854ae23d6d2cd772af69535f91",uri="sip:192.168.1.132",response="581842f465276cd5fa908061d7bf2f69",algorithm=MD5
User-Agent: X-Lite 4 release 4.1 stamp 63214
Content-Length: 0
4)下行注册成功信息
Via: SIP/2.0/UDP 192.168.1.114:16938;received=192.168.1.114;rport=16938;branch=z9hG4bK-d8754z-5509a16f1ceae597-1---d8754z-
From: "101"<sip:101@192.168.1.132>;tag=aafd535b
To: "101"<sip:101@192.168.1.132>;tag=4d074db8
CSeq: 2 REGISTER
Call-ID: MDhjYTg0NzVmODk0ZGNhYzI0YTMyYjE0ZTE1ZTZkODk.
Allow: INVITE, OPTIONS, ACK, CANCEL, BYE, REFER, SUBSCRIBE, NOTIFY, MESSAGE
User-Agent: miniSipServer V6.1.5 (20 clients) build Dec 1 2011
Contact: <sip:101@192.168.1.114:16938>
Expires: 120
Content-Length: 0
在第三步上传的报文中包含密码信息,但认证算法太麻烦,没能手工解析或构造出来,关于认证算法参考文章:http://blog.sina.com.cn/s/blog_4b839a1b01000bqq.html
至此,对SIP协议及其流程有了个清晰的认识,为以后能够更好的理解协议栈找到了一个可行的方法。
这篇学习记录前段时间写了一半,今天补齐为2011年画个句号,来年再找个合适的开源库写一个软电话的例子,到时对SIP协议栈的学习就可以告一段落了。争取在春节前完成。。。。。
明天就是2012了,今天拿到了驾照。祝愿各位圆友 元旦快乐。