🧸

PPPOE 解析

notion image
PPPoE报文格式
PPPoE是对PPP的扩展,它可以使PPP协议应用于以太网。 帧格式 PPPoE帧格式如下: PPPoE帧中字段解释: Tag_Value Tag_Type 含义 0x0101 Service-Name 该Tag表明后面紧跟的是服务的名称。 Tag_Value是不以NULL结束的字符串。 当Tag_Length为0时,该TAG用于表明接受任何服务。 使用Service-Name标签的例子是表明Internet服务提供商ISP或者一类服务或者服务的质量。 0x0102 AC-Name 该Tag表明后面紧跟的字符串唯一地表示了某个特定的接入服务器。 它可以是商标、型号以及序列号等信息的集合,或者该接入服务器MAC地址的一个简单表示。它不以NULL来结束。 0x0103 Host-Uniq 该Tag由主机用于把接入服务器的响应报文(PADO或者PADS)与主机的某个唯一特定的请求联系起来。Tag_Value是主机选择的长度和值,可以是任意的二进制数据。它不能由接入服务器解释。 主机可以在PADI或者PADR中包含一个Host-Uniq标签。如果接入服务器收到了该标签,它必须在对应的PADO或者PADS中不加改变的包含该标签。 0x0104 AC-Cookie 该Tag由接入服务器用于防止服务攻击。接入服务器可以在PADO数据包中包含该Tag。如果主机收到了该标签,它必须在接下来的PADR中不加改变的包含该标签。 Tag_Value的长度和值都是任意的二进制数据。 0x0105 Vendor-Specific 该Tag用来传送厂商自定义的信息。Tag_Value的前4个字节包含了厂商的识别码,其余字节尚未定义。 厂商识别码的高字节为0,低3个字节为网络字节序的厂商的SMI网络管理专用企业码。 不推荐使用该Tag。为了确保互操作性,在实现过程中,可以忽略Vendor-Specific Tag。 0x0110 Relay-Session-Id 该Tag可由中继流量的中间代理加入到Discovery数据包中。 Tag_Value对主机和接入服务器都是不透明。如果主机或接入服务器收到该Tag,则它们必须在所有的Discovery数据包中包含该Tag以作为响应。 所有的PADI数据包必须保证足够空间来加入Tag_Value长度为12字节的Relay-Session-Id标签。 如果Discovery数据包中已经包含一个Relay-Session-Id标签,则不允许再加入该标签。这种情况下,中间代理应该使用该Relay-Session-Id标签。 如果它不能使用现有的标签,或者没有足够空间来增加一个Relay-Session-Id标签,那么它应该向发送者返回一个Generic-Error标签。 0x0201 Service-Name-Error 该Tag典型的有一个长度为零的数据部分。 它表明了由于某种原因,没有理睬所请求的Service-Name。如果有数据部分,并且数据部分的头一个字节非0,那么它必须是一个可打印字符串,解释请求被拒绝的原因。 该字符串可以不以NULL结束。 0x0202 AC-System-Error 该Tag表明了接入服务器在处理主机请求时出现了某个错误。例如没有足够资源来创建一个虚拟电路。PADS数据包中可以包含该标签。 如果有数据,并且数据的第一个字节不为0,那么数据必须是一个可打印字符串,该字符串解释了错误的性质。 该字符串可以不以NULL结束。 0x0203 Generic-Error 该Tag表明发生了一个错误。 当发生一个不可恢复的错误并且没有其它合适的Tag时,它可被加到PADO、PADR或PADS数据包中。 如果出现数据部分,那么数据必须是一个解释错误性质的字符串。 该字符串不允许以NULL结束。 帧示例 参考标准 标准 描述 RFC 2516 A Method for Transmitting PPP Over Ethernet (PPPoE)
PPPoE报文格式
 
  • dst:广播地址(0xffffffff)、确认PPPoE Server后使用单播地址
  • Source_address:源设备的以太网MAC地址
  • Ether_type:设置为0x8863(Discovery阶段或拆链阶段)或者0x8864(Session阶段)
  • Code:8bits,PPPoE报文类型
    • 0x00 会话数据
    • 0x09 PADI
    • 0x07 PADO/PADT
    • 0x19 PADR
    • 0x65 PADS
  • Session_ID:16bits,Source_address和Destination_address一起实际地定义了一个PPP会话。值0xffff为将来的使用保留
  • Length:定义PPPoE的Payload域长度。不包括以太网头部和PPPoE头部的长度。
  • Payload:在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是标准的点对点协议包。
    •  
      PPPOE帧格式 一共 8字节
