了解PPPoE協議的發現階段
這里我們來對PPPoE協議的一些內容進行一下具體的分析。我們以前也曾學習過PPP協議,想必大家在學習PPPoE的時候也會更容易理解。這次我們也會涉及到PPPoE的發現階段的講述。PPPoE協議的數據報文是被封裝在以太網幀的數據域內的。
以太網幀頭包括:
1. 目的MAC地址(該階段為ffffffffffff的廣播地址)
2. 源MAC地址(客戶端MAC地址)
3. 以太網協議類型(該階段為0x8863,表示為發現階段)。
PPPoE數據報文的格式:
1. PPPoE數據報文最開始的4位為版本域(Version),協議中給出了明確的規定,這個域填充的內容為0x01.
2. 版本域后是4位的類型域(Type),根據協議規定,這個域填充的內容也是0x01.
3. 代碼域(Code)占用一個字節,對于PPPoE的不同階段這個域內容也不一樣。
4. 會話ID(Session ID)占用兩個字節,當訪問集中器(Access Concentrator)還沒有分配唯一的會話ID給用戶主機的話,改域的內容必須填充為0x0000;一旦主機獲取了會話ID后,那么在后續的所有報文里面必須填充那個唯一的會話ID。
5. PPPoE協議的Payload長度(Length)占兩個字節。PPPoE的Payload可以由多個TLV組成,每個包括Tag_Type,Tag_Length,Tag_Vlaue。
發現階段
PPPoE的發現階段一共分為4步,分別是:PADI(PPPoE Active Discovery Initiation),PADO(PPPoE Active Discovery Offer),PADR(PPPoE Active Discovery Request),PADS(PPPoE Active Discovery Session-confirmation)。當完成這四步之后,用戶主機(PC)和訪問集中器(AC)雙方就能獲知對方唯一的MAC地址和唯一的會話ID。MAC地址和會話ID 共同定義了唯一的PPPoE會話。PPPoE Discovery的以太網類型域為0x8863。
1. PADI:PPPoE發現階段的第一步。用戶主機以廣播的方式發送PADI數報包,請求建立鏈路。Code域置為0x09,會話ID域必須置為0x0000。
2. PADO:PPPoE發現階段的第二步。訪問集中器(AC)以單播的方式發送一個PADO數據包對主機的請求做出應答。目的地址為主機的MAC地址,Code域置為0x07,會話ID域必須置為0x0000。PADO數據包必須包含一個類型為AC-Name的Tag(包含了訪問集中器的名字)。
3. PADR:PPPoE發現階段的第三步。因為PADI數據包是廣播的,所以主機可能收到不止一個的PADO報文。主機在收到報文后,會根據AC-Name或者PADO所提供的服務來選擇一個AC,然后主機向選中的AC單播一個PADR數據包。目的地址域為AC的MAC地址,Code域置為0x19,會話ID域必須置為0x0000。PADR報文必須且只能包含一個Tag_Type為Service-Name的Tag,表明主機請求的服務。
4. PADS:PPPoE發現階段最后一步。當AC在收到PADR報文時,就準備開始一個PPP的會話了。它為PPPoE會話創建一個唯一的會話ID并用單播一個PADS數據包來給主機做出響應。目的地址域為主機的MAC地址,Code域置為0x65,會話ID必須設置為所創建好的會話ID。
注意:
1. Host-Uniq
在PPPoE協議的發現階段的四個步驟中,PPPoE頭的Payload中始終含有這樣一個TLV:
Tag_Type = 0103 (表示為Host-Uniq)
Tag_Length = 8 (8個字節的長度)
Tag_Value = 0500000008000000
Host-Uniq為主機唯一標識,類似于PPP數據報文中的標識域,主要是用來匹配發送和接收端的。因為對于廣播式的網絡中會同時存在很多個PPPoE的數據報文。
2. AC-Cookie
PADO和PADR數據包里面都含有Tag_Type為AC-Cookie的Tag,16Bytes。Ac-Cookie是為了防止拒絕服務攻擊(Denial of Service,簡稱DOS)。訪問集中器(AC)能夠根據PADR的源地址來重新產生唯一的Tag_Value。使用這種方法,AC可以確保PADI的源地址是可達的,并對該地址的并行會話數進行限制。