WAP传输协议
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WAP传输协议
我们知道,彩信(MMS)和WAP浏览器是WAP协议的两⼤主要应⽤。
WAP协议有点复杂,也算是SmartPhone中的核⼼技术之⼀吧,它包括WDP/WTP/WSP这⼀套传输协议,也包括WML/和SMIL这样的内容表⽰协议。
去年花了⼀点时间去研究它,后来该任务取消了,所以没有搞得太透彻。
今年要真正使⽤了,现在继续研究,主要侧重于它的实现。
这⾥记录⼀些研究笔记,本⽂是关于WDP/WTP/WSP的。
在传统的WWW模型中,浏览器(即⽤户代理)直接访问原始服务器,获取URL指定的资源,这是标准的C/S模型。
考虑到移动设备及其⽆线⽹络的特殊性,WAP的模型与传统的WWW模型有些差别,⾸先是在浏览器(即⽤户代理)和原始服务器之间引⼊了⼀个WAP⽹关,其次是服务器可以主动推(push)数据到⽤户代理上。
在⽹关与原始服务器之间仍然采⽤传统的TCP/IP/HTTP协议,⽽在浏览器(即⽤户代理)和⽹关之间采⽤了⼀套新的传输协议。
这套协议的协议栈结构如下:
最上层是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,估计也少不了两三个⽉时间。
所幸开源社区有很多可以重⽤的代码,就是其中之⼀,它是⼀个WAP/SMS⽹关,它实现了完整的WAP传输协议。
Kannel的WAP传输协议代码在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对于每层协议的实现也很巧妙。
在初始化时,⼀般每个协议层都需要两个函数指针,这些函数⽤来衔接上下两个相邻的协议层:⼀个函数接收来⾃上层的数据包并放到队列中,另⼀个函数接收来⾃下层的数据包并放到队列中。
这样,上下两层是完全独⽴的,可以单独测试。
每⼀层都有⼀个⼯作线程,它异步的处理来⾃上下两层的数据包,让各层的调⽤不会阻塞。