notion image
PPPoE帧字段
字段
长度
含义
6字节
以太网单播目的地址或者以太网广播地址(0xFFFFFFFF)。在Discovery数据包中,该域的值是以太网广播地址;在PPPoE会话流量中,该域必须是Discovery阶段已经确定的通信对方的单播地址。ry stage.
6字节
源设备的以太网MAC地址。
2字节
链路直接封装的协议,当值为0x8863时表示Discovery阶段;当值为0x8864时表示PPPoE会话阶段。
可变
以太帧的数据字段。The Ethernet payload.
4字节
用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。
4字节
PPPoE版本,必须设置为0x01。
4字节
PPPoE类型,必须设置为0x01。
1字节
其定义在后面的Discovery和PPPoE会话中分别指定。
2字节
是一个网络字节序的无符号值。其值在后面Discovery数据包中定义。对一个给定的PPPoE会话来说该值是一个固定值,并且与以太网Source_address和Destination_address一起实际地定义了一个PPPoE会话。值0xFFFF为将来的使用保留,不允许使用。
2字节
该值是PPPoE的Payload长度。它不包括以太网头部和PPPoE头部的长度。
可变
PPPoE的Payload,包含0个或多个Tag。一个Tag是一个TLV(Type-Length-Value)结构。
2字节
网络字节序。下表列出了各种Tag_Type和Tag_Value的对应关系和含义。
2字节
是一个网络字节序的无符号值,表明Tag_Value的字节数。 如果收到的Discovery数据包中包含未知的Tag_Type,则必须忽略掉该Tag。It is an unsigned number in network byte order, indicating the length in octets of the TAG_VALUE.
可变
Tag的数据字段。Value of a Tag.
PPPoE TLV
Tag_Value
Tag_Type
含义
End-Of-List
该Tag值表明是最后一个Tag。该Tag的Tag_Length必须总是0。 不要求使用该标签,它是为了向后兼容。
Service-Name
该Tag表明后面紧跟的是服务的名称。 • Tag_Value是不以NULL结束的字符串。 • 当Tag_Length为0时,该TAG用于表明接受任何服务。使用Service-Name标签的例子是表明Internet服务提供商ISP或者一类服务或者服务的质量。
AC-Name
该Tag表明后面紧跟的字符串唯一地表示了某个特定的接入服务器。它可以是商标、型号以及序列号等信息的集合,或者该接入服务器MAC地址的一个简单表示。它不以NULL来结束。
Host-Uniq
该Tag由主机用于把接入服务器的响应报文(PADO或者PADS)与主机的某个唯一特定的请求联系起来。Tag_Value是主机选择的长度和值,可以是任意的二进制数据。它不能由接入服务器解释。主机可以在PADI或者PADR中包含一个Host-Uniq标签。如果接入服务器收到了该标签,它必须在对应的PADO或者PADS中不加改变的包含该标签。
AC-Cookie
该Tag由接入服务器用于防止服务攻击。接入服务器可以在PADO数据包中包含该Tag。如果主机收到了该标签,它必须在接下来的PADR中不加改变的包含该标签。Tag_Value的长度和值都是任意的二进制数据。
Vendor-Specific
该Tag用来传送厂商自定义的信息。Tag_Value的前4个字节包含了厂商的识别码,其余字节尚未定义。 厂商识别码的高字节为0,低3个字节为网络字节序的厂商的SMI网络管理专用企业码。 不推荐使用该Tag。为了确保互操作性,在实现过程中,可以忽略Vendor-Specific Tag。
Relay-Session-Id
该Tag可由中继流量的中间代理加入到Discovery数据包中。 Tag_Value对主机和接入服务器都是不透明。如果主机或接入服务器收到该Tag,则它们必须在所有的Discovery数据包中包含该Tag以作为响应。 所有的PADI数据包必须保证足够空间来加入Tag_Value长度为12字节的Relay-Session-Id标签。 如果Discovery数据包中已经包含一个Relay-Session-Id标签,则不允许再加入该标签。这种情况下,中间代理应该使用该Relay-Session-Id标签。 如果它不能使用现有的标签,或者没有足够空间来增加一个Relay-Session-Id标签,那么它应该向发送者返回一个Generic-Error标签。
Service-Name-Error
该Tag典型的有一个长度为零的数据部分。 它表明了由于某种原因,没有理睬所请求的Service-Name。如果有数据部分,并且数据部分的头一个字节非0,那么它必须是一个可打印字符串,解释请求被拒绝的原因。 该字符串可以不以NULL结束。
AC-System-Error
该Tag表明了接入服务器在处理主机请求时出现了某个错误。例如没有足够资源来创建一个虚拟电路。PADS数据包中可以包含该标签。 如果有数据,并且数据的第一个字节不为0,那么数据必须是一个可打印字符串,该字符串解释了错误的性质。 该字符串可以不以NULL结束。
Generic-Error
该Tag表明发生了一个错误。 当发生一个不可恢复的错误并且没有其它合适的Tag时,它可被加到PADO、PADR或PADS数据包中。 如果出现数据部分,那么数据必须是一个解释错误性质的字符串。 该字符串不允许以NULL结束。
PADI(PPPoE Active Discovery Initiation)
Name
Value
Remark
ff:ff:ff:ff:ff:ff
0x09
PADI Code
0x8863
PADO(PPPoE Active Discovery Offer)
Name
Value
Remark
0x07
PADO
0x8863
PADR(PPPoE Active Discovery Request)
Name
Value
Remark
0x19
PADO
0x8863