PPPoE 筆記

Category: , By 人生有夢,築夢踏實
A Method for Transmitting PPP Over Ethernet (PPPoE) <<>>


點對點通訊協定 (Point-to-Point Protocol : PPP) 常用於存取遠端主機服務,用於建立遠端主機(Remote site)連線。 例如:九五年代時期所使用的56k數據機 (Modem),便是使用‘點對點通訊協定’來串聯數據機和系統業者機房進行通訊,其優點在於協定易理解,並容易套用於任何通訊設備;有存取控制和收費機制。

而‘跨乙太網路點對點通訊協定’(PPP Over Ethernet : PPPoE) 則提供了建立遠端主機連線,可跨過簡易橋接線路的能力。簡單地說:就是可於乙太網路,使用PPP建立遠端主機連線。

在PPPoE中, 毎一個‘PPPoE對話’(PPPoE session) 需記錄連線‘端點(Peer)’ 的乙太網路位址(MAC Address),並建立取得‘唯一的對話識別碼’(Unique SESSION_ID),PPPoE擁有‘探索協定’(Discovery protocol)的能力。

以ADSL數據機(modem)和本地主機(Host) 為例:本地主機欲和ISP局端建立PPPoE連線,連線模式為本地主機和數據機以乙太網路連線,而數據機到ISP局端連線為PSTN。第一步:需建立本地主機和數據機之間的連線,本地主機首先需傳送‘探索封包’(Discovery Packet),數據機收到封包後,便會回覆本地主機,二者經交換彼此參數後,取得‘PPPoE對話識別碼’(PPPoE SESSION_ID),此識別碼是唯一的。往後的通訊皆使用此識別碼,作為連線的識別。於是,本地主機和數據機之間便建立連線。這個階段稱為‘Discovery Stage’。接著,第二步:本地主機和ISP局端透過數據機以PPP建立連線,這個階段稱為‘PPP Session Stage’。

在上述的例子中,已經勾勒出整個PPPoE協定的運作模式。 PPPoE定義出二個明確的階段(Stage):Discovery Stage和PPP Session Stage。當Host在Discovery Stage中,PPPoE連線要取得端點(Peer)的MAC位址和取得PPPoE對話識別碼 (在此,所謂的‘端點’,即為例子中的數據機)。在實際網路中,本地主機需先傳送‘探索封包’,且可能將收到一個以上的端點的回覆,在Discovery Stage允許本地主機可選擇決定其一端點,送出‘PPPoE對話碼要求’,以取得PPPoE對話識別碼 (PPPoE SESSION_ID)。當建立本地主機和端點之間的連線,即進入PPP Session Stage。進入PPP Session Stage,本地主機便可以和遠端主機(Remote Site)以PPP建立連線和進行通訊了。

瞭解了PPPoE的運作後,接著我們來瞭解PPPoE封包的格式。其格式如下:

Physical header


Ethernet frame


PPPoE Payload


…Date Payload…


Checksum


PPPoE封包內由實體層封包頭(Physical header)為開始,接著依續為:乙太網路訊框(Ethernet frame)﹑PPPoE payload,和Data Payload,最後,以封包的Check Sum作為結束。實體層封包頭為Preamble和SFD,這就不在此討論。


Physical

head


Destination Address

(6 bytes)


Source Address

(6 bytes)


Ether_Type

(2 bytes)


PPPoE


乙太網路訊框(Ethernet frame)長度固定為14 bytes,包含了6 bytes的目地位址(Destination Address),6 bytes的來源位址(Source Address:就是自己的MAC位址),和2 bytes的Ether_Type(上圖黃色區域)。Ether_Type其值為0x8863(Discovery Stage)和0x8864(PPP Session Stage)。而目的位址為端點的MAC位址,若尚未取得端點的MAC位址,則為乙太網路廣播位址(0xff_ff_ff_ff_ff_ff),取代之。

接於乙太網路封包頭後的,便是PPPoE Payload,格式如下圖:


Ethernet frame


Version(4 bits)


Type(4 bits)


Code(8 bits)


Session_ID(16 bits)


Length (16bits)


Payload …


Version欄寬是4 bits,版本為第一版,所以值為0x1;Type欄寬是4 bits,值亦為0x1 (Version和Type值皆為0x1,定義於PPPoE RFC2516 Feb 1999;後來有沒更新,則不得而知);Code欄寬是8 bits,其值如下表:


