ILD

PPPoE协议学习
作者:Yuan Jianpeng 邮箱:yuanjp@hust.edu.cn
发布时间:2018-4-25 站点:Inside Linux Development

1 PPP协议简介

1989年,IETF (Internet Engineering Task Force) 建议PPP标准,1994年成为工作标准。PPP协议被ISP广泛使用。PPP使数据包在点对点链路传输更容易。PPP最开始是为串口连接设计的。PPP被ISP采用,用来实现拨号因特网访问。PPP可以包络在多种数据链路协议中,如PPPoE (Ethernet)和Asynchronous Transfer Mode (PPPoA)。


PPP使用Link Control Protocol (LCP)来建立用户电脑和ISP之间的会话。


PPP支持3种用户认证协议:

PAP (Password Authentication Protocol), 

CHAP (Challenge Handshake Authentication Protocol), 

EAP  (Extensible Authentication Protocol).


2 PPPoE

1999年IETF发布了PPPoE工作标准,即RFC2516。PPPoE实现了多点以太网络中,建立虚拟点对点连接。这扩展了PPP的能力。在ISP的DSL链路中,PPPoE被广泛使用。


PPPoE有两个不同的阶段,Discovery阶段和PPP会话阶段。


当一个主机想发起PPPoE会话,它必须先执行Discovery来识别对端的MAC地址,并建立一个PPPoE SESSION_ID。而PPP则定义了peer-to-peer realtionship。


发现阶段保持无状态,直到PPP会话建立。一旦PPP会话建立,主机和服务器必须分配PPP虚拟接口。


2.1 Payloads

以太帧,长度单位字节:

DST ADDR是单播地址或广播地址,SRC ADDR必须是源设备的单播地址。

ETHER_TYPE或者是 0x8863 (Discovery stage) 或者是0x8864 (PPP Session Stage)。


PPPoE以太payload,长度单位bit:

VER域,4位,必须为0x1

TYPE域,4位,必须为0x1

CODE域,8位,下面定义。

SESSION_ID域,16位,无符号数,网络字节序。

LENGTH,16位,网络字节序,PPPoE Payload的长度,不包括以太和PPPoE头的长度。


2.2 Discovery Stage

发现阶段有4个步骤,当这4个步骤完成后,双方都知道PPPoE SESSION_ID,对方的以太地址。


主机广播一个initiation包,一个或多个服务器发送一个Offer包。

主机发送单播Session Reqeust packet,被选中的服务器发送Confirmation包。

主机收到Confirmation包后,可以发起PPP会话。服务器发送Confirmation包后,可以转入PPP会话阶段。


发现阶段 payload 包含0个或多个TAGs,一个TAG是一个TLV (type-length-value) 结构


2.2.1 The PPPoE Active Discovery Initiation (PADI) packet

目的地址为广播地址,CODE域为0x09,SESSION_ID必须为0。


PADI包必须包含一个TAG类型为Service-Nme的TAG,表示主机要请求的服务。一个完整的PADI包的长度不能超过1484字节。


2.2.2 The PPPoE Active Discovery Offer (PADO) packet

当AC (Access Concentrator) 收到它能服务的PADI包后,它回复一个PADO包,目的地址是收到的PADI包的主机单播地址。CODE域设置为0x07,SESSION_ID必须设置为0。


PADO包必须包含一个AC-Name TAG,包含Access Concentrator的名字。一个Service-Name TAG。可以带其它的Service-Name TAG,表示提供更多服务。如果AC不能服务PADI,它不能回复PADO。


2.2.3 The PPPoE Active Discovery Request (PADR) packet

既然PADI是广播,那主机可能收到多个PADO,主机自己选择一个。主机发送一个PADR给选中的AC。目的地址为PADO中发现的单播地址。CODE域设置为0x19,SESSION_ID必须为0


PADR必须包括一个且只能一个Service-Name TAG,可以包括其它类型的TAG。


2.2.4 The PPPoE Active Discovery Session-confirmation (PADS) packet

当AC收到PADR后,它准备开始PPP会话,产生一个唯一的SESSION_ID,通过PADS回复给主机。目的地址是主机的单播地址,CODE域为0x65,SESSION_ID是新会话的SESSION_ID。


PADS也需要包括一个Service-Name TAG。


如果AC不喜欢PADR中的Service-Name,可以回复一个PADS,其SESSION_ID为0,并且包含一个Service-Name-Error TAG


2.2.5 The PPPoE Active Discovery Terminate (PADT) packet

当主机或者AC想结束会话时,可以发送PADT包。目标地址是单播地址,CODE域为0xa7,SESSION_ID必须为要结束的SESSION_ID。比要求其它TAG。


当PADT收到后,不允许使用该session发送其它PPP流。PPP端应该使用PPP协议自己的流程来结束PPPoE会话。


2.3 PPP Session Stage

一旦PPPoE session建立,就进入PPP会话阶段,以太类型设置为0x8864,PPPoE CODE必须为0。SESSION_ID为之前协商的ID,payload是一个PPP帧。帧以PPP Protocol-ID开始。


附录 A

TAG类型和TAG值


0x0101 Service-Name

表示服务名字,TAG_VALUE是一个不是NULL结尾的UTF-8字符串,如果长度为0,表示接受任何服务。


0x0102 AC-Name

一个字符串,唯一的标识了一个AC。不是NULL结尾的。


0x0103 Host-Uniq

由主机唯一的关联 一个AC响应。PADO对应PADI,PADS对应PADR。二进制数据,长度由主机选择。AC收到后,响应时使用相同的Host-Uniq回复。


0x0201 Service-Name-Error

0x0202 AC-System-Error

0x0203 Generic-Error


参考:

What is PPP and PPPoE? https://whatismyipaddress.com/ppp-pppoe 


相关标准:

[1] RFC 2516. A Method for Transmitting PPP Over Ethernet (PPPoE). https://tools.ietf.org/html/rfc2516

[2] RFC 1661. The Point-to-Point Protocol (PPP). https://tools.ietf.org/html/rfc1661


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.