(others)PPPOE协议分析1

1.1  PPPOE协议的基本概念

1.1.1  PPPOE协议出现的背景

随着宽带网络技术的不断发展,以xDSL、CableModem和以太网为主的几种主流宽带接入技术的应用已开展的如火如荼。同时又给各大网络运营商们带来了种种困惑,无论使用哪种接入技术,对于他们而言可盼和可求的是如何有效的管理用户,如何从网络的投资中收取回报,因此对于各种宽带接入技术的收费的问题就变得更加敏感。在传统的以太网模型中,我们是不存在所谓的用户计费的概念,要么用户能设置/获取IP地址上网,要么用户就无法上网。IETF的工程师们在秉承窄带拨号上网的运营思路(使用NAS设备终结用户的PPP数据包),制定出了在以太网上传送PPP数据包的协议(Point To Point Protocol Over Ethernet),这个协议出台后,各网络设备制造商也相继推出自已品牌的宽带接入服务器(BAS),它不仅能支持PPPOE协议数据报文的终结,而且还能支持其它许多协议。如华为公司的MA5200(小BAS)和ISN8850(大BAS)。

1.1.2   PPPOE协议简介

PPPOE协议提供了在广播式的网络(如以太网)中多台主机连接到远端的访问集中器(我们对目前能完成上述功能的设备为宽带接入服务器)上的一种标准。在这种网络模型中,我们不难看出所有用户的主机都需要能独立的初始化自已的PPP协议栈,而且通过PPP协议本身所具有的一些特点,能实现在广播式网络上对用户进行计费和管理。为了能在广播式的网络上建立、维持各主机与访问集中器之间点对点的关系,那么就需要每个主机与访问集中器之间能建立唯一的点到点的会话。

PPPOE协议共包括两个阶段,即PPPOE的发现阶段(PPPOE Discovery Stage)和PPPOE的会话阶段(PPPOE Session Stage)。在这篇培训教材中更注重是PPPOE发现阶段的介绍,因为对于PPPOE的会话阶段,可以看成和PPP的会话过程是一样的(可直接参照PPP协议培训教材),而两者的主要区别在于只是在PPP的数据报文前封装了PPPOE的报文头。无论是哪一个阶段的数据报文最终会被封装成以太网的帧进行传送。

当一个主机希望能够开始一个PPPOE会话时,它首先会在广播式的网络(协议中是这样说的,但在实际应用中,可能还要跨跃多点访问的网络,如ATM等,从而就形成了PPPOEOA的数据包)上寻找一个访问集中器,当然可能网络上会存在多个访问集中器时,对于主机而言则会根据各访问集中器(AC,Access Concentration)所能提供的服务或用户的预先的一些配置来进行相应的选择。当主机选择完了所需要的访问集中器后,就开始和访问集中器建立一个PPPOE会话进程。在这个过程中访问集中器会为每一个PPPOE会话分配一个唯一的进程ID,会话建立起来后就开始了PPPOE的会话阶段,在这个阶段中已建立好点对点连接的双方(这种点对点的结构与PPP不一样,它是一种逻辑上的点对点关系)就采用PPP协议来交换数据报文,从而完成一系列PPP的过程,最终将在这点对点的逻辑通道上进行网络层数据报的传送。

1.2 总结

Ÿ        PPPOE协议包括PPPOE的发现阶段和PPPOE的会话阶段

Ÿ        大多数的BAS(宽带接入服务器)都支持PPPOE协议

1.3 思考

1、PPPOE的客户端是依据什么条件来选项访问集中器的?

 


第2章  PPPOE的发现阶段

2.1 PPPOE的初始化过程

PPPOE的初始化过程是至关重要的,它不仅要在广播式的网络上确定一对一的逻辑关系,而且还要为PPPOE的会话阶段准备一些必要条件,如访问集中器唯一分配的会话ID(Session ID)。在介绍PPPOE的发现阶段之前,首先让我们重温一下以太网帧的封装格式,前面也介绍过了,所有的PPPOE的数据报文均是被封装在以太网的数据域(净载荷区)中传送的。

