PPP over Ethernet(PPPoE)协议,是在以太网络中转播PPP帧信息的技术,尤其适用于ADSL等方式。可以使以太网的主机通过一个简单的桥接设备连到一个远端的接入集中器上。通过pppoe协议,远端接入设备能够实现对每个接入用户的控制和计费。
PPPoE帧
PPPoE帧的内容作为以太帧的负载存在, 当一个以太帧为PPPoE帧时,其Len/Type字段应该为0x8863(表示PPPoE的发现阶段)或者0x8864(表示PPPoE的会话阶段)。
+ Ver: 版本号, 4bit, PPPoE规范的本版本为0x01
+ Type: 类型, 4bit, PPPoE规范的本版本应设置为0x01
+ Code:代码字段、8bit, 根据两阶段中各种数据包的不同功能而值不同。
CodeDescription
0x00表示PPP会话阶段
0x09PADI 报文
0x07PADO报文
0x19PADR报文
0x65PADS报文
+ Session-ID:会话ID, 8bit, 是一个网络字节序的无符号值, 其值会在Discovery数据包中定义。 对一个给定的PPP会话来说,该值是一个固定值。 Session-ID 与 以太网Src_addr 和 Dst_addr一起实际定义了一个PPP会话。 Session-ID不允许使用0xFFFF(该值保留作将来使用)。
+ Length: PPPoE负载长度,不包括以太网头部和PPPoE头部。
+ Payload: PPPoE帧的净负载,在不同的阶段PPPoE的Payload字段的格式有很大区别。在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是PPP的报文。
下图是一个PPPoE的PADO报文
PPPoE链接 建立过程
PPPoE链路的建 *和PPP会话阶段
发现阶段:
ClientClientServerServerPADIPADOPADRPADS
会话阶段:
ClientClientServerServerLCPPAP/CHAP认证NCP链路建立
断开连接:
ClientClientServerServerPADT(Terminate)
(一)发现阶段:
当主机开始PPPoE进程时,它必须先识别接入端的以太网MAC地址,建立PPPoE的Session_ID。这就是Discovery阶段的目的。
Discovery阶段由四个步骤组成。完成之后通信双方都知道了PPPoE Session_ID以及对方以太网地址,它们共同确定了唯一的PPPoE会话。
ClientClientServerServerPADI(PPPoE Active Discovery Initial) Dst:广播 Src:ClientPADO(PPPoE Active Discovery Offer) Dst:Client Src:ServerPADR(PPPoE Active Discovery Request) Dst:Server Src:ClientPADS(PPPoE Active Discovery Session-confirmation) Dst:Client Src:Server
1. PADI 报文
主机在本以太网内“广播“一个PADI(PPPoE Active Discovery Initial)报文,在此报文中包含主机想要得到的服务类型信息。
PADI报文的目的地址为以太网的广播地址0×ffffffffffff,CODE(代码)字段值为0×09,SESSION-ID(会话ID)字段值为0×0000。
如果在PPPoE的服务器端配置service-name,client将发送Discovery阶段的PADI报文给服务器端请求建立连接。
如果该PADI报文中包含有不为空的service-name时,服务器端将用配置的service-name和该报文中的service-name进行完全匹配性检测。如果两者完全相同,服务器端提供后续服务,否则,服务器端不提供服务。
以上是两者的service-name都不为空时的情况。但如果两者中有一个service-name为空,就不进行此项检测,直接按照原来的程序执行。
2. PADO报文
以太网内的所有服务器收到这个PADI报文后,将其中请求的服务与自己能提供的服务进行比较,可以提供此服务的服务器发回PADO(PPPoE Active Discovery Offer)报文。
PADO报文的CODE字段值为0×07,SESSION-ID字段值仍为0×0000。
3. PADR报文
主机可能收到多个服务器的PADO报文,主机将依据PADO的内容,从多个服务器中选择一个,并向它发回一个会话请求报文PADR(PPPoE Active Discovery Request)。
PADR报文的CODE字段为0x19,SESSION_ID字段值仍为0×0000。