Point-to-Point_Protocol_over_Ethernet

**PPPoE**（英語：**P**oint-to-**P**oint **P**rotocol **o**ver **E**thernet），乙太網路上的對等協定，是將對等協定（PPP）封裝在乙太網路（Ethernet）框架中的一種網路隧道協定。由於協定中整合 PPP 協定，所以實現出傳統乙太網路不能提供的身分驗證、加密以及壓縮等功能，也可用於纜線數據機（cable modem）和數位使用者線路（DSL）等以乙太網路協定向使用者提供接入服務的協定體系。
本質上，它是一個允許在乙太網路廣播域中的兩個乙太網路介面間建立對等隧道的協定。

以 Linux 系統常用的 PPPOE 為例，支援 PPP 介面上面的 IP、IPv6 和 IPX 網路層協定。

它使用傳統的基於 PPP 的軟體來管理一個不是使用串行線路而是使用類似於乙太網路的有向分組網路的連接。這種有登陸和口令的標準連接，方便了接入供應商的記費。並且，連接的另一端僅當 PPPoE 連接接通時才分配 IP 位址，所以允許 IP 位址的動態復用。

PPPoE 是由 UUNET、Redback Networks 和 RouterWare 所開發的。發表於 RFC 2516 說明中。

## PPPoE 的階段

PPPoE 分為兩個階段：

### PPPoE 發現

由於傳統的 PPP 連接是建立在串行鏈路或撥號時建立的 ATM 虛電路連接上的，所有的 PPP 訊框都可以確保通過電纜到達對端。但是乙太網路是多路存取的，每一個節點都可以相互存取。以太影格包含目的節點的實體位址（MAC 位址），這使得該影格可以到達預期的目的節點。
因此，為了在乙太網路上建立連接而交換 PPP 控制報文之前，兩個端點都必須知道對端的 MAC 位址，這樣才可以在控制報文中攜帶 MAC 位址。PPPoE 發現階段做的就是這件事。除此之外，在此階段還將建立一個對談 ID，以供後面交換報文使用。

### PPP 對談

一旦連接的雙方知道了對端的 MAC 位址，對談就建立了。

## PPPoE 發現階段（PPPoED）

儘管傳統的 PPP 是對等協定，但是由於多個主機可以通過一個單獨的物理連接連接到一個服務提供者，因此 PPPoE 本身就是一個客戶端 - 伺服器的關係。
發現過程包含四個步驟。主機作為客戶端，ISP 端的存取集中器作為伺服器。這四步在下面詳述。最後一步第五步是關閉一個現存對談的方法。

### 客戶端到伺服器：Initiation（PADI）

**PADI** 為 PPPoE Active Discovery Initiation 的縮寫。 
如果一個使用者想要使用 DSL 撥號連入 Internet，那麼他的電腦必須首先在其 ISP 的網路服務提供點（POP）找到 DSL 存取集中器（DSL-AC）。在乙太網路上通訊只能通過 MAC 位址。由於電腦不知道 DSL-AC 的 MAC 位址，於是就在乙太網路上廣播一個 PADI 報文。這個報文中包含傳送者的 MAC 位址。

PADI 報文範例：

```
Frame 1 (44 bytes on wire, 44 bytes captured)
Ethernet II, Src: 00:50:da:42:d7:df, Dst: ff:ff:ff:ff:ff:ff
PPP-over-Ethernet Discovery
  Version: 1
  Type 1
  Code Active Discovery Initiation (PADI)
  Session ID: 0000
  Payload Length: 24
PPPoE Tags
  Tag: Service-Name
  Tag: Host-Uniq
    Binary Data: (16 bytes)
```

_Src._（=source）包含傳送電腦的 MAC 位址。 
_Dst._（=destination）為乙太網路廣播位址。 
PADI 報文可能被一個以上的 DSL-AC 接收。
只有可以提供「服務名稱」（Service-Name）的 DSL-AC 裝置才應該回覆。

### 伺服器到客戶端：Offer (PADO)

**PADO** 為 PPPoE Active Discovery Offer 的縮寫。 
一旦使用者電腦傳送了 PADI 報文，DSL-AC 就會使用 PADI 中提供的 MAC 位址回覆一個 PADO 報文。PADO 報文中包含了 DSL-AC 的 MAC 位址、名稱以及服務名。如果多於一個 POP 的 DSL-AC 回覆了 PADO 報文，使用者電腦就使用提供的名稱和服務來從中選擇一個。

PADO 報文範例：

```
Frame 2 (60 bytes on wire, 60 bytes captured)
Ethernet II, Src: 00:0e:40:7b:f3:8a, Dst: 00:50:da:42:d7:df
PPP-over-Ethernet Discovery
  Version: 1
  Type 1
  Code Active Discovery Offer (PADO)
  Session ID: 0000
  Payload Length: 36
PPPoE Tags
  Tag: AC-Name
    String Data: IpzbrOOl
  Tag: Host-Uniq
    Binary Data: (16 bytes)
```

_AC-Name -> 字串資料_包含了 AC 名稱，這裡為「Ipzbr001」（萊比錫的 Arcor DSL-AC） 
_Src._ 包含了 DSL-AC 的 MAC 位址。 
DSL-AC 的 MAC 位址還包含了了 DSL-AC 的製造商資訊（這裡為北電網路）。

### 客戶端到伺服器：Request（PADR）

**PADR** 為 PPPoE Active Discovery Request 的縮寫。 
當使用者電腦收到一個來自 DSL-AC 的可接受的 PADO 報文後，就會傳送一個 PADR 報文給 DSL-AC，用來確認接受傳送 PADO 報文的 DSL-AC 所提供的 PPPoE 連接。

### 伺服器到客戶端：Session-confirmation（PADS）

**PADS** 為 PPPoE Active Discovery Session-confirmation 的縮寫。 
上面的 PADR 報文由 DSL-AC 的 PADS 報文進行確認，並在其中攜帶一個對談 ID。使用者電腦與此 DSL-AC 的連接現在就完整建立了。

### 任何一方：Termination（PADT）

**PADT** 為 PPPoE Active Discovery Termination 的縮寫。 
這個報文終結使用者電腦與 POP 的的連接，可由使用者電腦或 DSL-AC 任意一方傳送。

## 使用時的缺點

1. 使用 Internet 前，需先透過 PPPoE 進行撥接，而非電腦啟動後立即上網。
2. 部分 ISP 會對 PPPoE 的連線使用者採取定時斷線，以節省營運成本及 IP 位址的佔用，故對於需長時間掛網的使用者較不利。但也有部份 ISP 為提供使用者選擇 PPPoE 可發配非固定 IP 或固定 IP 的服務。
3. 目前 Windows XP 之後的 Windows，Mac OS X、Linux 等作業系統等皆已內建 PPPoE 的撥接功能，更早期的作業系統需另行安裝 PPPoE 的撥接程式，如 Enternet 300、RAS PPPoE 等。

## 參考資料

## 外部連結

* RFC 2516 - _A Method for Transmitting PPP Over Ethernet (PPPoE)_
* RFC 3817 - _Layer 2 Tunneling Protocol (L2TP) Active Discovery Relay for PPP over Ethernet (PPPoE)_
* 在 Linux 上撥號上網 (PPPoE)