2.1.1   以太网的帧格式

以太网的帧格式对于大多数人来说是并不陌生,而且目前大多数的网络中都在使用以太网2.0版,因此EthernetII就被作为一种事实上的工业标准而广泛使用,如果对以太网不太熟悉或想深入了解的读者,可参考相关局域网技术方面的书籍。下图为以太网的帧格式:

Ÿ        以太网目的地址(目的MAC地址)和以太网源地址(源MAC地址),是我们大家最为熟悉的数据链路层地址。它包括单播地址、多播地址和广播地址,而对于PPPOE协议中要使用到单播地址和广播地址。在PPP的培训教材中也提到了,对于PPP这样的数据链路层协议而言,二层地址通信双方之间已失去了原有的意义。

Ÿ        以太网的类型域也是我们最关心的一个字段,它在1997年以前还一直由施乐公司维护,但后来就交由IEEE802小组维护了。通过这个字段的内容,数据包的接收方可以识别以太网的数据域中承载的是什么协议的数据报文。对于PPPOE的两大阶段,也正是通过以太网的类型域进行区分的。在PPPOE的发现阶段时,以太网的类型域填充0x8863;而在PPPOE的会话阶段时,以太网的类型域填充为0x8864。

Ÿ        数据域(净载荷)主要是用来承载类型域中所指示的数据报文,在PPPOE协议中所有的PPPOE数据报文就是被封装在这个域中被传送。

Ÿ        校验域,主要用来保证链路层数据帧传送的正确性。

2.1.2  PPPOE的数据报文格式

描述完了以太网的帧格式后,我们简要介绍一下PPPOE的数据报文格式。PPPOE的数据报文是被封装在以太网帧的数据域内的。简单来说我们可能把PPPOE报文分成两大块,(虽然这样比较笼统,但还是比较好助于理解),一大块是PPPOE的数据报头,另一块则是PPPOE的净载荷(数据域),对于PPPOE报文数据域中的内容会随着会话过程的进行而不断改变。下图为PPPOE的报文的格式:

Ÿ        PPPOE数据报文最开始的4位为版本域,协议中给出了明确的规定,这个域的内容填充0x01。

Ÿ        紧接在版本域后的4位是类型域,协议中同样规定,这个域的内容填充为0x01。

Ÿ        代码域占用1个字节,对于PPPOE 的不同阶段这个域内的内容也是不一样的,在这里没有用表格的形式将所有代码列出,但在后续章节会给出一些代码与数据报文的对照。

Ÿ        会话ID点用2个字节,当访问集中器还未分配唯一的会话ID给用户主机的话,则该域内的内容必须填充为0x0000,一旦主机获取了会话ID后,那么在后续的所有报文中该域必须填充那个唯一的会话ID值。

Ÿ        长度域为2个字节,用来指示PPPOE数据报文中净载荷的长度。

Ÿ        数据域,有时也称之为净载荷域,在PPPOE的不同阶段该域内的数据内容会有很大的不同。在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是PPP的报文。

2.1.3  PPPOE发现阶段的数据报文

PPPOE的发现阶段可分为四步,其实这个过程也是PPPOE四种数据报文的交换的一个过程。当完成这四步后,用户主机与访问集中器双方就能获知对方的MAC地址和唯一的会话ID号,从而进入到下一个阶段(PPPOE的会话阶段)。实际上双方在互相知道了对方的MAC地址后,就已经在广播式的网络上确定了一一的对应关系,为了保证这个连接的有效性,同时使PPPOE协议能更加灵活的运用,因此还加入了会话ID字段,通过这两个条件就可完成确定双方点对点的关系。

