88705562_p0.jpg

1. PPP over Ethernet 特征


  • 把 PPP 帧封装到以太帧中的链路层协议,实现多层封装协议
  • 在 PPPoE 中通过报文中 VER、Type、Code 字段标识该报文为 PPPoE 和报文类型
  • 通过在 Ethernet_Type 字段进行标识 PPPoE 阶段
    • 0x8863:Discovery 和 Terminate 阶段
    • 0x8864:Session 阶段
  • 常见的 Ethernet II Type 类型
    • 0x0800:IPv4
    • 0x0806:ARP
    • 0x8100:Dot1Q
    • 0x86DD:IPv6
    • 0x880B:PPP
    • 0x8847:MPLS
    • 0x8848:具有上行分配标签的 MPLS

      2. PPPoE Message

      PPPoE通过五种报文来建立和终结会话(Session)

image.png

  • VER:表示 PPPoE 的版本号
  • Type:表示 PPPoE 的类型
  • Code:表示 PPPoE 的报文类型
    • 0x00:Session 数据
    • 0x09:PADI 报文
    • 0x07:PADO 报文
    • 0x19:PADR 报文
    • 0x65:PADS 报文
    • 0xa7:PADT 报文

      1)PADI(初始化报文)

      广播方式发现服务器

image.png
image.png

2)PADO(提供报文)

将Client请求的服务与自身进行比对,如果可以提供则单播回复

image.png
image.png

3)PADR(请求报文)

Client 会选择最先收到 PADO 的报文进行单播请求

image.pngimage.png

4)PADS(确认报文)

Client 和 Server 构建唯一的会话(由 MAC 确认 Session)

image.png
image.png

5)PADT(终止报文)

Client主动和Server关闭连接

image.png
image.png

3. PPPoE Session 建立过程


image.png

  • PPPoE 建立过程:
    • 发现阶段(Discovery):获取对方以太网地址,确定唯一的 PPPoE 会话,并得知对方的 MAC
      • Client 广播发送一个 PADI 报文,此报文中包含 Client 想要得到的 Server 类型信息
      • Server 收到 PADI 报文后,将其中请求的服务和自己能够提供的服务进行比较。如果可以提供,则单播回复 PADO 报文
      • 如果网络中存在多个 Server,Client 会优先选择先收到 PADO 报文的 Server,并单播发送一个 PADR 报文进行请求
      • Server 产生一个唯一的 Session ID,标识和这个 Client 建立了会话,并通过单播发送一个 PADS 报文把 Session ID 发送给 Client
    • 会话阶段(Session):PPP 协商报文,在会话阶段都是单播发送
      • PPPoE Session 协商与 PPP 的协商一致,协商成功后,就可以承载 PPP 数据报文
    • 会话终结阶段(Terminate):PADT 数据包可以在会话建立以后的任意时刻单播发送
      • Client 和 Server 之间通过 PADT 报文来结束 PPPoE 链接,发送或接收到 PADT 后,就不允许在使用该 Session 的 PPP 流量
  • PPPoE Session 建立过程:
    1. 进行 PPPoE 协商
    2. 进行 PPP 协商

      4. PPPoE 优化


  • MTU/MSS:
    • MTU
      • 接口上送出的三层转发报文大于 MTU 值且报文被设置为不可分片时,会导致报文无法发送出去,出现用户上网网速慢的情况
      • 在以太网和 IP 之间一定会增加 8 字节(6 字节的 PPPoE + 2 字节的PPP),所以实际 MTU 为 1500 - 8 = 1492
    • MSS
      • 修改 TCP 协商阶段协商的 MSS 大小,使报文长度小于拨号口的 MTU 值,保证报文能被正常处理,解决上网网速慢的问题
  • DNS:缺省情况下,Client 不会主动请求或被动接收 Server 分配的 DNS Server 地址
  • 静态默认路由:因为 dialer 接口是 PPP 点到点接口,可以直接定义到接口