PPPOE協議介紹
PPPOE,全稱Point-to-Point Protocol Over Ethernet,它工作在OSI的數據鏈路層,PPPOE協議提供了在廣播式的網絡(如以太網)中多台主機連接到遠端的訪問集中器(我們對目前能完成上述功能的設備為寬帶接入服務器)上的一種標准。
1. PPPOE的工作原理
PPPOE協議共包括兩個階段,即PPPOE的發現階段(PPPOE Discovery Stage)和PPPOE的會話階段(PPPOE Session Stage)。而兩者的主要區別在於只是在PPP的數據報文前封裝了PPPOE的報文頭。
當一個主機希望能夠開始一個PPPOE會話時,它首先會在廣播式的網絡上尋找一個訪問集中器,當然可能網絡上會存在多個訪問集中器時,對於主機而言則會根據各訪問集中器(AC,Access Concentration)所能提供的服務或用戶的預先的一些配置來進行相應的選擇。當主機選擇完了所需要的訪問集中器后,就開始和訪問集中器建立一個PPPOE會話進程。在這個過程中訪問集中器會為每一個PPPOE會話分配一個唯一的進程ID,會話建立起來后就開始了PPPOE的會話階段,在這個階段中已建立好點對點連接的雙方(這種點對點的結構與PPP不一樣,它是一種邏輯上的點對點關系)就采用PPP協議來交換數據報文,從而完成一系列PPP的過程,最終將在這點對點的邏輯通道上進行網絡層數據報的傳送。
2. PPPOE的數據報文格式
我們簡要介紹一下PPPOE的數據報文格式。PPPOE的數據報文是被封裝在以太網幀的數據域內的。簡單來說我們可能把PPPOE報文分成兩大塊,,一大塊是PPPOE的數據報頭,另一塊則是PPPOE的凈載荷(數據域),對於PPPOE報文數據域中的內容會隨着會話過程的進行而不斷改變。下圖1為PPPOE的報文的格式:
版本 |
類型 |
代碼 |
會話ID |
長度域 |
凈載荷(或數據域) |
(圖1 PPPOE數據報格式)
l PPPOE數據報文最開始的4位為版本域,協議中給出了明確的規定,這個域的內容填充0x1。
l 緊接在版本域后的4位是類型域,協議中同樣規定,這個域的內容填充為0x1。
l 代碼域占用1個字節,對於PPPOE 的不同階段這個域內的內容也是不一樣的。
l 會話ID點用2個字節,當訪問集中器還未分配唯一的會話ID給用戶主機的話,則該域內的內容必須填充為0x0000,一旦主機獲取了會話ID后,那么在后續的所有報文中該域必須填充那個唯一的會話ID值。
l 長度域為2個字節,用來指示PPPOE數據報文中凈載荷的長度。
l 數據域,有時也稱之為凈載荷域,在PPPOE的不同階段該域內的數據內容會有很大的不同。在PPPOE的發現階段時,該域內會填充一些Tag(標記);而在PPPOE的會話階段,該域則攜帶的是PPP的報文。
這里我們主要來介紹一下PPPOE發現階段的報文格式以及它的報文:
1) PPPOE數據報文中Tag(標記)的格式
對於發現階段的PPPOE數據報文而言,它的凈載荷可能包含零個或多個Tag(標記),實際上這些標記的意義非常類似於PPP配置參數選項,它同樣也是要經過協商的。對於PPPOE協議而言,沒有像PPP的配置參數選項那樣定義了很多細節,而只是一個初略的定義,因此在實際當中實現這個過程會依據不同廠商的設備有不同。首先還是讓我們看一下承載在PPPOE報文數據域中的標記封裝格式,如圖2,
類型 |
長度 |
數據 |
(圖2 標記的封裝格式)
從圖2中可以看出,標記的封裝格式采用的是大家所熟知的TLV結構,也即是(類型+長度+數據)。標記的類型域為2個字節,下表列出了各種標記類型的含義:
標記類型 |
標記說明 |
0x0000 |
表示PPPOE報文數據域中一串標記的結束,為了保證版本的兼容性而保留,在有些報文中有應用。 |
0x0101 |
服務名,主要用來表明網絡側所能提供給用戶的一些服務。 |
0x0102 |
訪問集中器名,當用戶側接收到了AC的回應的PADO報文時,就可獲從所攜帶的標記中獲知訪問集中器的名子,而且還可以據此來選擇相應的訪問集中器。 |
0x0103 |
主機唯一標識,類似於PPP數據報文中的標識域,主要是用來匹配發送和接收端的,因為對於廣播式的網絡中會同時存在很多個PPPOE的數據報文。 |
0x0104 |
AC-Cookies,主要被用來防止惡意性DOS功擊。 |
0x0105 |
銷售商的標識符。 |
0x0110 |
中繼會話ID,對於PPPOE的數據報文也同樣可以像DHCP報文一樣被中斷到另外的AC上終結,這個字段則是用來維護另一個連接的。 |
0x0201 |
服務名錯誤,當請求的服務名不被對端所接受時,會在響應的報文中攜帶這個標記。 |
0x0202 |
訪問集中器名出錯。 |
0x0203 |
一般性錯誤。 |
l 標記的長度域為2個字節,它用來指明標記數據域的長度。
l 標記的數據域中用來放置不同類型標記所對應的相關數據。
2) PPPOE發現階段的數據報文
PPPOE的發現階段可分為四步,其實這個過程也是PPPOE四種數據報文的交換的一個過程。當完成這四步后,用戶主機與訪問集中器雙方就能獲知對方的MAC地址和唯一的會話ID號,從而進入到下一個階段(PPPOE的會話階段)。實際上雙方在互相知道了對方的MAC地址后,就已經在廣播式的網絡上確定了一一的對應關系,為了保證這個連接的有效性,同時使PPPOE協議能更加靈活的運用,因此還加入了會話ID字段,通過這兩個條件就可完成確定雙方點對點的關系。
在這個階段一開始,由於接入用戶並不知道訪問集中器的MAC地址,則使用類似於ARP解析的過程的機制來獲取訪問集中器的MAC地址。首先由接入用戶側發起一個初始化的廣播報文,對於訪問集中器如果配置了PPPOE的業務時,它會時實檢測網絡上的數據包,當發現以太網數據幀中所承載的是PPPOE報文時(通過協議域的內容來區分),就會將其交給相應的模塊去處理。當收到初始化報文后,訪問集中器會向該用戶回應一個報文。如果網絡上存在很多這樣的訪問集中器且都收到了用戶側發送的初始化報文時,它們也都會向用戶側會送一個確認報文,如果該用戶收到這個報文后,則會依據報文中所攜帶的內容或本端的一些配置來選擇一個唯一的訪問集中器進行會話。到此時已完成了前兩步了,那么剩下的兩步則是協商一些所提供的服務選項和獲取PPPOE會話階段所必須的會話ID值。
說明:在這個階段,所有數據報文是被承載在以太網的數據域中的,而且以太網數據幀的協議域始終為0x8863。
在PPPOE發現階段的四步的過程中,PPPOE會遇到PADI、PADO、PADR和PADS這四種報文。PPPOE中的PADT報文是用來終止一條會話的。
l PADI(PPPOE Active Discovery Initiation)報文
PPPOE發現階段的第一步,也即是由用戶側首先發送這樣一個報文。用戶主機是以廣播的方式發送這個報文,所以該報文所對應的以太網幀的目的地址域應填充為全1,而源地址域填充用戶主機的MAC地址。廣播包可能會被多個訪問集中器接收到。
l PADO(PPPOE Active Discovery Offer)報文
PPPOE發現階段的第二步,也即是由訪問集中器回應各用戶主機發送的PADI報文,此時該報文所對應的以太網幀的源地址填充訪問集中器的MAC地址,而目的地址則填充從PADI中所獲取的用戶主機的MAC地址。
l PADR(PPPOE Active Discovery Request)報文
PPPOE發現階段的第三步,也即是由用戶主機向訪問服務器發送單播的請求報文。當用戶主機收到PADO報文后,會從這些報文中挑選一個訪問集中器作為后續會話的對象。由於用戶主機在收到PADO報文后,就獲知了訪問集中器的MAC地址,因此PADR報文所以應的以太網幀的源地址填充用戶主機的MAC地址,而以太網的目的地址填充為訪問集中器的MAC地址。
l PADS(PPPOE Active Discovery Session-confirmation)報文
PPPOE發現階段的第四步,也即是最后一步,此時訪問集中器當收到PADR報文時,就准備進入開始一個PPP的會話了,而此時訪問集中器會為在這個會話分配一個唯一的會話進程ID,並在發送給主機的PADS報文中攜帶上這個會話ID。當然如果訪問集中器不滿足用戶所申請的服務的話,則會向用戶發送一個PADS報文,而其中攜帶一個服務名錯誤的標記,而且此時該PADS報文中的會話ID填充0x0000。
l PADT(PPPOE Active Discovery Terminate)報文
PADT報文可能在會話進行開始之后的任意時間內被發送,主要是用來終止一個PPPOE會話的止。它可以由主機或訪問集中器發送,目的地址填充為對端的以太網的MAC地址