在这个阶段一开始,由于接入用户并不知道访问集中器的MAC地址,则使用类似于ARP解析的过程的机制来获取访问集中器的MAC地址。首先由接入用户侧发起一个初始化的广播报文,对于访问集中器如果配置了PPPOE的业务时,它会时实检测网络上的数据包,当发现以太网数据帧中所承载的是PPPOE报文时(通过协议域的内容来区分),就会将其交给相应的模块去处理。当收到初始化报文后,访问集中器会向该用户回应一个报文。如果网络上存在很多这样的访问集中器且都收到了用户侧发送的初始化报文时,它们也都会向用户侧会送一个确认报文,如果该用户收到这个报文后,则会依据报文中所携带的内容或本端的一些配置来选择一个唯一的访问集中器进行会话。到此时已完成了前两步了,那么剩下的两步则是协商一些所提供的服务选项和获取PPPOE会话阶段所必须的会话ID值。

在这个阶段,前面在讲述以太网帧格式时也特别强调了,所有数据报文是被承载在以太网的数据域中的,而且以太网数据帧的协议域始终为0x8863。

下面我们结合具体的数据报文的内容,来具体的讲解这四步的过程。

2.1.3.1 PPPOE数据报文中Tag(标记)的格式

对于发现阶段的PPPOE数据报文而言,它的净载荷可能包含零个或多个Tag(标记),实际上这些标记的意义非常类似于PPP配置参数选项,它同样也是要经过协商的。对于PPPOE协议而言,没有像PPP的配置参数选项那样定义了很多细节,而只是一个初略的定义,因此在实际当中实现这个过程会依据不同厂商的设备有不同。首先还是让我们看一下承载在PPPOE报文数据域中的标记封装格式:

 

从上图中可以看出,标记的封装格式采用的是大家所熟知的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个字节,它用来指明标记数据域的长度。

Ÿ        标记的数据域中用来放置不同类型标记所对应的相关数据。

2.1.3.2 PADI(PPPOE Active DiscoveryInitiation)报文

PPPOE发现阶段的第一步,也即是由用户侧首先发送这样一个报文。用户主机是以广播的方式发送这个报文,所以该报文所对应的以太网帧的目的地址域应填充为全1,而源地址域填充用户主机的MAC地址。广播包可能会被多个访问集中器接收到,后面会讲到对于接收到PADI报文的访问集中器会使用PADO报文来回应用户主机。

我们来看一下PADI报文中几个域的填充情况,前面已强调过版本域和类型域固定填充0x01,因为两个域各占4位,所以合并为1个字节后应为0x11。PADI报文的代码域填充0x09,会话ID填充0x0000。PADI报文必须含一个由用户侧请求的正确服务名标记,当然还可能携带一些其它的标记,而一个完整的PADI报文(包括PPPOE头)不能超过1484个字节,以便能留下足够的空间给中继代理增加一个中继的会话ID标记。

例1:PADI 数据报文

这个报文中包括两个标记:一个是主机的只唯一标识,另一个则是服务名标记,从上面这个报文中可以看出服务名没有具体实际的内容,说明对于用户主机可以接受任何由访问集中器所提供的服务。

2.1.3.3 PADO(PPPOE Active DiscoveryOffer)报文

PPPOE发现阶段的第二步,也即是由访问集中器回应各用户主机发送的PADI报文,此时该报文所对应的以太网帧的源地址填充访问集中器的MAC地址,而目的地址则填充从PADI中所获取的用户主机的MAC地址。

我们来看一下PADO报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0x07,会话ID填充0x0000。PADO报文中必须包含一个访问集中器名这个标记,同时还要包含对PADI报文中服务名标记的确认标记和对其它标记的一些确认标记。这个过程有点类似于PPP协议中链路建立过程中的Config-Ack报文,当然如果用户主机所申请的服务访问集中器不支持的话,则访问集中器就不会回应PADO报文。

例2:PADO 数据报文

