WAP协议研究笔记—WAP传输协议

本文介绍了WAP协议的架构与实现细节,重点讲解了WDP/WTP/WSP三层协议的工作原理和服务原语,并提及了Kannel项目的实现案例。

转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/absurd

作者联系方式:Li XianJing <xianjimli at hotmail dot com>

更新时间:2006-12-19

转载时请注明出处:http://blog.youkuaiyun.com/absurd

我们知道,彩信(MMS)和WAP浏览器是WAP协议的两大主要应用。WAP协议有点复杂,也算是SmartPhone中的核心技术之一吧,它包括WDP/WTP/WSP这一套传输协议,也包括WML/和SMIL这样的内容表示协议。去年花了一点时间去研究它,后来该任务取消了,所以没有搞得太透彻。今年要真正使用了,现在继续研究,主要侧重于它的实现。这里记录一些研究笔记,本文是关于WDP/WTP/WSP的。

在传统的WWW模型中,浏览器(即用户代理)直接访问原始服务器,获取URL指定的资源,这是标准的C/S模型。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1026" style="WIDTH: 414.75pt; HEIGHT: 208.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/q/LOCALS~1/Temp/msoclip1/04/clip_image001.png"></imagedata></shape>

wap_www

考虑到移动设备及其无线网络的特殊性,WAP的模型与传统的WWW模型有些差别,首先是在浏览器(即用户代理)和原始服务器之间引入了一个WAP网关,其次是服务器可以主动推(push)数据到用户代理上。在网关与原始服务器之间仍然采用传统的TCP/IP/HTTP协议,而在浏览器(即用户代理)和网关之间采用了一套新的传输协议。

<shape id="_x0000_i1027" style="WIDTH: 415.5pt; HEIGHT: 163.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/q/LOCALS~1/Temp/msoclip1/04/clip_image003.png"><font size="3"></font></imagedata></shape>

wap_wae

这套协议的协议栈结构如下:

<shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 244.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/q/LOCALS~1/Temp/msoclip1/04/clip_image005.png"></imagedata></shape>

wap_stack

最上层是WAE层,它描述了WML、Wscript、Wireless Telephony Application (WTA, WTAI)和一些数据格式(如WBMP图片格式、电话本记录和日程记录等等)。

其下层是WSP层,它把下面的无连接的WDP协议和面向连接的WTP协议封装起来,为WAE层提供一套统一的接口。另外它也提供了浏览器应用程序相关功能(WSP/B),如:HTTP/1.1协议及相应的二进制格式、长生命周期的会话(session)、会话的挂起(suspend)与恢复(resume)、可靠/不可靠的推服务和协议能力协商等。

WSP下面是WTP层,它提供了轻量级的面向事务的协议。它有三类事务服务:不可靠的单向请求(one-way)事务、可靠的单向请求(one-way)事务和可靠的双向请求-回应(two-way request- reply)事务。它也支持异步事务和为了提高带宽利用率的一些机制等。

WTP下面是WTLS层,它基于Transport Layer Security(TLS),保证数据的保密性、完整性以及防止DOS攻击等等。不过好像通常很少使用,我想可能一方面在于GSM网络本身的特殊性,另一方面在限于手机上的资源(CPU/ROM/RAM)限制。

WTLS下面是WDP层,它主要是对下面的承载层的做一个抽象,为上面的WTLS、WTP和WAE提供一套统一的接口。

最下层是承载层,WAP可以运行在很多不同的承载层之上,比如GSM、CDMA和PDC-P,甚至还可以在TCP/IP网络上运行,不过最常见的方式是运行在GSM的GPRS上。

WAP传输协议相对于TCP/IP协议来说,要简单不少。但是要重头实现也并非易事,即使只实现WDP/WTP/WSP,估计也少不了两三个月时间。所幸开源社区有很多可以重用的代码,kannel就是其中之一,它是一个WAP/SMS网关,它实现了完整的WAP传输协议。

KannelWAP传输协议代码在wap目录下。WAP传输协议并不是对等的,Kannel作为网关,其实它只需要实现服务器的代码即可,但kannel即实现了服务器的代码也实现了客户端的代码,所以这部分代码完全可以拿到手机中使用。

Kannel状态机和协议数据单元的实现很巧妙。里面有很多def文件,这些文件主要用于实现状态机和协议数据单元PDU的打包/解包,这种方法的巧妙之处在于:def文件里面的宏是根据上下文定义的,不同的上下文从def文件中抽取不同的数据,从而把重复(类似)的代码降到最低。

wsp_pdu.def定义了WSP协议层服务原语对应的协议数据单元(PDU),其中包括:

1. Connect

2. ConnectReply

3. Redirect

4. Disconnect

5. Get

6. Post

7. Reply

8. Push

9. ConfirmedPush

10. Suspend

11. Resume

12. sia

wtp_pdu.def定义了WTP协议层的服务原语对应的协议数据单元(PDU),其中包括:

1. Invoke

2. Result

3. Ack

4. Abort

5. Segmented_invoke

6. Segmented_result

Negative_ack

Kannel对于每层协议的实现也很巧妙。在初始化时,一般每个协议层都需要两个函数指针,这些函数用来衔接上下两个相邻的协议层: 一个函数接收来自上层的数据包并放到队列中,另一个函数接收来自下层的数据包并放到队列中。这样,上下两层是完全独立的,可以单独测试。每一层都有一个工作线程,它异步的处理来自上下两层的数据包,让各层的调用不会阻塞。

参考资料:

http://www.wapforum.org

http://www.kannel.org

~~end~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值