1 前言
在目前的通信市场,宽带逐渐增温,接入方式呈现多样性:LAN、ADSL、HFC Cable Modem、WLAN各有一定的市场份额,而ADSL是全球范围内占据主流地位的宽带接入方式,它能够提供最低512 kHz,最高8 MHz的带宽。用户可以独享带宽,不会因为上网人数的增加而导致上网速率的降低。更为重要的是ADSL价格低廉,能为普通消费者所接受。目前国内的各大运营商和宽带接入提供商正在如火如荼地进行宽带革命。中国电信推出“ADSL网络快车”,并且已经圈定了大规模的用户群;中国网通也有类似的市场规模。另一方面,VoIP语音业务也飞速发展。目前国内大多数VoIP语音接入终端多为LAN方式。主要用户对象集中于智能化小区、校园、话吧等。由于大多数家庭用户的宽带接入为ADSL方式,运营商不得不考虑到目前的ADSL用户对VoIP语音业务的需求。所以,如果VoIP的终端设备支持PP-PoE的接入方式,只要将VoIP的终端设备挂到AD-SLMODEM下就可以提供VoIP语音业务。VoIP终端设备的软件大多都基于嵌入式操作系统。VxWorks是WRS(Wind River Systems Inc.)推出的嵌入式实时操作系统。VxWorks以无可比拟的高效能、高可靠性、高效的调试工具和稳定、高效的网络协议等优点在高端通信市场占据了优势地位,太多数通讯设备都采用VxWorks作为操作系统。本文详细介绍PPP、PPPoE协议在VxWorks下的具体实现。
2 PPP和PPPOE协议
IP接入的功能包括动态IP地址分配、AAA和ISP动态选择,实现这些功能通常需要用到一个著名的接入协议即PPP协议,PPP协议是一成熟的IP接入协议,支持多种协议封装,实现简单,易于与现有的ISP配合。它具有链路层和网络层配置和协商功能,可方便地自动分配TP。PPP本身也是一个数据链路层协议,它可采用不同的传输机制传送。常用的有HDLC、ATM和以太网。承载在以太网上的称为PPPoE(PPP over Ethernet)。
2.1 PPPoE协议
RFC2516定义了一种在以太网上传送PPP的方法即PPPoE。PPPoE分为二个阶段,即Discovery(地址发现)阶段和PPP会话阶段。当某个主机希望发起一个PPPoE会话时,它必须首先执行Discovery来确定对方的以太网MAC地址并建立起一个PP-PoE会话标识符SESSION_ID。虽然PPP定义的是端到端的对等关系,Discovery却是天生的一种客户端-服务器关系。在Discovery的过程中,主机(作为客户端)发现某个访问集中器(Access Concentrator,作为服务器),根据网络的拓扑结构,主机能够与不只一个的访问集中器通信。Discovery阶段允许主机发现所有的访问集中器并从中选择一个。当Discovery阶段成功完成后,主机和访问集中器二者都具备了用于在以太网上建立点到点连接所需的所有信息。
(1)PPPoE的帧格式和种类
Discovery阶段所有的以太网帧的ETHER_TYPE域都设置为0x8863。PPP会话阶段以太网帧的ETHER_TYPE域都设置为0x8864。PPPoE的payload部分包含O个或多个TAG。一个TAG是一个TLV(type-length-value)结构,TAG_TYPE域为16位值(网络字节序),RFC2516标准附录A列出了各种TAG_TYPE和TAG_VALUE。PPPoE的帧格式如图l所示。
PPPoE discovery阶段有5种基本的帧,分别为PPPoE Active Discovery Initiation (PADI)、PPPoE Active Discovery Offer(PADO)、PPPoE Active Discovery Request (PADR)、PPPoE Active Discovery Sessionconfirmation (PADS)、PPPoE Active Discovery Terminate(PADT)。
(2)PPPoE的工作流程
PPPoE包含二个阶段:Discovery搜索阶段和Session会话阶段。PPPoE Discovery的主要步骤为:
●主机发送PADl分组,其目的地址为广播地址,会话IAD为0(未分配);
●任一接入服务器收到PADI并任提供所需的服务时,就回送PADO分组,会话IAD为O;
●主机可能收到多个PADO,根据服务及其提供的服务选定一个服务器,然后向该服务器发送PADR分组,其目的地址为该服务器的单播地址。会话ID为0(未分配);
●该服务器收到PADR后生成一个唯一的会话ID,向主机回送PADS分组,准备启动PPP。
当搜索阶段完成后,PPPoE的Host主机从接入服务器AC获取一个Session ID。搜索成功后主机和接入服务器之间就可以建立Ethernet的PPP连接,进入PPP会话阶段。
2.2 PPP协议
(1)PPP协议组成
PPP协议由IETF RFCl661定义,主要包含4个部分:
●帧封装的方法;
●链路控制协议(LCP-Link Control Protocol),完成线路的启动、测试、任选参数的协商和最终线路断开功能;
●网络控制协议(NCP),最常用的NCP协议为IP控制协议IPCP。它的一个重要功能就是动态分配IP地址;
●用户认证,主要通过LCP协商采用何种认证协议,但认证协议本身不是PPP协议的范围。
PPP可分为三个阶段:LCP协商、认证和NCP协商。从协议上来说可以分为三个子层,每层可向相邻的子层发送“Up”或“Down”事件。“Up”表示该层已激活,“Down”表示该层已终结。就整个接入过程而言,还可以认为LCP之下还有一个物理层,在每个NCP之上还有一个网络接口。
一个子层的激活(Up)需具有三个事件:上层发出“打开”(Open)请求,下层收到“Up”事件;本层协商成功。
协议的基本过程为:用户通过某个接口请求建立链路,此时Open事件发送到PPP的LCP子层,当LCP启动后,即请求建立物理链路,开始PPPoE协商,当PPPoE协商成功后,就向LCP层发送Up事件。然后LCP向对端发送协商请求,双方确定链路的配置参数后,LCP向认证层发送Up事件。认证成功后,在向NCP层发Up事件。如不需要认证,则可直接向NCP层发送up事件。NCP协议收到Up事件后开始NCP处理。例如IPCP协议将开始协商IP地址等。PPP正常终结过程是,每个NCP分别终结,然后LCP终结,最后物理层终结。但PPP实现必须能够处理物理链路自行断开、NCP尚未终结时LCP先行终结的异常情况。
(2)PPP的封装格式
PPPP的封装格式如下:
发送的顺序是从左到右。Protocol定义被封装的数据报的协议类型,最常用的几种定义为:
3 在VxWorks下的实现
3.1 PPP和PPPoE数据包收发处理流程
为了更清楚地介绍VxWorks下的PPP和PPPoE数据包收发处理流程,先介绍一下Vx-Works下的TCP/IP协议栈的结构。
PPP和PPPoE在VxWorks TCP/IP协议栈中的位置如下:
VxWorks的TCP/IP协议栈与标准的BSD的TCP/IP协议的最大不同在于加入了MUX层。MUX层的作用是负责管理协议层和驱动层之间的相互作用,使协议层和驱动层相互透明。从而使一个VxWorks操作系统可以同时支持多个协议和驱动。PPP和PPPoE都属于链路层的协议,所以介于MUX和IP层之间。
PPPoE层主要实现PPPoE拨号过程和对上层PPP的数据包进行PPPoE封装。PPPoE通过MUX层的接口发送方向采用以太网发送函数ehterOutput发送数据包,接收方向主要是调用VxWorks提供的增加钩子函数etherInputHookAdd添加自己的以太网钩子函数对以太网帧类型为0x8863和0x8864的包进行处理。如帧类型为0x8863,则为PPPoE Dis-covery包,如为0x8864,则为PPPoE Session阶段的包经拆封处理后送到PPP层处理。
PPP层软件主要实现LCP链路建立、PPP认证、IPCP协商IP地址和对IP数据包的PPP封装等功能。
PPP层与IP层的接口主要通过再添加一个if_PPP的网络接口。从IP层看来if_PPP接口和普通的网口设备没什么不同。if_ppp作为VxWorks TCP/IP协议栈中的一个网络接口,可以封装IP数据包,并且在PPP的链路上收发IP包。PPP和PPPoE层也有相应接口函数。发送方向PPP的数据包(无论是IP还是LCP、IPCP)都通过PPPoE层封装后发送出去;接收方向,PPPoE层收到包先进行判断,如是PPF包,就交PPP层处理。PPP层根据协议类型分发到LCP、IPCF、IP等相关模块进行处理。整个PPP和PPPoE的收发包处理流程如图2所示。
3.2 PPP和PPPoE软件模块设计
整个PPPoE、PPP软件由PPP、PPP Adapter、PP-
PoE Discovery、PPPoE Session、PPPoE Timer、PPPoE Adpater、PPPoE Config模块组成,如图3所示。
1)PPP模块主要实现LCP、IPCP和认让协议(chap、pap)等,PPP还实现一个虚拟的ifnet接口,实现对上层IP报的封装和分发处理。
2)PPP Adpater模块主要实现PPP和PPPoE模块之间的接口适配。
3)PPPoE Discoverv模块实现PPPoE的Discov-ely阶段的处理。
4)PPPoE Session模块实现PPPoE的Session阶段的处理,主要是PPPoE封装和解包处理。
5)PPPoE Timer模块主要实现PPPoE模块的定时处理功能,用于PPPoE Discovery阶段的状态机切换处理。
6)PPPoE Adapater模块主要实现PPPoE的包的收发处理。
7)PPPoE Config模块主要实现PPP和PPPoE的相关配置功能。如配置用户名密码等。
4 结束语
本文介绍应用PPP和PPPoE协议实现VoIP的语音接人方法,详细介绍了PPP、PPPoE协议的原理,讨论了PPP和PPPoE协议在VxWorks操作系统下的具体实现,具有一定的工程应用价值。