PPP(Point to Point Protocol,点对点协议)协议是为在两个对等实体间传输数据包,建立简单连接而设计的。这种连接提供了同时的双向全双工操作,并且假定数据包是按顺序投递的。PPP协议还满足了动态分配IP地址的需要,并能够对上层的多种协议提供支持。PPP在TCP/IP协议集中是位于数据链路层的协议,其物理实现方式有两种:一种是通过以太网口(这时称之为PPPoE,即PPP over Ethernet),另一种就是利用普通的串行接口。本文主要讨论的就是后一种PPP协议的具体实现过程。
PPP协议是目前应用得最广的一种广域网协议,它主要由以下3部分组成:(1) 在串行线路中对上层数据包的封装(HDLC);(2) 用于建立、配置和检测数据链路连接的链路控制协议(LCP) ;(3) 用于建立和配置不同网络层协议的网络控制协议(NCP) 协议簇。下面从PPP协议的封装结构和PPP链路协商两个部分对PPP协议进行详细剖析。
PPP协议封装
PPP 封装用于消除上层多种协议数据包的歧义,加入帧头、帧尾, 使之成为互相独立的串行数据帧。PPP 采用HDLC 的组帧格式,它是面向字符的。在完整的PPP 帧中,帧头由帧开始标记、地址域、控制域、协议域组成,帧尾由校验域、帧结束标记组成(如表1 所示)。
表1:PPP帧封装格式
标记 1字节 0X7E | 地址 1字节 0XFF | 控制 1字节 0X03 | 协议 2字节 | 编码 1字节 | ID 1字节 | 长度 2字节 | 载荷 0-1496字节 | 校验和 2字节 | 标记 1字节 0X7E |
表2:PPP协议代码 表3:编码对应含义
协议代码 | 对应协议 |
0XC021 LCP协议 0XC023 PAP协议 0XC223 CHAP协议 0X8021 IPCP协议 0X0021 IP协议 |
编码值 | 对应含义 |
1 配置请求(Req) 2 接受配置(Ack) 3 配置请求接受,其他拒绝(Nak) 4 配置请求不认识或不被接受(Rej) 5 终止链接 6 终止确认 |
PPP帧以0x7e作为一帧的开始和结束的标记,占一个字节。地址域和控制域固定的值,分别为0xff 和0x03,各占一个字节。协议域为两个字节,在实际应用中因数据包的不同而不同。PPP 帧具有错误检测机制,校验和中填写的就是发送方对帧数据的检验码,接收方在接收到该帧后对数据做校验,通过校验来判断数据帧在传送过程中是否有误。其中校验和采用的是CRC算法,校验范围从地址字节到校验和位置之前的最后一个数据载荷。
PPP协议包含丰富的内容, 它能实现包括IP协议在内的多种网络协议的封装,那么,如何区分某个PPP包究竟是哪种数据协议包?这就是PPP协议帧第四、五两个字节关心的问题,表2列出常用的协议代码及其对应的协议。
PPP链路协商
通常,在一次PPP链路会话中,协商的双方并没有区分谁是服务器端谁是客户端。为了叙述方便,这里把申请请求PPP服务的一端称为用户端,而把能提供PPP服务的机构称为ISP(比如本项目中的联通CDMA网络)。一般来讲,与ISP建立一次正常的PPP链路连接,要经历下面3个阶段: (1)LCP协商,建立和配置连接以及帧参数设置等;(2)用户认证,这里将选择PAP认证;(3)NCP协商,即负责IP地址的动态分配等事务。这里把常用的编码字节的意义列成上表3,这些代码对上述协议都适用。至于PPP封装帧结构中的ID字节,表示的是PPP包的序号,这在协商阶段用来识别该对哪个包进行应答。需要说明的是,当PPP报文封装的是IP报文时,则已经不存在编码和ID部分了。
3 PPP协议在联通CDMA网络中的具体实现
PPP协议的格式虽然严格遵循既定标准,但不同的ISP可以有其自己的协商规范,也就是说协商的过程会因为使用网络的不同而有差别。因此PPP技术的应用,关键的问题是要弄清楚不同的ISP提供商它们各自的一套协商会话流程,一旦协商过程完成,用户获得ISP分配的动态IP,剩下的工作只不过是把用户数据以IP报文形式封装在一个个PPP报文中进行传输了。下图2就是利用中国联通CDMA网络实现视频传输的协商阶段的全过程。
图2 PPP协商过程数据帧实例
7E | FF 7D 23 | C0 21 | 7D 21 | 7D 21 | 7D 20 7D 34 | 7D 22 7D 26 7D 20 7D 20 7D 20 7D 20 | 7D 25 7D 26 | ||
52 7D 38 7D 30 44 | 7D 27 7D 22 | 7D 28 7D 22 | 6E E1 | 7E |
| ||||
1 U
7E | FF 7D 23 | C0 21 | 7D 21 | 7D 21 | 7D 20 7D 3D | 7D 21 7D 24 7D 25 EA | 7D 22 7D 26 7D 20 7D 20 7D | |||||
20 7D 20 | 7D 23 7D 25 C2 23 7D 25 | 7D 25 7D 26 2F 7D 35 B2 7D 31 | 7D 27 7D 22 | 7D 28 7D 22 | 7D | |||||||
27 E6 | 7E |
| ||||||||||
2 I
7E | FF 7D 23 | C0 21 | 7D 22 | 7D 21 | 7D 20 7D 34 | 7D 22 7D 26 7D 20 7D 20 2D 20 7D 20 | 7D 25 7D 26 | ||
52 7D 38 7D 30 44 | 7D 27 7D 22 | 7D 28 7D 22 | 85 88 | 7E |
| ||||
3 I
7E | FF 7D 23 | C0 21 | 7D 23 | 7D 21 | 7D 20 7D 28 | 7D 23 7D 24 CO 23 | 22 48 | 7E |
4 U
7E | FF 7D 23 | C0 21 | 7D 21 | 7D 22 | 7D 20 7D 3C | 7D 21 7D 24 7D 25 EA | 7D 22 7D 26 7D 20 7D 20 7D | ||||||
20 7D 20 | 7D 23 7D 24 C0 23 | 7D 25 7D 26 2F 7D 35 B2 7D 31 | 7D 27 7D 22 | 7D 28 7D 22 | 9F 40 | 7E | |||||||
5 I
7E | FF 7D 23 | C0 21 | 7D 22 | 7D 22 | 7D 20 7D 3C | 7D 21 7D 24 7D 25 EA | 7D 22 7D 26 7D 20 7D 20 7D | |||||
20 7D 20 | 7D 23 7D 24 C0 23 | 7D 25 UD 26 2F 7D 25 B2 7D 31 | 7D 27 7D 22 | 7D 28 7D 22 | AC 7D 3A | |||||||
7E |
| |||||||||||
6 U
7E | FF 3 | C0 23 | 1 | 1 | 0 E | 4 43 41 52 44 | 4 43 41 52 44 | 26 C2 | 7E |
7 U
7E | C0 23 | 2 | 1 | 0 5 | 0 | FD 30 | 7E |
8 I
7E | 80 21 | 1 | 3 | 0 10 | 2 6 0 2D F 0 | 3 6 DC C0 0 9 | 46 D8 | 7E |
9 I
7E | FF 3 | 80 21 | 1 | 1 | 0 16 | 3 6 0 0 0 0 | 81 6 0 0 0 0 | 83 6 0 0 0 0 | 6E DB | 7E |
10U
7E | FF 3 | 80 21 | 4 | 3 | 0 A | 2 6 0 2D F 0 | F5 54 | 7E |
11U
7E | 80 21 | 3 | 1 | 0 16 | 3 6 DC CF 57 8C | 81 6 DC C0 0 82 | 83 6 DC C0 8 3A | 18 39 | 7E |
12I
7E | FF 3 | 80 21 | 1 | 2 | 0 16 | 3 6 DC CF 57 8C | 81 6 DC C0 0 82 | 83 6 DC C0 8 3A | 67 AA | 7E |
13U
7E | 80 21 | 1 | 4 | 0 A | 3 6 DC C0 0 9 | 62 4C | 7E |
14I
7E | 80 21 | 2 | 2 | 0 16 | 3 6 DC CF 57 8C | 81 6 DC C0 0 82 | 83 6 DC C0 8 3A | F1 C9 | 7E |
15I
7E | FF 3 | 80 21 | 2 | 4 | 0 A | 3 6 DC C0 0 9 | 75 D6 | 7E |
16U
在上图中,每个报文最左边的数字是协商过程的报文序号,紧接着的U字母代表的是申请PPP服务的用户发出的PPP协商报文,而I则代表ISP发出的PPP协商报文,这里具体就是联通的CDMA网络。下面对整个协商过程进行详细解析:
1)在真正进行PPP协商之前,还有一个AT命令拨号过程,联通CDMA要求拨#777申请数据业务,而Q2358C模块的拨号命令是ATD,因此合起来就是:ATD#777;,注意,Q2358拨号命令后面要加一个分号;拨号完后,要等待CDMA返回“CONNECT”,这时候才能进行后续的PPP协商;
2)第一个起始PPP问旬包必须由用户发起,否则联通CDMA不会响应。包的内容见上图中第1序号包,这里要说明一点:在PPP协商的LCP阶段,除了起始和结束的PPP报标志符7E,报文中任何地方的值小于0x20的字符,以及字符7F,7E和7D,都要转义,转义的方法是把其值和0x20异或后的值紧接着7D发送。
3)从第1序号报的第三个框的“C0 21”字符结合上表2可以看出,这是一个LCP报文,第四个框“7D 21”就是01,根据上表3可以看出这是用户发出的请求报,而根据第五个框的内容知道这是用户发出的第一个报,第六个框是整个报文的长度,占两个字节,后面的内容是各种选项,倒数第二个框的内容则是FCS校验值填充的地方,占两个字节;
4)CDMA接受到第1序号报后,将先后发送第2序号和第3序号LCP报,其中第2序号报是请求报,请求用户对其携带到选项进行同意或者拒绝,如2号报第7个框“7D 21 7D 24 7D 25 EA”中“7D 21”表示第1个LCP协商选项,其长度为“7D 24”即4个字节,后面两个字节“7D 25 EA”即“05 EA”是其选项值,整个1号选项的用途就是规定PPP报文最大数据有限载荷是5EA,也就是1514个字节,其他选项的结构的理解与此完全一样,后面不再赘述。关于LCP报文各种选项的意义,可参阅相关RFC文档;
5)CDMA的发出的第3序号报是同意用户发出的第1序号报的,这可以从其第四个框的值“7D 22”也即02,根据表3,其表示接受配置的意思;
6)从第4序号报的第4框内容“7D 23”即03,结合表3,可以得知用户拒绝了CDMA请求报中选项3的配置,表示用户不接受CHAP(C2 23)认证,用户只接受PAP认证(C0 23);
7)CDMA收到用户刚才的反应后,马上发出第2个请求报,这时候把第3选项的配置改成了用户希望的PAP认证(C0 23),见上图5号报;
8)第6序号报表示用户同意CDMA的LCP配置,这里要说明一点,选项2是设置是否要对0x20以下的字符值进行转义的,因为选项2的值是全0,则说明以后的PPP报文不再对值为0x20以下的值转义,但是对于值为7D、7E、7F的字符依然要进行转义发送;
9)从第7序号报开始,LCP协商过程结束,现在开始进行的是PAP认证,联通的PAP认证的用户名和密码都是“CARD”,也即ASCII值“0x43、0x41、0x52、0x44”;第8序号报表示CDMA通过了用户的认证;
10)根据表2,可以看出,第9序号报开始是NCP会话也即IPCP会话阶段,CDMA请求用户是否同意其网关IP地址:DC.C0.0.9,见其倒数第3个框也即3号选项所包含的值;
11)之后的过程完全可以按照上面类推分析下去,当全部16个PPP报文会话完毕后,将获得四项关健值:即分配的IP地址: DC.CF.57.8C; 远程网关:DC.C0.0.9;主DNS:DC.C0.0.82;次DNS:DC.C0.8.3A。之后就可以嵌入真正的IP数据报进行数据打包传输。