PPPoE(以太网上的点对点协议)
協(xié)議概述
PPPoE分為兩個階段,即Discovery(地址發(fā)現(xiàn))階段和PPP會話階段。當(dāng)某個主機(jī)希望發(fā)起一個PPPoE會話時,它必須首先執(zhí)行Discovery來確定對方的以太網(wǎng)MAC地址并建立起一個PPPoE會話標(biāo)識符SESSION_ID(Access Concentrator生成)。雖然PPP定義的是端到端的對等關(guān)系,Discovery卻是天生的一種客戶端-服務(wù)器關(guān)系。在Discovery的過程中,主機(jī)(作為客戶端)發(fā)現(xiàn)某個訪問集中器(Access Concentrator,作為服務(wù)器),根據(jù)網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu),可能主機(jī)能夠跟不止一個的訪問集中器通信 。Discovery階段允許主機(jī)發(fā)現(xiàn)所有的訪問集中器并從中選擇一個。當(dāng)Discovery階段成功完成之后,主機(jī)和訪問集中器兩者都具備了用于在以太網(wǎng)上建立點到點連接所需的所有信息。
Discovery階段保持無狀態(tài)(stateless)直到建立起一個PPP會話。一旦PPP會話建立,主機(jī)和訪問集中器兩者都必須為一個PPP虛擬接口分配資源。
報文格式
以太網(wǎng)幀格式(更多介紹請查看RFC894/tcp/ip協(xié)議詳解:卷1 第2章)
ETHER_TYPE設(shè)置為0x8863(Discovery階段)或者0x8864(PPP會話階段)
payload頭
payload內(nèi)容
包含0個或多個tag,每個tag是一個tlv(type-length-value)三元組
發(fā)現(xiàn)階段(discovery stage)
發(fā)現(xiàn)階段分為四步:PADI、PADO、PADR、PADS。
當(dāng)HOST收到PADS后,那么HOST與AC(access concentrator)間的點對點關(guān)系就已建立,進(jìn)入了會話階段(session stage)。
PPPoE Active Discovery Initiation數(shù)據(jù)包(PADI)
主機(jī)發(fā)送DESTINATION_ADDR 為廣播地址的PADI數(shù)據(jù)包,CODE域設(shè)置為0x09,SESSION_ID域必須設(shè)置為0x0000。
PADI數(shù)據(jù)包必須包含且僅包含一個TAG_TYPE為Service-Name的TAG,以表明主機(jī)請求的服務(wù),以及任意數(shù)目的其它類型的TAG。整個PADI數(shù)據(jù)包(包括PPPoE頭部)不允許超過1484個字節(jié),以留足空間讓中繼代理(向數(shù)據(jù)包中)增加類型為Relay-Session-Id的TAG。
The PPPoE Active Discovery Offer 數(shù)據(jù)包(PADO)
如果訪問集中器能夠為收到的PADI請求提供服務(wù),它將通過發(fā)送一個PADO數(shù)據(jù)包來做出應(yīng)答。DESTINATION_ADDR為發(fā)送PADI的主機(jī)的單播地址,CODE域為0x07,SESSION_ID域必須設(shè)置為0x0000。
PADO數(shù)據(jù)包必須包含一個類型為AC-Name的TAG(包含了訪問集中器的名字),與PADI中相同的Service-Name,以及任意數(shù)目的類型為Service-Name的TAG表明訪問集中器提供的其它服務(wù)。如果訪問集中器不能為PADI提供服務(wù),則不允許用PADO作響應(yīng)。
The PPPoE Active Discovery Request 數(shù)據(jù)包(PADR)
由于PADI是廣播的,主機(jī)可能收到不止一個PADO,它將審查接收到的所有PADO并從中選擇一個。可以根據(jù)其中的AC-Name或PADO所提供的服務(wù)來作出選擇。然后主機(jī)向選中的訪問集中器發(fā)送一個PADR數(shù)據(jù)包。其中,DESTINATION_ADDR域設(shè)置為發(fā)送PADO的訪問集中器的單播地址,CODE域設(shè)置為0x19,SESSION_ID必須設(shè)置為0x0000。
PADR必須包含且僅包含一個TAG_TYPE為Service-Name的TAG,表明主機(jī)請求的服務(wù),以及任意數(shù)目其他類型的TAG。
The PPPoE Active Discovery Session-confirmation 數(shù)據(jù)包(PADS)
當(dāng)訪問集中器收到一個PADR數(shù)據(jù)包,它就準(zhǔn)備開始一個PPP會話。它為PPPoE會話創(chuàng)建一個唯一的SESSION_ID并用一個PADS數(shù)據(jù)包來給主機(jī)作出響應(yīng)。DESTINATION_ADDR域為發(fā)送PADR數(shù)據(jù)包的主機(jī)的單播以太網(wǎng)地址,CODE域設(shè)置為0x65,SESSION_ID必須設(shè)置為所創(chuàng)建好的PPPoE會話標(biāo)識符。
PADS數(shù)據(jù)包包含且僅包含一個TAG_TYPE為Service-Name的TAG,表明訪問集中器已經(jīng)接受的該P(yáng)PPoE會話的服務(wù)類型,以及任意數(shù)目的其他類型的TAG。
如果訪問集中器不喜歡PADR中的Service-Name,那么它必須用一個帶有類型為Service-Name-Error的TAG(以及任意數(shù)目的其它TAG類型)的PADS來作出應(yīng)答。這種情況下,SESSION_ID必須設(shè)置為0x0000。
The PPPoE Active Discovery Terminate數(shù)據(jù)包(PADT)
這種數(shù)據(jù)包可以在會話建立以后的任意時刻發(fā)送,表明PPPoE會話已經(jīng)終止。它可以由主機(jī)或訪問集中器發(fā)送,DESTINATION_ADDR域為單播以太網(wǎng)地址,CODE域設(shè)置為0xa7,SESSION_ID必須表明終止的會話,這種數(shù)據(jù)包不需要任何TAG。
當(dāng)收到PADT以后,就不允許再使用該會話發(fā)送PPP流量了。在發(fā)送或接收到PADT后,即使是常規(guī)的PPP結(jié)束數(shù)據(jù)包也不允許發(fā)送。PPP通信雙方應(yīng)該使用PPP協(xié)議自身來結(jié)束PPPoE會話,但在無法使用PPP時可以使用PADT。
會話階段(session stage)
一旦PPPoE會話開始,PPP數(shù)據(jù)就像其它PPP封裝一樣發(fā)送。所有的以太網(wǎng)數(shù)據(jù)包都是單播的。ETHER_TYPE域設(shè)置為0x8864。PPPoE的CODE必須設(shè)置為0x00。PPPoE會話的SESSION_ID不允許發(fā)生改變,必須是Discovery階段所指定的值。PPPoE的payload包含一個PPP幀,幀始于PPP Protocol-ID。
TAG_TYPE和TAG_VALUE
0x0000 End-Of-List
該TAG表明表中沒有其它TAG了。該TAG的TAG_LENGTH必須總是0。不要求使用該標(biāo)簽,存在是為了向后兼容。
0x0101 Service-Name
該TAG表明后面緊跟的是服務(wù)的名稱。TAG_VALUE是不以NULL結(jié)束的UTF-8字符串。當(dāng)TAG_LENGTH為0時,該TAG用于表明接受任何服務(wù)。使用Service-Name標(biāo)簽的例子是表明ISP(Internet服務(wù)提供商)或者一類服務(wù)或者服務(wù)的質(zhì)量。
0x0102 AC-Name
該TAG表明后面緊跟的字符串唯一地表示了某個特定的訪問集中器。它可以是商標(biāo)、型號以及序列號等信息的集合,或者該訪問集中器MAC地址的一個簡單的UTF-8表示。它不以NULL來結(jié)束。
0x0103 Host-Uniq
該TAG由主機(jī)用于把訪問集中器的響應(yīng)(PADO或者PADS)與主機(jī)的某個唯一特定的請求聯(lián)系起來。TAG_VALUE是主機(jī)選擇的長度和值為任意的二進(jìn)制數(shù)據(jù)。它不能由訪問集中器解釋。主機(jī)可以在PADI或者PADR中包含一個Host-Uniq標(biāo)簽。如果訪問集中器收到了該標(biāo)簽,它必須在對應(yīng)的PADO或者PADS中不加改變的包含該標(biāo)簽。
0x0104 AC-Cookie
該TAG由訪問集中器用于防止拒絕服務(wù)攻擊(見“安全方面的考慮”)。訪問集中器可以在PADO數(shù)據(jù)包中包含該TAG。如果主機(jī)收到了該標(biāo)簽,它必須在接下來的PADR中不加改變的包含該標(biāo)簽。TAG_VALUE I是長度和值任意的二進(jìn)制數(shù)據(jù),不能由主機(jī)解釋。
0x0105 Vendor-Specific
該TAG用來傳送廠商自定義的信息。TAG_VALUE的頭4個字節(jié)包含了廠商的識別碼 ,其余字節(jié)尚未定義。廠商識別碼的高字節(jié)為0,低3個字節(jié)為網(wǎng)絡(luò)字節(jié)序的廠商的SMI網(wǎng)絡(luò)管理專用企業(yè)碼,如“定義值RFC”(參考文獻(xiàn)[4])中定義的那樣。
不推薦使用該TAG。為了確保互操作性,實現(xiàn)可以悄悄的忽略Vendor-Specific TAG。
0x0110 Relay-Session-Id
該TAG可由中繼流量的中間代理加入到Discovery數(shù)據(jù)包中。TAG_VALUE對主機(jī)和訪問集中器都是晦澀難懂的(paque)。如果主機(jī)或訪問集中器收到該TAG,則它們必須在所有的Discovery數(shù)據(jù)包中包含該TAG以作為響應(yīng)。所有的PADI數(shù)據(jù)包必須保證足夠空間來加入TAG_VALUE長度為12字節(jié)的Relay-Session-Id標(biāo)簽。
如果Discovery數(shù)據(jù)包中已經(jīng)包含一個Relay-Session-Id標(biāo)簽,則不允許再加入該標(biāo)簽。這種情況下,中間代理應(yīng)該使用該現(xiàn)有的Relay-Session-Id標(biāo)簽。如果它不能使用現(xiàn)有的標(biāo)簽,或者沒有足夠空間來增加一個Relay- Session-Id標(biāo)簽,那么它應(yīng)該向發(fā)送者返回一個Generic-Error標(biāo)簽。
0x0201 Service-Name-Error
該TAG(典型的有一個長度為零的數(shù)據(jù)部分)表明了由于某種原因,沒有理睬所請求的Service-Name。如果有數(shù)據(jù)部分,并且數(shù)據(jù)部分的頭一個字節(jié)非0,那么它必須是一個 可打印的UTF-8字符串,解釋請求被拒絕的原因。該字符串可以不以NULL結(jié)束。
0x0202 AC-System-Error
該TAG表明了訪問集中器在處理主機(jī)請求時出現(xiàn)了某個錯誤。(例如沒有足夠資源來創(chuàng)建一個虛擬電路。PADS數(shù)據(jù)包中可以包含該標(biāo)簽。
如果有數(shù)據(jù),并且數(shù)據(jù)的第一個字節(jié)不為0,那么(數(shù)據(jù))必須是一個可打印的UTF-8 字符串,該字符串解釋了錯誤的性質(zhì)。該字符串可以不以NULL結(jié)束。
0x0203 Generic-Error
該TAG表明發(fā)生了一個錯誤。當(dāng)發(fā)生一個不可恢復(fù)的錯誤并且沒有其它合適的TAG時,它可被加到PADO, PADR或PADS數(shù)據(jù)包中。如果出現(xiàn)數(shù)據(jù)部分,那么數(shù)據(jù)必須是一個UTF-8字符串,解釋錯誤的性質(zhì)。該字符串不允許以NULL結(jié)束。
數(shù)據(jù)包例子
總結(jié)
以上是生活随笔為你收集整理的PPPoE(以太网上的点对点协议)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。