pppoe,全称point-to-point protocol over ethernet,它工作在osi的数据链路层,pppoe协议提供了在广播式的网络(如以太网)中多台主机连接到远端的访问集中器(我们对目前能完成上述功能的设备为宽带接入服务器)上的一种标准。
pppoe协议共包括两个阶段,即pppoe的发现阶段(pppoe discovery stage)和pppoe的会话阶段(pppoe session stage)。而两者的主要区别在于只是在ppp的数据报文前封装了pppoe的报文头。
当一个主机希望能够开始一个pppoe会话时,它首先会在广播式的网络上寻找一个访问集中器,当然可能网络上会存在多个访问集中器时,对于主机而言则会根据各访问集中器(ac,access concentration)所能提供的服务或用户的预先的一些配置来进行相应的选择。当主机选择完了所需要的访问集中器后,就开始和访问集中器建立一个pppoe会话进程。在这个过程中访问集中器会为每一个pppoe会话分配一个唯一的进程id,会话建立起来后就开始了pppoe的会话阶段,在这个阶段中已建立好点对点连接的双方(这种点对点的结构与ppp不一样,它是一种逻辑上的点对点关系)就采用ppp协议来交换数据报文,从而完成一系列ppp的过程,最终将在这点对点的逻辑通道上进行网络层数据报的传送。
我们简要介绍一下pppoe的数据报文格式。pppoe的数据报文是被封装在以太网帧的数据域内的。简单来说我们可能把pppoe报文分成两大块,,一大块是pppoe的数据报头,另一块则是pppoe的净载荷(数据域),对于pppoe报文数据域中的内容会随着会话过程的进行而不断改变。下图1为pppoe的报文的格式:
版本 | 类型 | 代码 | 会话id |
长度域 | 净载荷(或数据域) |
图1 pppoe数据报格式
这里我们主要来介绍一下pppoe发现阶段的报文格式以及它的报文:
1) 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 | 一般性错误。 |
2) pppoe发现阶段的数据报文
pppoe的发现阶段可分为四步,其实这个过程也是pppoe四种数据报文的交换的一个过程。当完成这四步后,用户主机与访问集中器双方就能获知对方的mac地址和唯一的会话id号,从而进入到下一个阶段(pppoe的会话阶段)。实际上双方在互相知道了对方的mac地址后,就已经在广播式的网络上确定了一一的对应关系,为了保证这个连接的有效性,同时使pppoe协议能更加灵活的运用,因此还加入了会话id字段,通过这两个条件就可完成确定双方点对点的关系。
在这个阶段一开始,由于接入用户并不知道访问集中器的mac地址,则使用类似于arp解析的过程的机制来获取访问集中器的mac地址。首先由接入用户侧发起一个初始化的广播报文,对于访问集中器如果配置了pppoe的业务时,它会时实检测网络上的数据包,当发现以太网数据帧中所承载的是pppoe报文时(通过协议域的内容来区分),就会将其交给相应的模块去处理。当收到初始化报文后,访问集中器会向该用户回应一个报文。如果网络上存在很多这样的访问集中器且都收到了用户侧发送的初始化报文时,它们也都会向用户侧会送一个确认报文,如果该用户收到这个报文后,则会依据报文中所携带的内容或本端的一些配置来选择一个唯一的访问集中器进行会话。到此时已完成了前两步了,那么剩下的两步则是协商一些所提供的服务选项和获取pppoe会话阶段所必须的会话id值。
说明:在这个阶段,所有数据报文是被承载在以太网的数据域中的,而且以太网数据帧的协议域始终为0x8863。
在pppoe发现阶段的四步的过程中,pppoe会遇到padi、pado、padr和pads这四种报文。pppoe中的padt报文是用来终止一条会话的。
pppoe发现阶段的第一步,也即是由用户侧首先发送这样一个报文。用户主机是以广播的方式发送这个报文,所以该报文所对应的以太网帧的目的地址域应填充为全1,而源地址域填充用户主机的mac地址。广播包可能会被多个访问集中器接收到。
pppoe发现阶段的第二步,也即是由访问集中器回应各用户主机发送的padi报文,此时该报文所对应的以太网帧的源地址填充访问集中器的mac地址,而目的地址则填充从padi中所获取的用户主机的mac地址。
pppoe发现阶段的第三步,也即是由用户主机向访问服务器发送单播的请求报文。当用户主机收到pado报文后,会从这些报文中挑选一个访问集中器作为后续会话的对象。由于用户主机在收到pado报文后,就获知了访问集中器的mac地址,因此padr报文所以应的以太网帧的源地址填充用户主机的mac地址,而以太网的目的地址填充为访问集中器的mac地址。
pppoe发现阶段的第四步,也即是最后一步,此时访问集中器当收到padr报文时,就准备进入开始一个ppp的会话了,而此时访问集中器会为在这个会话分配一个唯一的会话进程id,并在发送给主机的pads报文中携带上这个会话id。当然如果访问集中器不满足用户所申请的服务的话,则会向用户发送一个pads报文,而其中携带一个服务名错误的标记,而且此时该pads报文中的会话id填充0x0000。
padt报文可能在会话进行开始之后的任意时间内被发送,主要是用来终止一个pppoe会话的止。它可以由主机或访问集中器发送,目的地址填充为对端的以太网的mac地址
我们使用科来网络分析系统捕获pppoe数据包,如图3,
图3 pppoe discovery的详细解码
查看科来网络分析系统中的详细解码,可以看出这是pppoe发现阶段的第一步的padi报文,我们来详细说明: