以下內容摘自筆者的《網路工程師必讀——接入網與交換網》一書(如感興趣,請加入我的技術圈子:[url]http://group.51cto.com/lycb[/url]一起討論學習):

4.3.2 PPPoE協議工作原理

PPPoE協議的工作流程包含發現和會話兩個階段,發現階段是無狀態的,目的是獲得PPPoE終結端(在局端的ADSL裝置上)的乙太網MAC地址,並建立一個唯一的PPPoESESSION_ID。發現階段結束後,就進入標準的PPP會話階段。

當一個主機想開始一個PPPoE會話,它必須首先進行發現階段,以識別局端的乙太網MAC地址,並建立一個PPPoESESSION_ID。在發現階段,基於網路的拓撲,主機可以發現多個接入集中器,然後允許使用者選擇一個。當發現階段成功完成,主機和選擇的接入集中器都有了他們在乙太網上建立PPP連線的資訊。直到PPP會話建立,發現階段一直保持無狀態的Client/Server(客戶/伺服器)模式。一旦PPP會話建立,主機和接入集中器都必須為PPP虛介面分配資源。
PPPoE協議會話的發現和會話兩個階段具體程式如下:

1. 發現(Discovery)階段

在發現(Discovery)階段中使用者主機以廣播方式尋找所連線的所有接入集線器(或交換機),並獲得其乙太網MAC地址。然後選擇需要連線的主機,並確定所要建立的PPP會話識別標號。發現階段有四個步驟,當此階段完成,通訊的兩端都知道PPPoESESSION_ID和對端的乙太網地址,他們一起唯一定義PPPoE會話。這四個步驟如下:
1)主機廣播一個發起分組(PADI),分組的目的地址為乙太網的廣播地址0xffffffffffffCODE(程式碼)欄位值為0x09SESSION_ID(會話ID)欄位值為0x0000PADI包必須至少包含一個服務名稱型別的標籤(標籤型別欄位值為0x0101),向接入集中器提出所要求提供的服務。
2)接入集中器收到在服務範圍內的PADI包分組,傳送PPPoE有效發現提供包(PADO)分組,以響應請求。其中CODE欄位值為0x07 SESSION_ID欄位值仍為0x0000PADO分組必須包含一個接入集中器名稱型別的標籤(標籤型別欄位值為0x0102),以及一個,或多個服務名稱型別標籤,表明可向主機提供的服務種類。
3)主機在可能收到的多個PADO分組中選擇一個合適的PADO分組,然後向所選擇的接入集中器傳送PPPoE有效發現請求分組(PADR)。其中CODE欄位為0x19 SESSION_ID欄位值仍為0x0000PADR分組必須包含一個服務名稱型別標籤,確定向接入集線器(或交換機)請求的服務種類。當主機在指定的時間內沒有接收到PADO,它應該重新傳送它的PADI分組,並且加倍等待時間,這個過程會被重複期望的次數。
4)接入集中器收到PADR包後準備開始PPP會話,它傳送一個PPPoE有效發現會話確認(PADS)分組。其中CODE欄位值為0x65 SESSION_ID欄位值為接入集中器所產生的一個惟一的PPPoE會話標識號碼。PADS分組也必須包含一個接入集中器名稱型別的標籤確認向主機提供的服務。當主機收到PADS包確認後,雙方就進入PPP會話階段。
【注意】如果主機正在等待接收PADS分組,應該使用具有主機重新傳送PADR的相似超時機制。在重試指定的次數後,主機應該重新傳送PADI分組。

2. PPP會話階段

使用者主機與接入集中器根據在發現階段所協商的PPP會話連線引數進行PPP會話。一旦PPPoE會話開始,PPP資料就可以以任何其它的PPP封裝形式傳送。所有的乙太網幀都是單播的。PPPoE會話的SESSION_ID一定不能改變,並且必須是發現階段分配的值。
PPPoE還有一個PADT分組,它可以在會話建立後的任何時候傳送,來終止PPPoE會話,也就是會話釋放。它可以由主機或者接入集中器傳送。當對方接收到一個PADT分組,就不再允許使用這個會話來傳送PPP業務。PADT包不需要任何標籤,其CODE欄位值為0xa7 SESSION_ID欄位值為需要終止的PPP會話的會話標識號碼。在傳送或接收PADT後,即使正常的PPP終止分組也不必傳送。PPP對端應該使用PPP協議自身來終止PPPoE會話,但是當PPP不能使用時,可以使用PADT
以上各個階段的會話流程可用圖4-5描述。