Ether_Type


Code


Definition


0x8863


0x09


Initiation Packet (PADI)


0x07


Offer Packet (PADO)


0x19


Session Request packet (PADR)


0x65


Session-Confirmation Packet (PADS)


0xa7


Terminate Packet (PADT)


0x8864


0x00


Session Data


Length欄寬為16 bits,其值代表為data payload的長度(單位:byte)。在Discovery Stage,Data payload 內容為TAGs;而在PPPoE Session Stage,Data payload內容則為PPP協定和其資料。

在Discovery Stage,PPPoE payload可包含一個以上的標籤(TAGs),標籤的格式為TLV(type-length-value)。


TAG1_TYPE (16bits)


TAG1_LENGTH (16bits)


TAG1_VALUE ...


TAG2_TYPE…


TAG_TYPE其值可自行參閱RFC2516的附錄A;TAG_LENGTH值代表著TAG_VALUE的長度。若有二個以上的TAG(s),接續的TAG(s)直接放置於前一個TAG_VALUE後。

@@Discovery Stage共定義五個型態的封包。分為Initiation Packet(PADI)、Offer Packet(PADO)、Session Request Packet(PADR)、Session-Confirmation Packet(PADS),和Terminate Packet(PADT)。

The PPPoE Active Discovery Initiation (PADI) packet.

PADI封包內的目的位址為廣播位址(0xff_ff_ff_ff_ff_ff),Code欄位值為0x09,而SESSION_ID值需為0x0000,且必需帶有‘Service-Name TAG’。Host發送PADI封包其目的探索收集網路區域內,是否存在提供PPPoE服務的端點。所以PADI封包使用廣播位址,使其不跨越閘通器的網路下,每一個網路端點(Peer)皆可收到此一封包。而提供PPPoE服務的端點收到PADI後,便回傳PADO,通知Host自己的位址。若網路上沒有任何可提供PPPoE服務的端點,便沒有任何PADO的回覆。

The PPPoE Active Discovery Offer (PADO) packet.

PADO封包內的目的位址為Host的MAC位址,來源位址則為自己(Peer)的位址,Code欄位值為0x07,SESSION_ID值必需為0x0000,必需帶有‘AC-Name TAG’。

PADO封包是用來回應PADI封包的,因為封包內的來源位址會放置自己的MAC位址,Host便可由此得到‘提供PPPoE服務的端點’的MAC位址。並由‘AC-Name TAG’資訊來選擇合適的端點。


The PPPoE Active Discovery Request (PADR) packet.

PADR封包內的Code欄位值為0x19,SESSION_ID值需為0x0000,且必需帶有‘Service-Name TAG’。

當Host發出PADI後,可能有一台以上的端點以PADO回應,於是Host便依據‘AC-Name TAG’來選擇合適的端點。當Host決定了合適的端點後,便會向該端點送出PADR封包,來要求取得SESSION_ID。

The PPPoE Active Discovery Session-confirmation (PADS) Packet.

PADS封包內的Code欄位值為0x65,此時,端點會依據PADR內的‘Service-Name’ 來決定是否建立連線。此時,端點有最後的決定權,決定是給予連線;

若端點同意連線,則端點在回覆PADS時, SESSION_ID欄位將填入由端點產的唯一的對話識別碼(Unique Session ID),並且附上‘Service-Name TAG’。

反之;若端點不同意連線,則所回覆的PADS,其SESSION_ID欄位將依然保持為0x0000值,且附上‘Service-Name-Error TAG’

當端點回PADS封包為同意連線後,此時便進入了PPP Session Stage。

The PPPoE Active Discovery Terminate (PADT) packet.

PADT封包內的Code欄位值為0xa7,SESSION_ID欄位值必需為PADS所得的Unique Session ID,以指出是那個連線要終止。而沒有要求附有TAGs。

PADT封包可在建立連線後,任意時間發出。可由Host或端點發出皆可。籍由SESSION_ID欄位指出那個連線欲終止。

@@PPP Session Stage只有一種封包的型態。Code欄位其值必定為0x00,SESSION_ID值為在Discovery Stage時所取得的PPPoE對話識別碼。而Data Payload內容為PPP訊框。訊框起始為PPP Protocol-ID(有關PPP協定請參閱RFC1661或等我完成PPP協定筆記)


 

0 comments so far.

Something to say?

ARCHIVES