本文主要是介绍PPPoE工作原理以及PPPoE帧格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PPPoE工作原理以及PPPoE帧格式
PPPoE协议的工作流程包含发现和会话两个阶段,发现阶段是无状态的,目的是获得 PPPoE终结端(在局端的ADSL设备上)的以太网MAC地址,并建立一个惟一的PPPoESESSION-ID。发现阶段结束后,就进入标准的PPP会话阶段。
当一个主机想开始一个 PPPoE会话,它必须首先进行发现阶段,以识别局端的以太网MAC地址,并建立一个PPPoE SESSION-ID。在发现阶段,基于网络的拓扑,主机可以发现多个接入集中器,然后允许用户选择一个。当发现阶段成功完成,主机和选择的接入集中器都有了他们在以太网上建立PPP连接的信息。直到PPP会话建立,发现阶段一直保持无状态的Client/Server(客户/服务器)模式。一旦PPP会话建立,主机和接入集中器都必须为PPP虚接口分配资源。
PPPoE协议会话的发现和会话两个阶段具体进程如下。
1.发现(Discovery)阶段
在发现( Discovery)阶段中用户主机以广播方式寻找所连接的所有接入集中器(或交换机),并获得其以太网MAC地址。然后选择需要连接的主机,并确定所要建立的PPP会话标识号码。发现阶段有4个步骤,当此阶段完成,通信的两端都知道PPPoE SESSION-ID和对端的以太网地址,他们一起唯一定义PPPoE会话。这4个步骤如下。
(1) 主机广播发起分组( PADI)( PPPOE Active Discovery Initiation),分组的目的地址为以太网的广播地址0×ffffffffffff,CODE(代码)字段值为0×09,SESSION-ID(会话ID)字段值为0×0000。PADI分组必须至少包含一个服务名称类型的标签(标签类型字段值为0×0101),向接入集中器提出所要求提供的服务。
(2) 接入集中器收到在服务范围内的 PADI分组,发送PPPoE有效发现提供包( PADO)( PPPOE Active Discovery Offer)分组,以响应请求。其中CODE字段值为0×07,SESSION-ID字段值仍为0×0000。PADO分组必须包含一个接入集中器名称类型的标签(标签类型字段值为0×0102,以及一个或多个服务名称类型标签,表明可向主机提供的服务种类。
(3) 主机在可能收到的多个 PADO分组中选择一个合适的PADO分组,然后向所选择的接入集中器发送PPPoE有效发现请求分组( PADR)( PPPOE Active Discovery Request)。其中CODE字段为0×19,SESSION_ID字段值仍为0×0000。PADR分组必须包含一个服务名称类型标签,确定向接入集线器(或交换机)请求的服务种类。当主机在指定的时间内没有接收到PADO,它应该重新发送它的PADI分组,并且加倍等待时间,这个过程会被重复期望的次数。
(4) 接入集中器收到 PADR分组后准备开始PPP会话,它发送一个PPPoE有效发现会话确认( PADS)( PPPOE Active Discovery Session-confirmation)分组。其中CODE字段值为0×65,SESSION-ID字段值为接入集中器所产生的一个惟一的PPPoE会话标识号码。PADS分组也必须包含一个接入集中器名称类型的标签以确认向主机提供的服务。当主机收到PADS分组确认后,双方就进入PPP会话阶段。
2.PPP会话阶段
用户主机与接入集中器根据在发现阶段所协商的 PPP会话连接参数进行PPP会话。一旦PPPoE会话开始,PPP数据就可以以任何其他的PPP封装形式发送。所有的以太网帧都是单播的。PPPoE会话的SESSION-ID一定不能改变,并且必须是发现阶段分配的值。
PPPoE还有一个 PADT分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话,也就是会话释放。它可以由主机或者接入集中器发送。当对方接收到一个PADT分组,就不再允许使用这个会话来发送PPP业务。PADT分组不需要任何标签,其CODE字段值为0×a7,SESSION-ID字段值为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用(PADT)(PPPOE Active Discovery Terminate)结束。
PPPoE帧格式
对应于上面介绍的 PPPoE协议工作的两个阶段,PPPoE帧格式也包括两种类型:发现阶段的以太网帧中的类型字段值为0×8863;PPP会话阶段的以太网帧中的类型字段值为0×8864,均已得到IEEE的认可。PPPoE分组帧结构如图4-6所示。
VER (4bit) | TYPE (4bit) | CODE ( 16bit) | SESSION-ID ( 8bit) | LENGTH (16bit) | 净载荷(或数据域) |
PPPOE帧格式 一共为 48位 8字节 图 4-6 |
PPPoE分组中的版本(VER) 字段和类型(TYPE)字段长度均为 4比特,在当前版本PPPoE建议中这两个字段值都固定为0x1。
代码(CODE)字段长度为 8比特,根据两阶段中各种数据包的不同功能而值不同。在PPP会话阶段CODE字段值为0x00,发现阶段中的各步骤中的各种数据分组格式参见前面的介绍。
版本标识号码(SESSION_ID)字段长度为 16比特,在一个给定的PPP会话过程中它的值是固定不变的,其中值0×ffffff为保留值。
长度(LENGTH)字段为 16比特,指示PPPoE净荷长度。发现阶段PPPoE载荷可以为空或由多个标记(TAG)组成,每个标记都是TLV(类型–长度–值)的结构;PPP会话阶段PPPoE载荷为标准的点对点协议包。
数据域,有时也称之为净载荷域,在 PPPOE的不同阶段该域内的数据内容会有很大的不同。在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是PPP的报文。
这里我们主要来介绍一下 PPPOE发现阶段的报文格式以及它的报文:
PPPOE数据报文中Tag(标记)的格式
对于发现阶段的 PPPOE数据报文而言,它的净载荷可能包含零个或多个Tag(标记),实际上这些标记的意义非常类似于PPP配置参数选项,它同样也是要经过协商的。对于PPPOE协议而言,没有像PPP的配置参数选项那样定义了很多细节,而只是一个初略的定义,因此在实际当中实现这个过程会依据不同厂商的设备有不同。首先还是让我们看一下承载在PPPOE报文数据域中的标记封装格式,如图2。
类型 | 长度 |
数据 |
(图 2 标记的封装格式)
从图 2中可以看出,标记的封装格式采用的是大家所熟知的TLV结构,也即是(类型+长度+数据)。标记的类型域为2个字节,下表列出了各种标记类型的含义:
标记类型 | 标记说明 |
0x0000 | 表示PPPOE报文数据域中一串标记的结束,为了保证版本的兼容性而保留,在有些报文中有应用。 |
0x0101 | 服务名,主要用来表明网络侧所能提供给用户的一些服务。 |
0x0102 | 访问集中器名,当用户侧接收到了AC的回应的PADO报文时,就可获从所携带的标记中获知访问集中器的名子,而且还可以据此来选择相应的访问集中器。 |
0x0103 | 主机唯一标识,类似于PPP数据报文中的标识域,主要是用来匹配发送和接收端的,因为对于广播式的网络中会同时存在很多个PPPOE的数据报文。 |
0x0104 | AC-Cookies,主要被用来防止恶意性DOS功击。 |
0x0105 | 销售商的标识符。 |
0x0110 | 中继会话ID,对于PPPOE的数据报文也同样可以像DHCP报文一样被中断到另外的AC上终结,这个字段则是用来维护另一个连接的。 |
0x0201 | 服务名错误,当请求的服务名不被对端所接受时,会在响应的报文中携带这个标记。 |
0x0202 | 访问集中器名出错。 |
0x0203 | 一般性错误。 |
PPPOE发现阶段的数据报文
说明:在这个阶段,所有数据报文是被承载在以太网的数据域中的,而且以太网数据帧的协议域始终为0x8863。
在 PPPOE发现阶段的四步的过程中,PPPOE会遇到PADI、PADO、PADR和PADS这四种报文。PPPOE中的PADT报文是用来终止一条会话的。
PADI报文
PPPOE发现阶段的第一步,也即是由用户首先发送这样一个报文。用户主机是以广播的方式发送这个报文,所以该报文所对应的以太网帧的目的地址域应填充为全 1,而源地址域填充用户主机的MAC地址。广播包可能会被多个访问集中器接收到。
PADO报文
PPPOE发现阶段的第二步,也即是由访问集中器回应各用户主机发送的 PADI报文,此时该报文所对应的以太网帧的源地址填充访问集中器的MAC地址,而目的地址则填充从PADI中所获取的用户主机的MAC地址。
PADR报文
PPPOE发现阶段的第三步,也即是由用户主机向访问服务器发送单播的请求报文。当用户主机收到 PADO报文后,会从这些报文中挑选一个访问集中器作为后续会话的对象。由于用户主机在收到PADO报文后,就获知了访问集中器的MAC地址,因此PADR报文所以应的以太网帧的源地址填充用户主机的MAC地址,而以太网的目的地址填充为访问集中器的MAC地址。
PADS报文
PPPOE发现阶段的第四步,也即是最后一步,此时访问集中器当收到 PADR报文时,就准备进入开始一个PPP的会话了,而此时访问集中器会为在这个会话分配一个唯一的会话进程ID,并在发送给主机的PADS报文中携带上这个会话ID。当然如果访问集中器不满足用户所申请的服务的话,则会向用户发送一个PADS报文,而其中携带一个服务名错误的标记,而且此时该PADS报文中的会话ID填充0x0000。
PADT报文
PADT报文可能在会话进行开始之后的任意时间内被发送,主要是用来终止一个 PPPOE会话的止。它可以由主机或访问集中器发送,目的地址填充为对端的以太网的MAC地址。
这篇关于PPPoE工作原理以及PPPoE帧格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!