基于Linux內核模式的PPPoE優(yōu)化與實(shí)現
PPPOE(Point.to.Point Protoeol over Ethernet)是將PPP協(xié)議封裝在以太網(wǎng)幀上進(jìn)行傳輸,它的通信過(guò)程分為探測(Discovery)和PPP會(huì )話(huà)(Session)2個(gè)階段。PPPoE Discovery階段主要是客戶(hù)機確定AC(Access Concentrator)以及客戶(hù)機與AC協(xié)商Session ID。而PPPoE Sess-ion用于完成數據包的接收與發(fā)送,同時(shí)它也用于完成PPP鏈路的協(xié)商(LCP),以及網(wǎng)絡(luò )層的控制協(xié)商(IPCP)等。
傳統的PPPoE先會(huì )用Raw socket讀取數據,然后采用用戶(hù)態(tài)程序對其封包解包,然后再發(fā)送給內核。但是這種方法會(huì )引起大量的內核空間與用戶(hù)空間的上下文切換,從而帶來(lái)不必要的開(kāi)銷(xiāo)。而對于實(shí)現于內核態(tài)的PPPoE,它會(huì )把所有的封包以及解包實(shí)現于內核,這樣就大大提高PPPoE的效率。
1 PPPoE協(xié)議概述
1. 1 PPPoE Discovery階段
在PPPoE Discovery階段,客戶(hù)機首先廣播一個(gè)PADI(0x09)幀。收到PADI幀的一個(gè)或多個(gè)服務(wù)器會(huì )發(fā)送PADO(0x07)幀,這個(gè)包中包含了服務(wù)器的各種標識。然后,客戶(hù)機會(huì )選擇其中一個(gè)服務(wù)器發(fā)送PADR(0x19),表明主機選擇了這個(gè)服務(wù)器。最終,收到PADR(0x65)幀的服務(wù)器會(huì )為新的會(huì )話(huà)分配資源并向客戶(hù)機發(fā)送PADS(0x65)。當此階段完成,這兩次的對話(huà)完成了SESSION_ID以及雙方物理地址,為后續數據會(huì )話(huà)打好基礎。
同時(shí)PPP協(xié)議還提供了一個(gè)PADT請求,該請求用于結束這次PPPoE會(huì )話(huà)。這個(gè)請求可以由任何一方發(fā)出,同時(shí)代表這次回話(huà)的結束,圖1描述整個(gè)discovery過(guò)程。
1.2 PPPoE Session階段
PPPoE Discovery階段是為整個(gè)PPPoE會(huì )話(huà)獲取雙方物理地址以及Session_ID,這個(gè)Session_ID就成為了雙方的通信憑證,在整個(gè)會(huì )話(huà)過(guò)程中保持不變。PPP幀數據被封在以太幀中,它在以太幀的標識為0x8864,當碰到0x8864時(shí),就認為是一個(gè)PPPoE包。
在PPPoE Session階段,PPPoE除數據傳輸以外,還提供了鏈路的協(xié)商(LCP),以及網(wǎng)絡(luò )層的控制協(xié)商(IPCP)等其他服務(wù)。對于LCP,它主要用于配置和測試數據通信鏈路,用來(lái)協(xié)商PPP協(xié)議的一些配置參數選項;處理不同大小的數據幀:檢測鏈路環(huán)路和一些鏈路的錯誤;終止一條鏈路,其作用類(lèi)似于IP層的ICMP協(xié)議。而對于IPCP,它主要用于動(dòng)態(tài)地協(xié)商客戶(hù)機與服務(wù)器雙方IP,實(shí)際的數據報文交換過(guò)程中主要涉及Config-Request、Config-Ack、Config-Nak和Config-Re-ject。圖2描述IPCP協(xié)商IP的過(guò)程。
2 PPPOE設計實(shí)現
從上述PPPoE協(xié)議描述中,了解到整個(gè)PPPoE會(huì )話(huà)包括Discovery、鏈路協(xié)商和數據傳輸3種交互。這3種數據中,數據傳輸最重要,數據量最大。對于用戶(hù)空間模式的PPPoE,數據包收發(fā)需要通過(guò)pty,由用戶(hù)空間的PPPoE進(jìn)程處理PPPoE包頭后通過(guò)Raw socket收發(fā)。也就是說(shuō)所有的PPPoE數據封包結果都在用戶(hù)空間執行,這樣就大大增加了內核空間與用戶(hù)空間數據切換的次數。為了減少這種開(kāi)銷(xiāo)。這里采用一個(gè)內核模塊來(lái)處理數據的封包解包,這樣就大大減少了內核空間與用戶(hù)空間數據切換的次數,提高效率。所以對內核空間模式的PPPoE的處理策略是:Discovery以及鏈路協(xié)商交互全部在用戶(hù)空間完成,而數據的封解包則通過(guò)一個(gè)內核模塊在內核空間完成。
評論