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).
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虚拟接口。
以太帧,长度单位字节:
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头的长度。
发现阶段有4个步骤,当这4个步骤完成后,双方都知道PPPoE SESSION_ID,对方的以太地址。
主机广播一个initiation包,一个或多个服务器发送一个Offer包。
主机发送单播Session Reqeust packet,被选中的服务器发送Confirmation包。
主机收到Confirmation包后,可以发起PPP会话。服务器发送Confirmation包后,可以转入PPP会话阶段。
发现阶段 payload 包含0个或多个TAGs,一个TAG是一个TLV (type-length-value) 结构
目的地址为广播地址,CODE域为0x09,SESSION_ID必须为0。
PADI包必须包含一个TAG类型为Service-Nme的TAG,表示主机要请求的服务。一个完整的PADI包的长度不能超过1484字节。
当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。
既然PADI是广播,那主机可能收到多个PADO,主机自己选择一个。主机发送一个PADR给选中的AC。目的地址为PADO中发现的单播地址。CODE域设置为0x19,SESSION_ID必须为0
PADR必须包括一个且只能一个Service-Name TAG,可以包括其它类型的TAG。
当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
当主机或者AC想结束会话时,可以发送PADT包。目标地址是单播地址,CODE域为0xa7,SESSION_ID必须为要结束的SESSION_ID。比要求其它TAG。
当PADT收到后,不允许使用该session发送其它PPP流。PPP端应该使用PPP协议自己的流程来结束PPPoE会话。
一旦PPPoE session建立,就进入PPP会话阶段,以太类型设置为0x8864,PPPoE CODE必须为0。SESSION_ID为之前协商的ID,payload是一个PPP帧。帧以PPP Protocol-ID开始。
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