點(diǎn)對(duì)點(diǎn)通信協(xié)議PPPoE模塊的設(shè)計(jì)
目前,實(shí)現(xiàn)PPPoE協(xié)議的軟件有多種,且多數(shù)都是應(yīng)用于PC機(jī)。該類軟件的作用主要是操作系統(tǒng)的撥號(hào)(PPP)協(xié)議與以太網(wǎng)協(xié)議建立連接,通過(guò)PPPoE協(xié)議與ISP連接,獲得Internet連接服務(wù)。而本考到嵌入式系統(tǒng)的特點(diǎn),直接在網(wǎng)絡(luò)協(xié)議數(shù)據(jù)鏈路層實(shí)現(xiàn)PPPoE協(xié)議。這樣做省去了鏈路層的PPP包到PPPoE包的轉(zhuǎn)換,提高了效率,并且具有良好的可移植性。
本文引用地址:http://butianyuan.cn/article/157103.htm1 PPPoE協(xié)議框架
PPPoE協(xié)議共包括兩個(gè)階段,即PPPoE的媽現(xiàn)階段(PPPoE Discovery Stage)和PPPoE的會(huì)話階段(PPPoE Session Stage)。本文著重介紹PPPoE發(fā)現(xiàn)階段。對(duì)于PPPoE會(huì)話階段,可以看成與PPP的會(huì)話過(guò)程基本一樣,當(dāng)然兩者在數(shù)據(jù)的封裝上還是有區(qū)別的。PPPoE并不需要PPP協(xié)議中的起始位標(biāo)志、地址位、控制位和結(jié)束標(biāo)志,也不需要PPP協(xié)議中規(guī)定的數(shù)據(jù)轉(zhuǎn)譯和CRC校驗(yàn),但要在PPP的數(shù)據(jù)報(bào)文前封裝PPPoE的報(bào)文頭。無(wú)論是哪一個(gè)階段的數(shù)據(jù)報(bào)文最終會(huì)被封裝成以太網(wǎng)幀傳送。
如果主機(jī)要開(kāi)始一個(gè)PPPoE會(huì)話,它首先會(huì)在網(wǎng)絡(luò)上發(fā)送一個(gè)廣播,通過(guò)廣播尋找一個(gè)訪問(wèn)集中器AC(Access Concentration)。當(dāng)網(wǎng)絡(luò)上存在多個(gè)訪問(wèn)集中器時(shí),主機(jī)根據(jù)訪問(wèn)集中器所能提供的服務(wù)或用戶預(yù)先配置的信息進(jìn)行相應(yīng)的選擇。訪問(wèn)集中器選定后,主機(jī)開(kāi)始與所選擇的訪問(wèn)集中器建立一個(gè)PPPoE會(huì)話進(jìn)程。在這一過(guò)程中,訪問(wèn)集中器會(huì)為每一個(gè)PPPoE會(huì)話分配一個(gè)惟一的進(jìn)程ID,會(huì)話建立后就開(kāi)始了PPPoE的會(huì)話階段。在這個(gè)階段,已建立好點(diǎn)對(duì)點(diǎn)(邏輯點(diǎn)對(duì)點(diǎn))連接的雙方采用PPP協(xié)議交換數(shù)據(jù)報(bào)文,從而完成一系列PPP的過(guò)程,最終將在這個(gè)點(diǎn)對(duì)點(diǎn)的邏輯通道上進(jìn)行網(wǎng)絡(luò)層數(shù)據(jù)包的傳送。
PPPoE可以理解為在以太網(wǎng)上跑PPP數(shù)據(jù),因此,其幀格式與以太幀格式一致,如圖1所示。通過(guò)類型域字段的內(nèi)容,數(shù)據(jù)包的接收方可以識(shí)別以太網(wǎng)的數(shù)據(jù)域中承載的是什么協(xié)議的數(shù)據(jù)報(bào)文。PPPoE的兩大階段,也正是通過(guò)以太網(wǎng)的類型域進(jìn)行區(qū)分的。這個(gè)域的值,在發(fā)現(xiàn)階段為0x8863,而在會(huì)話階段為0x8864。
PPPoE幀的載荷字承載PPPoE數(shù)據(jù)報(bào)文,報(bào)文格式如圖2所示,其中各字段的含義如下:
1)版本字段(ver)標(biāo)志著協(xié)議版本信息,為4bits,目前協(xié)議規(guī)定其值為0x1。
2)類型字段(type),4bits,標(biāo)志類型信息,值為0x1。
3)編碼字段(code),單個(gè)字節(jié),在不同階段具有不同取值,本文稍候詳細(xì)分析。
4)會(huì)話ID字段(session id)由兩個(gè)字節(jié)組成,在發(fā)現(xiàn)階段,取值為0x0000,在后續(xù)的整個(gè)PPPoE會(huì)話過(guò)程中取值為發(fā)現(xiàn)階段所獲得的由AC分配的惟一值。
5)長(zhǎng)度字段(length)由兩個(gè)字節(jié)組成,指示payload字段的長(zhǎng)度,取值可以是0~1500。
6)凈載荷字荷(payload),該字段存放PPPoE協(xié)議幀所承載的數(shù)據(jù),在發(fā)現(xiàn)階段承載零個(gè)或多個(gè)TAG結(jié)構(gòu),在會(huì)話階段承載PPP協(xié)議數(shù)據(jù)。但不是簡(jiǎn)單的PPP封裝,因?yàn)椴⒉恍枰狿PP協(xié)議中的起始位標(biāo)志、地址位、控制位和結(jié)束標(biāo)志,也不需要PPP協(xié)議中規(guī)定的數(shù)據(jù)轉(zhuǎn)譯和CRC校驗(yàn)。TAG結(jié)構(gòu)如圖3所示。
2 PPPoE協(xié)議分析
PPPoE協(xié)議分為發(fā)現(xiàn)(Discovery)階段和會(huì)話(Session)階段。發(fā)現(xiàn)階段是一個(gè)無(wú)狀態(tài)的階段,該階段主要選擇訪問(wèn)集中器,確定所要建立的PPP會(huì)話標(biāo)識(shí)符Session ID,同時(shí)獲得對(duì)方點(diǎn)到點(diǎn)的連接信息;PPP會(huì)話階段執(zhí)行標(biāo)準(zhǔn)的PPP過(guò)程。
1)發(fā)現(xiàn)階段
一個(gè)典型的發(fā)現(xiàn)階段分為四個(gè)步驟,當(dāng)整個(gè)發(fā)現(xiàn)階段結(jié)束后,通信雙方分別獲取對(duì)方的MAC地址,并且共用一個(gè)Session ID,這兩個(gè)參數(shù)共同確定一個(gè)PPPoE會(huì)話。
第一步,發(fā)送PADI(PPPoE Active Discovery Initiation)幀。在PPPoE的以太幀結(jié)構(gòu)中,編碼域的值為0x09,會(huì)話ID域的值設(shè)為0x0000。在這個(gè)步驟中,以太網(wǎng)目的地址為廣播并且在包中必須包含一個(gè)確切的服務(wù)名。
第二步,接收PADO(PPPoE Active Discovery Offer)幀。這一過(guò)程就是當(dāng)ISP的PPPoE訪問(wèn)集中器收到PADI幀后,若能夠滿足PADI提出的服務(wù)請(qǐng)求,可以發(fā)送PADO幀回應(yīng)。PADO幀中的目的地址為發(fā)送PADI幀的客戶端的MAC地址,源地址為響應(yīng)PADO幀的服務(wù)器地址。編碼域的值為0x07,會(huì)話ID域的值也設(shè)為0x0000。PADO幀還要包括PADI幀所提出的服務(wù)項(xiàng)。
第三步,發(fā)送PADR(PPPoE Active Discovery Request)幀。由于PADI包是廣播式的,故主機(jī)可能收到多個(gè)PADO響應(yīng)幀。主機(jī)在可能收到的多個(gè)PADO幀中根據(jù)訪問(wèn)集中器的名稱標(biāo)簽或能提供的服務(wù)標(biāo)簽選擇一個(gè)合適的訪問(wèn)集中器,然后向所選擇的訪問(wèn)集中器發(fā)送PPPoE有效發(fā)現(xiàn)請(qǐng)求(PADR)幀。其編碼域?yàn)?x19,Session ID域仍為0x0000,PADR幀必須包含一個(gè)服務(wù)名稱類型標(biāo)簽,確定向接入服務(wù)請(qǐng)求的服務(wù)種類。
評(píng)論