个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将在PPPoE协议报文的基础上进行介绍。
PPPoE协议发展
- 关于PPPoE基本原理,可参考1999年发布的《RFC2516-A Method for Transmitting PPP Over Ethernet》。
相关资料:
- 关于PPPoE在巨帧场景下的使用,可参考2006年发布的《RFC4638-Accommodating a MTU/MRU Greater Than 1492 in the PPPoE》。
- 关于PPPoE的扩展使用,可参考2010年发布的《RFC5578-PPPoE Extensions for Credit Flow and Link Metrics》。
- 关于PPPoE协议不同字段的相关定义,可参考IANA发布的《Point-to-Point Over Ethernet (PPPoE) Parameters》。
- 关于PPP协议的相关参数,可参考IANA发布的《Point-to-Point (PPP) Protocol Field Assignments》。
- 关于常用Ethernet网类型,可参考IANA发布的《IEEE 802 Numbers》。
- 关于IPvX协议所使用的协议号,可参考IANA发布的《Assigned Internet Protocol Numbers》。
- 关于PPP协议的基本原理,可参考博客-PPP协议原理介绍+报文分析+配置指导-RFC1661。
…
Note:个人能力有限,敬请各位指导。
目录
Point-to-Point Over Ethernet
1.PPPoE协议
1.1.PPPoE基本原理
PPPoE (Point-to-Point Over Ethernet) 协议主要用于解决一个远程站点设备可以控制连接站点的多个设备主机,同时还可提供类似于使用 PPP 的拨号服务的方式的访问控制和计费功能。在许多接入技术中,Ethernet 网可以用最具成本效益的方法将多台主机连接到客户端接入设备。因此 PPPoE 协议应运而生。
通过 PPPoE 技术,每个用户主机可使用独立的 PPP 协议,实现基于用户的访问计费控制。同时又可具有良好的私密性。
PPPoE的两个阶段:
Discovery stage:主机希望启动 PPPoE 会话时,它必须首先执行发现以识别对等体的 Ethernet MAC 地址并建立 PPPoE SESSION_ID。这一阶段称为 Discovery 阶段。
主机可以与之通信的 Access Concentrator 可能不止一个。因此协议允许其发现所有 Access Concentrator 后选择一个。随后主机和选定的 Access Concentrator 都将获得需要通过 Ethernet 建立点对点连接的信息。
PPP Session Stage:在 Discovery 阶段获取到 SESSION_ID 后,Session 阶段开始进行 PPP 协议交互。这一过程包括了 PPP 的 LCP 和 NCP 交互。上述交互都完成后,主机可正式开始访问网络资源。
PPP 协议的 LCP 阶段主要进行包括认证在内的链路协商,NCP 阶段主要进行包括 IP/DNS 地址在内网络资源协商。
由于以太网的最大负载大小为 1500 字节,PPPoE 报头为 6 个字节,PPP 协议 ID 为 2 个字节,因此 PPP MTU 不得大于 1492。
1.2.PPPoE帧格式
PPPoE以太帧:
PPPoE 以太帧主要是将 PPP 帧作为 payload 封装于 Ethernet 帧中。同时以 0x8863 的 ETHER_TYPE 标识 Discovery Stage,以 0x8864 的 ETHER_TYPE 标识 PPP Session Stage。
Ethernet payload for PPPoE:
VER:4-bits,标识 PPPoE 协议版本。必须置 0x1。
TYPE:4-bits,必须置 0x1。
CODE:8-bits,取值取决于对应的阶段。
目前共约定义了10种左右的CODE值,此处仅介绍常用CODE:
CODE=0x00:表示进入PPP Session Stage。
CODE=0x07:PADO,PPPoE Active Discovery Offer。
CODE=0x09:PADI,PPPoE Active Discovery Initiation。
CODE=0x19:PADR,PPPoE Active Discovery Request。
CODE=0x65:PADS,PPPoE Active Discovery Session-confirmation。
CODE=0xa7:PADT,PPPoE Active Discovery Terminate。
SESSION_ID:16-bits,在 Discovery 阶段的 PADS 报文中获取。并且对于给定的 PPP 会话为固定值。
实际上,它定义了 PPP 会话以及以太网 SOURCE_ADDR 和 DESTINATION_ADDR。值 0xffff 保留供将来使用,不得使用。
LENGTH:16-bits,排除了 Ethernet 和 PPPoE 头后的 PPPoE 载荷长。
payload:不定长
Discovery 阶段还可能额外携带TAG TLV:这些TAG可以用于额外标识用户信息。
TAG_TYPE:16-bits,标识 TAG 类型。
TAG_LENGTH:16-bits,标识 TAG_LENGTH 的长度。
TAG_VALUE:不定长,取决于实际值。
自动换行
在此提供常用的PPPoE TAG Values
关于 TAG 字段的详细含义可查看相关资料。
1.3.PPPoE交互过程
PPPoE交互过程如上图所示。
4步Discovery阶段:
PADI —> PADO —> PADR —> PADS。
1@PPPoE Active Discovery Initiation:CODE=0x09
首先,用户主机发送 PADI 数据包,并将 DMAC 设置为广播地址。CODE 字段设置为 0x09,SESSION_ID 必须设置为 0x0000。
PADI 数据包必须只包含一个 Service-Name TAG (TAG_TYPE = 0x0101),表示主机请求的服务,以及任意数量的其他 TAG 类型。整个 PADI 数据包包括 PPPoE 头不得超过 1484 位字节,以便为中继代理留出足够的空间来添加 Relay-Session-Id TAG (TAG_TYPE = 0x0110)。
PADI 数据包示例。
2@PPPoE Active Discovery Offer:CODE=0x07
Access Concentrator 收到它可以服务的 PADI 时,它通过发送单播的 PADO 数据包进行回复。CODE 字段设置为 0x07,SESSION_ID 必须设置为 0x0000。
同时必须包含一个包含 Access Concentrator 名称的 AC-Name TAG (TAG_TYPE = 0x0101)、一个与 PADI 中 Service-Name TAG (TAG_TYPE = 0x0101) 相同的 Service-Name TAG,以及表示 Access Concentrator 可提供的其他服务的其他 TAG。
PADO 数据包示例。
3@PPPoE Active Discovery Request:CODE=0x19
用户主机可能会收到多个 PADO,但仅查看它收到的 PADO 数据包并选择一个。用户主机可以根据 AC-Name 或提供的服务进行选择。随后,主机以一个 PADR 数据包进行单播回应。CODE 字段设置为 0x19,SESSION_ID 必须设置为 0x0000。
PADR 数据包必须只包含一个 Service-Name TAG (TAG_TYPE = 0x0101),表示主机请求的服务,以及任意数量的其他 TAG 类型。
PADR 数据包示例。
4@PPPoE Active Discovery Session-confirmation:CODE=0x65
当 Access Concentrator 收到 PADR 数据包时,为 PPPoE 会话生成唯一的 SESSION_ID,并使用 PADS 数据包单播回复主机。CODE 字段设置为 0x65,并且 SESSION_ID 必须设置为为此 PPPoE 会话生成的唯一值。
PADS 数据包只包含一个 Service-Name TAG (TAG_TYPE = 0x0101),指示可提供接受 PPPoE 会话的服务,以及任意数量的其他 TAG 类型。如果 Access Concentrator 不喜欢 PADR 中的 Service-Name,则它必须回复包含 Service-Name-Error (TAG_TYPE = 0x0201,以及任意数量的其他 TAG 类型) 的 PADS 数据包。同时在这种情况下,SESSION_ID 必须设置为 0x0000。
PADS 数据包示例。
5@PPPoE的终止PPPoE Active Discovery Terminate:CODE=0xA7
PADT 数据包可以在建立会话后的任何时间发送,以指示 PPPoE 会话已终止。并且不限制发送方。CODE 字段设置为 0xa7,并且必须设置 SESSION_ID 以指示要终止的会话。
PADT 数据包不需要 TAG。 收到 PADT 后,不允许使用该会话发送进一步的 PPP 流量。即使是普通的 PPP termination 数据包,在发送或接收 PADT 后也不得发送。 PPP 对等体应该使用 PPP 协议来关闭 PPPoE 会话,但是当 PPP 不能使用时,可以使用 PADT。
PADT 数据包示例。
PPPoE的PPP Session Stage阶段:
在完成 PPPoE 的发现阶段后,将进入 PPP 会话阶段。在此阶段将先进行 PPP 的 LCP (Link Control Protocol,链路控制协议) 进行链路协商。随后进入 NCP (Network Control Protocols,网络控制协议),以便完成 IP/DNS 在内的网络层协议协商。最终在 NLP (Network Layer Protocols,网络层协议) 中进行真正的业务报文交互。
关于 PPP 协议的基本原理,可参考博客-PPP协议原理介绍+报文分析+配置指导-RFC1661。
PPPoE的PPP Session Stage阶段报文示例。
在此阶段,需要将 ETHER_TYPE 字段设置为 0x8864,PPPoE CODE 设置为 0x00。并且该 PPPoE 会话的 SESSION_ID 不得更改,并且必须是在 Discovery 阶段分配的值。PPPoE 的 PPP 帧以 PPP 协议 ID 开头。
PPP 协议 ID 为 0xc021 时表示 LCP 协议。
PPP 协议 ID 为 0x0021 时表示 NLP 交互的 IPv4 协议。
其他需要注意的内容:
- 由于以太网的最大负载大小为 1500 字节,PPPoE 报头为 6 个字节,PPP 协议 ID 为 2 个字节,因此 PPP MTU 不得大于 1492。
- 当主机在指定时间内没有收到 PADO 数据包时,它应该重新发送 PADI 数据包并将等待时间加倍。根据需要重复多次此操作。
- 如果主机正在等待接收 PADS 数据包,则应使用类似的超时机制,以便在未收到 PADS 数据包时重新发送 PADR。在指定的重试次数后,主机应该重新发送 PADI 数据包。
2.PPPoE典型配置
这里以上图为例,进行 PPPoE 的相关介绍。
AR1:
interface Dialer0
link-protocol ppp
ppp ipcp default-route
ppp chap user pppoe-1
ppp chap password cipher pppoe-1
ppp timer negotiate 5
ppp ipcp dns request
timer hold 20
ip address ppp-negotiate
dialer user pppoe-1
dialer bundle 1
dialer number 1111
dialer timer enable 6
dialer-group 1
#
interface GigabitEthernet0/0/0
pppoe-client dial-bundle-number 1
#
AR2:
aaa
local-user pppoe-1 password cipher pppoe-1
local-user pppoe-1 service-type ppp
#
interface Virtual-Template1
ppp authentication-mode chap
remote address pool pool-pppoe
ppp ipcp remote-address forced
ppp ipcp default-route
ppp timer negotiate 5
ppp ipcp dns 8.8.8.8 114.114.114.114
timer hold 20
ip address 192.168.1.1 255.255.255.0
#
interface GigabitEthernet0/0/0
pppoe-server bind Virtual-Template 1
#
display pppoe-server session all 用于查看相应的 PPPoE 信息。