[置顶] WAP1.x协议栈浅析-WSP协议

2.3  WSP Layer

WSP层在WTP之上,为WAP应用程序提供会话级的连接,处理客户端、服务器端数据的交互等功能。实际上,WAP在制定之初就以当时已非常流行的Internet/HTTP协议作为参考,因此WSP协议提供了HTTP/1.1的所有功能,包括CONNECT/GET/POST等命令,所不同的是WSP针对这些Header/Body进行了二进制编码,以减少数据包大小,换句话说,是实现了二进制版本的HTTP/1.1。此外,WSP还增加了一些无线应用的特殊功能,比如Push等。

 

2.3.1  WSP PDU通用字段

TID(部分类型没有)

PDU Type

(根据Type可变)

TID  8-bit unsigned integer

PDU Type8-bit unsigned integer

 

WSP层每个PDU都由一个TID字段和一个必需的Type字段构成,其后的内容根据不同的Type要求组成。

 

2.3.2  WSP PDU类型(常用)

      Connect PDU

      ConnectReply PDU

      Redirect PDU

      Disconnect PDU

      Reply PDU

      Get PDU

      Post PDU

PDU Type对应的值列表如下:

类型名称

(保留)

0x00

Connect

0x01

ConnectReply

0x02

Redirect

0x03

Reply

0x04

Disconnect

0x05

Push

0x06

Suspend

0x08

Resume

0x90

Get

0x40

Post

0x60

 WSP PDU分析

      Connect PDU

Name

Type

Source

Version

8bit ungisnged int

WSP Protocol version

CapabilitiesLen

变长unsigned int

Capabilities长度

HeadersLen

变长unsigned int

Headers长度

Capabilities

Octets data

S-Connect Request Cap

Headers

Octets data

S-Connect Client Headers

      ConnectReply PDU

Name

Type

Source

ServiceSessionId

变长unsigned int

Session_ID 变量

CapabilitiesLen

变长unsigned int

Capabilities长度

HeadersLen

变长unsigned int

Headers长度

Capabilities

Octets data

S-Connect Request Cap

Headers

Octets data

S-Connect Client Headers



Get PDU

Name

Type

Source

URILen

变长unsigned int

Length of URI field

URI

Octets data

URI内容

Headers

Octets data

 

      Reply PDU

Name

Type

Source

Status

8bit ungisnged int

 

HeadersLen

变长unsigned int

ContentHeaders字段的长度

ContentType

Octets data

 

Headers

Octets data

 

Data

Octets data

 

      Disconnect PDU

Name

Type

Source

ServerSessionId

变长 ungisnged int

Session_ID变量

 

2.3.4  WSP Header和内容编码

为了减少无线传输的数据通信量,WSP层传递的数据采取编码方式,把HeaderBody内容都转换为二进制编码,通过二进制方式压缩数据包长度。

特别的,在Header部分,WSP定义了一系列二进制值对应表。请查阅WAP-WSP规范文档的附录A部分。


2.4  WSP层深入分析

      WSP层的变长类型,在WSP层协议中,有很多字段是变长的。变长的类型是通过最高位来标记,即当最高位为1,则表示下一个字节仍然是连续的一部分,直到最高位为0的字节才结束。因此每个字节表示的值最高为127

      WSP CONNECT PDU中,可以携带CapabilitiesHeaders可变字段。Capabilities字段用于协商一些通信机制,比如SDU大小,单个消息大小等等;Headers字段则用于表示Http协议中客户端可以接受处理的类型,比如Accept: text/html

      WSP REPLY返回状态为3xx时,表示URL已经变更,客户端必须根据这个状态,解析REPLY PDU中的头部分,把重定向的URL提取出来,并自动重定向到新的URL(由于Headers的解码较麻烦,目前我采取简单的处理方法,即只从Headers中获取http://开头的字符串)

      WSP REPLY返回的HTML Data中,如果WML内容含有” onenterforward”  <go href=> 之类的Tag,也需要进行直接重定向

 

2.5  移动梦网WAP网关分析

上述的流程和组包方式,我在free downloadKannel WAP网关中都通过了测试,使用比较顺利,但是目前通过公网能访问的WAP网站不多。

当连接移动梦网wap网关时,主要有以下差别的地方:

      WSP CONNECT PDU,按照我原来的包内容被拒绝,从网上找了一些成功连接的包内容,也按同样方式进行组包,根据WSP的协议分析,好像不能合理解析,不知道是否是WAP2.0的问题,还没时间研究。具体发送的包如下:

  unsigned char lsWSPPdu[]={

                 WSP_PDU_CONNECT, // PDU type

                 0x10,             // Version 1.0

                 0x10,             // Capability length

                 0x02,             // Headers length =

                                   // Capabilities

                 0x04, 0x80, 0x82, 0x81, //len, type, varint...

                 0x68, 0x04, 0x81, 0x82, //len, type, varint...

                 0x81, 0x68, 0x02, 0x84, //len, type, varint...

                 0x01, 0x02, 0x83, 0x01, //len, type, varint...

                                   // Headers

                 0x80, 0x80        // Accept: *\*

                 };

      WSP REPLY PDU,移动梦网WAP网关针对GET返回的REPLY,其Data字段存储的内容是明文的ASCII码,无需再进行WML解码,这点需要留意,可能是WAP2.0的缘故吧。




你可能感兴趣的:([置顶] WAP1.x协议栈浅析-WSP协议)