这个报文中包括4个标记,在PADI所提供的标记的基础上又增加了两个标记,一个是访问集中器名,下划线部分即表示访问集中器名(MD5500),而且还包含一个标记结束标记。

2.1.3.4 PADR(PPPOE Active DiscoveryRequest)报文

PPPOE发现阶段的第三步,也即是由用户主机向访问服务器发送单播的请求报文。当用户主机收到PADO报文后,会从这些报文中挑选一个访问集中器作为后续会话的对象。由于用户主机在收到PADO报文后,就获知了访问集中器的MAC地址,因此PADR报文所以应的以太网帧的源地址填充用户主机的MAC地址,而以太网的目的地址填充为访问集中器的MAC地址。

我们来看一下PADR报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0x19,会话ID域填充0x0000。此时PADR报文必须准确地包含一个服务名的标记,指示用户主机申请的服务和其它的标记类型。

例3:PADR 数据报文

 

当收到访问集中器的PADO报文后,用户主机会发送PADR报文,该报文所含的标记域与PADI报文中的一致,但些时用户主机已获知了访问集中器名。

2.1.3.5 PADS(PPPOE Active DiscoverySession-confirmation)报文

PPPOE发现阶段的第四步,也即是最后一步,此时访问集中器当收到PADR报文时,就准备进入开始一个PPP的会话了,而此时访问集中器会为在这个会话分配一个唯一的会话进程ID,并在发送给主机的PADS报文中携带上这个会话ID。当然如果访问集中器不满足用户所申请的服务的话,则会向用户发送一个PADS报文,而其中携带一个服务名错误的标记,而且此时该PADS报文中的会话ID填充0x0000。

我们来看一下PADS报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0x65,会话ID必须设为给这个PPPOE进程所分配的唯一值。

例4:PADS 数据报文

其中下划线部分为访问集中器给这个PPPOE会话分配的唯一会话ID。

2.1.3.6 PADT(PPPOE Active DiscoveryTerminate)报文

PADT报文可能在会话进行开始之后的任意时间内被发送,主要是用来终止一个PPPOE会话的止。它可以由主机或访问集中器发送,目的地址填充为对端的以太网的MAC地址

我们来看一下PADT报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0xA7,会话ID是那个需要被终止的进程,报文中不需要携带任何标记。当收到PADT的时候,不允许再使用当前这个进程发送PPP数据流量。在收到或发送PADT后甚至正常的PPP终止报文也不能被发送。

例5:PADT 数据报文

这个报文中不含有任何标记,而且下划线部分为所需终止的会话进行ID。

2.2 总结

Ÿ        PPPOE的数据报文是被承载在以太网的数据域中进行传送的

Ÿ        PPPOE的发现阶段会遇到PADI、PADO、PADR和PADS这四种报文

Ÿ        PPPOE中的PADT报文是用来终止一条会话的

Ÿ        PPPOE在发现阶段时,以太网协议域的值为0x8863

2.3 思考

1、简单解释一下PPPOE发现阶段四种数据报文的收发过程?

2、在用户端发送PADI报文时,需要携带哪些标记选项?


第3章  PPPOE的会话阶段

3.1 PPPOE的会话过程

一旦PPPOE进入到会话阶段,则PPP的数据报文就会被填充在PPPOE的净载荷中被传送,这时两者所发送的所有以太网包均是单目地址。PPPOE会话阶段以太网帧的协议域填充为0x8864,代码域填充0x00,整个会话的过程就是PPP的会话过程,但在PPPOE数据域内的PPP数据帧是从协议域开始的。

例6:PPPOE会话阶段的数据报文

我们可以看到下划线部分为PPP的数据报文(0xC021表示LCP协商阶段,且为代码域为0x01表示是Config-Request报文)。

3.2 总结

Ÿ        PPPOE在会话阶段时,以太网协议域的值为0x8864

3.3 思考

1、PPPOE数据报文的代码域在PPPOE会话阶段为何值?

 

       

你可能感兴趣的:(计算机网络)