modem接入技术面临一些相互矛盾的目标,既要通过同一个用户前置接入设备连接远程的多个用户 主机,又要提供类似拨号一样的接入控制,计费等功能,而且要尽可能地减少用户的配置操作。PPPoE的目标就是解决上述问题,1998年后期问世的 以太网上 点对点协议(PPPoverEthernet)技术是由Redback网络公司、客户端软件开发商RouterWare公司以及Worldcom子公司UUNET Technologies公司在IETFRFC的基础上联合开发的。通过把最经济的 局域网技术-以太网和点对点协议的可扩展性及管理控制功能结合在一起, 网络服务提供商和电信运营商便可利用可靠和熟悉的技术来加速部署高速互联网 业务。它使服务提供商在通过 数字用户线、 电缆调制解调器或无线连接等方式,提供支持多用户的宽带接入服务时更加简便易行。同时该技术亦简化了最终用户在选择这些服务时的配置 操作。
PPPoE: 以太网上的 PPP
(PPPoE:Point to Point Protocol over Ethernet)
在 以太网上承载 PPP协议(点到点 连接协议),它利用以太网将大量 主机组成网络,通过一个远端接入设备连入 因特网,并对接入的每一个主机实现控制、计费功能。极高的性能价格比使PPPoE在包括小区组网建设等一系列应用中广泛采用
PPPoE 的 以太网有效载荷显示如下:
PPPOE
VER (4bit) |
TYPE (4bit) |
CODE (8bit) |
SESSION-ID (16bit) |
LENGTH (16bit) |
净载荷(或数据域) |
PPPOE帧格式一共为48位 8字节 |
VER ― PPPOE 版本。必须设置为 0x1。
TYPE ― 必须设置为 0x1。
CODE ― Discovery 和 PPP Session 阶段有定义。
SESSION_ID ― 无符号值。Discovery 数据包中有该字段定义。对于特定的 PPP Session 而言,该值为固定值。实际上,该字段定义了包括 以太网 SOURCE_ADDR 和 DESTINATION_ADDR 的 PPP。0xffff 作为预留值,不作使用。
LENGTH ― 表示 PPPoE 有效载荷长。不包括以太网或 PPPoE 头的长度。
随着低成本的宽带技术变得日益流行, DSL(Digital Subscriber Line)数字用户线技术更是使得许多计算机在互联网上能够酣畅淋漓的冲浪了。但是这也增加了DSL服务提供商们对于网络安全的担心。
通过ADSL方式上网的计算机大都是通过以太网卡(Ethernet)与互联网相连的。同样使用的还是普通的TCP/IP方式,并没有附加新的协议。另外一方面, 调制解调器的 拨号上网,使用的是PPP协议,即Point to Point Protocol, 点到点协议,该协议具有 用户认证及通知IP地址的功能。PPP over Ethernet(PPPoE)协议,是在 以太网络中转播PPP帧信息的技术,尤其适用于DSL等方式。
VER (4bit) |
TYPE (4bit) |
CODE (8bit) |
SESSION-ID (16bit) |
LENGTH (16bit) |
净载荷(或数据域) |
PPPOE帧格式一共为48位 8字节 |
PPPOE(3)PPPoE协议的工作流程包含发现和会话两个阶段,发现阶段是无状态的,目的是获得PPPoE终结端(在 局端的ADSL设备上)的 以太网MAC地址,并建立一个唯一的PPPoE SESSION-ID。发现阶段结束后,就进入标准的PPP会话阶段。
当一个 主机想开始一个PPPoE会话,它必须首先进行发现 阶段,以识别局端的以太网MAC地址,并建立一个PPPoE SESSION-ID。在发现阶段,基于网络的拓扑,主机可以发现多个接入集中器,然后允许用户选择一个。当发现阶段成功完成,主机和选择的接入集中器都有了他们在以太网上建立PPP连接的信息。直到PPP会话建立,发现阶段一直保持无状态的 Client/Server(客户/ 服务器)模式。一旦PPP会话建立, 主机和接入集中器都必须为PPP虚接口分配资源。 PPPoE协议会话的发现和会话两个阶段具体进程如下。
在发现(Discovery)阶段中用户 主机以类似广播的方式寻找所连接的所有接入集中器(或 交换机),并获得其 以太网MAC地址。然后选择需要访问的接入 集中器,并确定所要建立的PPP会话唯一标识号码。发现阶段有4个步骤,当此阶段完成,通信的两端都知道PPPoE SESSION-ID和对端的以太网地址,他们一起唯一定义PPPoE会话。这4个步骤如下。
(1)主机广播发起分组(PADI),分组的目的地址为以太网的 广播地址0xffffffffffff,CODE(代码)字段值为0x09,SESSION-ID(会话ID)字段值为0x0000。PADI分组必须至少包含一个服务名称类型的标签(标签类型字段值为0x0101),向接入集中器提出所要求提供的服务。
(2)接入集中器收到在服务范围内的PADI分组,发送PPPoE有效发现提供包(PADO)分组,以响应请求。其中CODE字段值为0x07,SESSION-ID字段值仍为0x0000。PADO分组必须包含一个接入集中器名称类型的标签(标签类型字段值为0x0102),以及一个或多个服务名称类型标签,表明可向 主机提供的服务种类。
(3)主机在可能收到的多个PADO分组中选择一个合适的PADO分组,然后向所选择的接入集中器发送PPPoE有效发现请求分组(PADR)。其中CODE字段为0x19,SESSION_ID字段值仍为0x0000。PADR分组必须包含一个服务名称类型标签,确定向接入 集线器(或 交换机)请求的服务种类。当主机在指定的时间内没有接收到PADO,完整它应该重新发送它的PADI分组,并且加倍等待时间,这个过程会被重复期望的次数。
(4)接入集中器收到PADR分组后准备开始PPP会话,它发送一个PPPoE有效发现会话确认PADS分组。其中CODE字段值为0x65,SESSION-ID字段值为接入集中器所产生的一个唯一的PPPoE会话标识号码。PADS分组也必须包含一个接入集中器名称类型的标签以确认向 主机提供的服务。当主机收到PADS分组确认后,双方就进入PPP会话阶段。
用户 主机与接入集中器根据在发现阶段所协商的PPP会话连接参数进行PPP会话。一旦PPPoE会话开始,PPP数据就可以以任何其他的PPP封装形式发送。所有的 以太网帧都是 单播的。PPPoE会话的SESSION-ID一定不能改变,并且必须是发现阶段分配的值。
PPPoE还有一个PADT分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话,也就是会话释放。它可以由主机或者接入集中器发送。当对方接收到一个PADT分组,就不再允许使用这个会话来发送PPP业务。PADT分组不需要任何标签,其CODE字段值为0xa7,SESSION-ID字段值为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用PADT。
以上各个阶段的会话流程可用图4-5描述。
1. 在STA和AP之间建立好关联之后,客户端向AC设备发送一个PADI报文,开始PPPOE接入的开始。
2.AC向客户端发送PADO报文。
3. 客户端根据回应,发起PADR请求给AC。
4. Ac产生一个session id,通过PADS发给客户端。
5. 客户端和AC之间进行PPP的LCP协商,建立链路层通信。同时,协商使用 PAP、 CHAP认证方式。
6. AC通过Challenge报文发送给认证客户端,提供一个128bit的Challenge。
7. 客户端收到Challenge报文后,将密码和Challenge做 MD5算法后的Challenge—Password,在Response回应报文中把它发送给AC设备。
8. Ac将Challenge、challenge-Password和用户名一起送到RADIus用户认证服务器,由RADIUS用户认证服务器进行认证。
9.RADIUS用户认证服务器根据用户信息判断用户是否合法,然后回应认证成功/失败报文到AC。如果成功,携带协商参数,以及用户的相关业务属性给用户授权。如果认证失败,则流程到此结束。
10.AC将认证结果返回给客户端。
l 1.用户进行NCP(如IPCP)协商,通过AC获取到规划的IP地址等参数。
12.认证如果成功,AC发起计费开始请求给RADIUS用户认证服务器。
13.RADIUS用户认证服务器回应计费开始请求报文。用户上线完毕,开始上网 [2] 。 PPPOE
假如客户端要通过一个 局域网与远程的 PPPoE服务器进行 身份验证,这时,它们会有两个不同的会话阶段,Discovery阶段和PPP会话阶段。当一个客户端想开始一个PPPoE会话时,它必须首先进行发现阶段以识别对端的 以太网MAC地址,并建立一个PPPoESESSON_ID。在发现阶段,基于网络的 拓扑结构,客户端可以发现多个PPPoE 服务器,然后从中选择一个,不过通常都是选择反应最快的一个。
Discovery阶段是一个无状态的阶段,该阶段主要是选择 接入服务器,确定所要建立的PPP会话 标识符Session ID,同时获得对方点到点的连接信息;PPP会话阶段执行标准的PPP过程。当此阶段完成,通信的两端都知道PPPoESESSON_ID和对端的 以太网地址,它们一起定义了一个唯一的PPPoE会话。这些步骤包括客户端广播一个发起分组(PADI),一个或多个PPPoE服务器发送响应分组(PADO),客户端向选中的服务器发送请求分组(PADR),选中的PPPoE服务器发送一个确认分组(PADS)给客户端。当客户端接收到确认分组,它可以开始进行PPP会话阶段。当PPPoE 服务器发送出确认分组,它可以开始PPP会话。
当客户端在指定的时间内没有接收到PADO,它应该重新发送它的PADI分组,并且加倍等待时间,这个过程会被重复期望的次数。如果客户端正等待接收PADS,应该使用具有客户端重新发送PADR的相似超时机制。在重试指定的次数后, 主机应该重新发送PADI分组。PPPoE还有一个PADT分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话。它可以由客户端或者PPPoE服务器发送。当接收到一个PADT,不再允许使用这个会话来发送PPP业务在发送或接收PADT后,即正常的PPP不能使用时,可以使用PADT,一旦PPPoE会话开始,PPP数据就可以以任何其它的PPP封装形式发送。所有的以太网帧都是 单播的, 身份验证是发生在会话阶段的,PPPoE会话的SESSION_ID一定不能改变,并且必须是发现阶段分配的值。
PPPOE(3)建立PPPoE通道(ADSL拨号)分两个阶段:发现阶段和PPP会话阶段。
在发现阶段, 以太网上的客户机要找到一个访问集中器(AC,Access Concentrator),也就是局端的AC,不是客户端的那个猫,发现阶段完成后,客户机和AC都得到要在以太网上建立PPP通道的相关信息。
发现阶段是无状态的,也就是两边都不用保存以前的状态信息;只有PPP会话开始后,双方就要建立一个虚拟的PPP通信接口,具体在Linux下会有ppp0网卡,在windows下网络连接中增加ADSL的接口。
2.1 协议值
PPPoE数据是直接在以太头数据之上的,其等级和ARP、IP等是相同的,在以太头的类型字段中,用0x8863 表示是PPPoE发现阶段数据,用0x8864表示PPP会话阶段数据,如下所示。(类比:0x0800表示IP数据,0x0806表示ARP数据)
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
Destination_ADDR (6 octets) |
||||||||||||||||
Source_ADDR (6 octets) |
||||||||||||||||
Ether_TYPE (2 octets) |
||||||||||||||||
payload |
||||||||||||||||
Checksum |
2.2PPPoE协议头
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
VER |
TYPE |
CODE |
SESSION_ID | ||||||||||||
LENGTH |
payload |
PPPOE协议头有6个字节,正好和14字节的以太头实现了4字节对齐,包括以下字段:
VER:版本号,4位,必须为0x01.TYPE:类型,4位,必须是0x01.CODE:8位,在发现阶段和PPP会话阶段有不同的定义,表示PPPOE数据类型.SESSION_ID:16位,用来定义一个PPP会话,在发现过程中定义。LENGTH:16位,表示负载长度,不包括以太头和PPPOE头。
2.3 CODE域
CODE域值
|
包类型 |
0x09 | PADI(PPPoE Active Discovery Initiation) |
0x07
|
PADO(PPPoE Active Discovery Offer) |
0x19
|
PADR(PPPoE Active Discovery Request) |
0x65
|
PADS(PPPoE Active Discovery Session-confirmation) |
0xa7
|
PADT(PPPoE Active Discovery Terminate) |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
Destination_ADDR (6 octets) |
||||||||||||||||
Source_ADDR (6 octets) |
||||||||||||||||
Ether_TYPE (2 octets) |
||||||||||||||||
payload |
||||||||||||||||
Checksum |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
VER |
TYPE |
CODE |
SESSION_ID | ||||||||||||
LENGTH |
payload |
CODE域值
|
包类型 |
0x09 | PADI(PPPoE Active Discovery Initiation) |
0x07
|
PADO(PPPoE Active Discovery Offer) |
0x19
|
PADR(PPPoE Active Discovery Request) |
0x65
|
PADS(PPPoE Active Discovery Session-confirmation) |
0xa7
|
PADT(PPPoE Active Discovery Terminate) |
PPPoE发现阶段数据的以太类型是0x8863。
3.1 TAG
在发现阶段用于交换客户机和AC的信息,建立PPPoE通道,负载信息都是PPPoE信息,并没有上层协议数据。
发现阶段的负载称为TAG,一个TAG信息格式如下,负载信息中可能会包含多个TAG:
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
TAG_TYPE |
TAG_LENGTH |
||||||||||||||
TAG_VALUE |
TAG_TYPE:16位,表示TAG类型
TAG_LENGTH:16位,表示TAG_VALUE部分的长度
TAG_VALUE:TAG值
TAG_TYPE可取以下值(注意第一字节为2表示是错误信息):
0x0000 End-Of-List
0x0101 Service-Name
0x0102 AC-Name
0x0103 Host-Uniq
0x0104 AC-Cookie
0x0105 Vendor-Specific
0x0110 Relay-Session-Id
0x0201 Service-Name-Error
0x0202 AC-System-Error
0x0203 Generic-Error
3.2 PPPoE主动发现初始包
PPPoE主动发现初始包(PPPoE Active Discovery Initiation,PADI)由客户机发出,以太头中的目的地址是以太广播地址FF:FF:FF:FF:FF:FF,PPPoE头中的CODE为0x09,SESSION_ID值必须为0,负载部分必须只包含一个Service-Name类型的TAG表示请求的服务类型,另外可以包含其他TAG,整个PPPoE包不能超过1484字节,这样省出的16字节可以由ADSL中继设备添加中继TAG。
一个PADI包的例子为:
01 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
|||
0xffffffff |
||||||||||||||||||
0xffff |
Host_mac_addr |
|||||||||||||||||
SESSION_ID=0x0000 |
LENGTH =0x0004 |
|||||||||||||||||
TAG_TYPE = 0x0101 |
TAG_LENGTH = 0x0000 |
3.3 PPPoE主动发现提议包
PPPoE主动发现提议包(PPPoE Active Discovery Offer,PADO)由AC发出,用来回应客户机的PADI包,以太头中的目的地址是客户机的MAC地址,PPPOE头中的CODE为0x07,SESSION_ID值必须为0,负载部分必须包含一个AC-Name类型的TAG,用来指示本AC的名称,一个在PADI包中指定的Service-Name的TAG,另外可以包含其他Service-Name的TAG。如果AC不对该客户机提供服务,AC就不回应PADO包。一个PADO包的例子为:
01 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
|||
Host_mac_addr |
||||||||||||||||||
Host_mac_addr (cont) |
Access_Concentrator_mac_addr |
|||||||||||||||||
Access_Concentrator_mac_addr (cont) |
||||||||||||||||||
ETHER_TYPE = 0x8863 |
v=1 |
t=1 |
CODE=0x07 |
|||||||||||||||
SESSION_ID=0x0000 |
LENGTH =0x0020 |
|||||||||||||||||
TAG_TYPE = 0x0101 |
TAG_LENGTH = 0x0000 |
|||||||||||||||||
TAG_TYPE = 0x0102 |
TAG_LENGTH = 0x0018 |
|||||||||||||||||
0x47 |
0x6f |
0x20 |
0x52 |
|||||||||||||||
0x65 |
0x64 |
0x42 |
0x61 |
|||||||||||||||
0x63 |
0x6b |
0x20 |
0x2d |
|||||||||||||||
0x20 |
0x65 |
0x73 |
0x68 |
|||||||||||||||
0x73 |
0x68 |
0x65 |
0x73 |
|||||||||||||||
0x68 |
0x6f |
0x6f |
0x74 |
3.4 PPPoE主动发现请求包
PPPoE主动发现请求包(PPPoE Active Discovery Request,PADR)由客户机发出,因为可能会有多个AC对客户机发出的PADI包回应了PADO包,客户机从回应的PADO包中选择一个AC发送PADR包,以太头中的目的地址是该AC的MAC地址,PPPoE头中的CODE为0x19,SESSION_ID值必须为0,负载部分必须只包含一个Service-Name类型的TAG表示请求的服务类型,另外可以包含其他TAG。
3.5 PPPoE主动发现会话确认包
PPPoE主动发现会话确认包(PPPoE Active Discovery Session-confirmation,PADS)由AC发出,收到客户机的PADR包后,AC将产生一个SEESSION_ID值用来标志本次PPP会话,以PADR包方式发送给客户机。以太头中的目的地址是客户机的MAC地址,PPPoE头中的CODE为0x65,SESSION_ID值必须为所生成的那个SESSION_ID,负载部分必须只包含一个Service-Name类型的TAG,表示该服务类型被AC接受,另外可以包含其他TAG。如果AC不接受PADR中的Server-Name,PADS中则包含一个Service-Name-Error类型的TAG,这时SESSION_ID设置为0。
3.6 PPPoE主动发现停止包
PPPoE主动发现停止包(PPPoE Active Discovery Terminate,PADT)表示PPPoE会话过程的结束,AC和客户机都可以主动发出。以太头中的目的地址是对方的MAC地址,PPPoE头中的CODE为0xa7,SESSION_ID值必须为PPPoE会话过程的SESSION_ID,不需要TAG。
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
TAG_TYPE |
TAG_LENGTH |
||||||||||||||
TAG_VALUE |
01 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
2 3 |
4 5 |
6 7 |
8 9 |
0 1 |
|||
0xffffffff |
||||||||||||||||||
0xffff |
Host_mac_addr |
|||||||||||||||||
SESSION_ID=0x0000 |
LENGTH =0x0004 |
|||||||||||||||||
TAG_TYPE = 0x0101 |
TAG_LENGTH = 0x0000 |