linux PPP,PPPoE (翻譯,整理)

來源:互聯網
上載者:User

 linux PPP,PPPoE (翻譯,整理)  收藏

參考: http://www.akadia.com/services/pppoe_iptables.html ;

http://en.wikipedia.org/wiki/Point-to-Point_Protocol_over_Ethernet;

http://blog.csdn.net/absurd/archive/2007/05/04/1596496.aspx

http://www.36ji.net/article/0859/3550.html

http://blog.csdn.net/csucxcc/archive/2007/07/10/1684416.aspx

PPP:

PPP主要由兩類協議組成:鏈路控制協議族(LCP)和網路控制協議族(NCP)。

LCP用於建立、拆除和監控PPP資料鏈路,NCP主要用於協商在該資料鏈路上所傳輸的資料包的格式與類型。同時,PPP還提供了用於網路安全方面的驗證協議族(PAP和CHAP)。

ppp是一個分層結構。在底層,它能使用同步媒介(如ISDNH或同步DDN專線),也能使用非同步媒介(如基於Modem撥號的PSTN網路)。

在資料連結層,PPP在鏈路層建立方面提供了豐富的服務,這些服務以LCP協商選項的形式提供。

在上層,PPP通過NCPs提供對多種網路層協議的支援。PPP對於每一種網路層協議都有一種封裝格式來區別它們的報文。

 

PPP協商過程分為幾個階段:Dead階段,Establish階段,Authenticate階段,Network階段和Termintate階段,在不同的階段進行不同協議的協商.只有前面的協商出現結果後,才能轉到下一個階段,進行下一個協議的協商.

1)當物理層不可用時,PPP鏈路處於dead階段,鏈路必須從這個階段開始和結束.當物理層可用時,PPP在建立鏈路之前首先進行LCP協商,協商內容包括工作方式是SP還是MP,驗證方式和傳輸單元最大值等.

2)LCP協商過後就進入Establish階段,此時LCP狀態為Opened,表示鏈路已經建立.

3)如果培植了驗證(遠端驗證本地或者本地驗證遠端)就進入Authenticate階段,開始CHAP或PAP驗證.

4)如果驗證失敗進入Terminate階段,拆除鏈路,LCP狀態轉為Down;如果驗證成功就進入Network協商階段(NCP),此時LCP狀態仍為Opened,而IPCP狀態從Initial轉到Request.

5)NCP協商支援IPCP協商,IPCP協商主要包括雙方的IP地址.通過NCP協商來選擇和配置一個網路層協議.當選中的網路層協議配置成功後,該網路層協議就可以通過這條鏈路發送報文了.

6)PPP鏈路將一直保持通訊,直至有明確的LCP或NCP幀關閉這條鏈路,或發生了某些外來事件.(例如,使用者的幹預).

PPPoE:

Point-to-Point Protocol over Ethernet:即一種在乙太網路內封裝PPP協議報文的協議。基於包交換的乙太網路沒有“電路”(circuit)或連結的概念,因此對IP或MAC衝突和安全性都沒有保證。使用PPPoE使用者之間可以建立虛擬連結,在鏈路上進行安全的通訊。

PPPoE分為兩個階段:

PPPoE discovery:傳統的PPP串連是基於點到點的,而在乙太網路是muti-accesss,即在乙太網路中的任一節點可以訪問其他節點。乙太網路中的frame包含著目的節點的MAC地址以找到目的節點。   所以在轉換PPP frame之前,兩個通訊節點必須事Crowdsourced Security Testing道對方的MAC地址。 PPPeE的discovery階段就是讓乙太網路中的節點交換通知其MAC地址,並建立一個Session ID供後續的包交換使用。

PPPoE session:當節點之間知道了相互的MAC地址後,就進入了session階段。

 

PPP in Linux:

PPP架構:

 

【1】 pppoe程式:首先pppoe完成PPPoE的發現階段,即相互連知MAC地址。接著這個程式負責發送/接收所有通過ppp網路介面(如ppp0)的資料包。(需要瞭解類型為0x8863和0x8864的socket是如何工作的,並要瞭解資料包是如何通過PTY裝置在pppoe和PPP協議棧之間傳遞的)。

【2】pppd: 與pppoe配合起來完成撥接的協商與維護。

【3】/dev/ppp:建立了ppp裝置後,ppp過程的資料包經過協議棧的分類,會被傳送到該介面的隊列內。pppd從該介面讀取ppp過程的資料包,然後交給相應的協議棧處理。對於響應的資料包同樣寫入改裝置,裝置內會將資料包交給協議棧然後轉寄出去。

【4】socket: pppoe 的會話與發現階段資料包對應的乙太網路類型分別為0x8863和0x8864,因為這兩種類型的資料包是由pppoe應用程式通過socket來收發的,所以核心中需要定義這兩種類型的socket。

【5】PPP協議棧: 主要負責PPP層的封裝、壓縮與解壓。另外,它還對普通資料包和ppp過程的資料包進行了分流,將普通資料包提交給TCP/IP協議棧,而將PPP過程的資料包交給/dev/ppp裝置隊列中,等待pppd去收取處理。

【6】PTY裝置:串列裝置,PPP核心協議棧與pppoe應用程式的中轉站。因為ppp協議早多運行在串列鏈路上,所以在Linux核心中PPP協議棧與串列裝置結合緊密。

 

PPPoE撥號建立的過程

==》PPPoE的Discovery過程

==》PPP過程

==》設定上網主機

 

pppd的實現:

網路通訊協定是分層實現的,上層一般只需要知道其直接下層,只有在極少數的情況下才使用間接下層的介面。如普通的socket編程,它們只需要知道TCP/IP協議,而不需要知道PPP協議的存在。這種分層的設計簡化了協議的實現和應用程式的開發。

但是PPP協議並不只提供簡單的資料連結層功能,還提供了一些擴充功能(如鑒權PAP/CHAP,加密解密ECP)。應用程式要求使用透明化,不關心這些擴充功能的存在,而反過來。ppp協議處理模組本身又無法處理這些策略性的東西,因為它不知道使用者名稱/密碼,不知道是否要進行壓縮,不知道是否要進行加密。

pppd的出現解決了這個問題。pppd是一個後台服務進程(daemon),是一個使用者空間的進程,所以把那些策略性的內容從核心的PPP協議處理模組移到pppd中是很自然地事情。(pppd實現了所有鑒權、壓縮、加密解密等擴充功能的控制協議)

pppd是使用者空間的程式,它與核心態通過 裝置檔案(/dev/ppp)  進行通訊。通過read系統調用,pppd可以讀取PPP協議處理模組的資料包(PPP協議處理模組只會把應該由pppd處理的資料包發給pppd);通過write系統調用,pppd可以把要發送的資料包傳遞給PPP協議處理模組。通過ioctrl系統調用,pppd可以設定PPP協議的參數,可以建立/關閉串連。

在pppd裡,每種協議實現都在獨立的c檔案中,它們通常要實現protent介面(該介面主要用於處理資料包)和fsm_callbacks介面(該介面主要用於狀態機器的狀態切換)。資料包的接收是由main.c:get_input統一處理的,然後根據協議類型分法到具體的協議實現上。而資料包的發送則是協議實現者根據需要調用output函數完成的。

=======  流程  =======

應用程式通過socket介面發送TCP/IP資料包,這些TCP/IP資料包要如何經過PPP協議處理模組然後通過串口發送出去?

pppd在make_ppp_unit函數中調用ioctrl(PPPIOCNEWUNIT)建立一個網路介面(如ppp0),核心中的PPP協議模組在處理PPPIOCNEWUNIT時,調用register_netdev向核心註冊ppp的網路介面(ppp0),該網路介面的傳輸函數指向ppp_start_xmit。

當應用程式發送資料時,核心根據IP地址和路由表,找到ppp網路介面(ppp0),然後條用ppp_start_xmit函數,此時控制就轉移到PPP協議處理模組。ppp_start_xmit調用函數ppp_xmit_process去發送隊列中所有的資料包,ppp_xmit_process又調用ppp_send_frame去發送單個資料包,ppp_send_frame根據設定條用壓縮等擴充處理之後,又經ppp_push調用pch->chan->ops->start_xmit發送資料包。

 

PPPoE (使用者態):

PPPoE: pppoe用戶端版本:rp-pppoe-3.5-32.1 官網:http://www.roaringpenguin.com/products/pppoe

PPPOE主檔案為PPPOE.c 入口函數是main()。 在main函數中主要做了兩件事情:

PPPOE協議中的DISCOVERY階段:處理函數為discovery(),此函數建立一個RAW SOCKET,然後發送報文,接著等待回應,等待處理,最後成功後設定狀態進入SESSION階段。

PPOE協議中的SESSION階段,處理函數為session(),此函數首先建立一個RAW SOCKET,然後從PPPD中讀入資料,在加上PPPOE發送出去,再將接收到的資料發送給PPPD程式,讓PPPD處理,處理完後就建立了PPPOE串連,ppp0連接埠也建立了,並且從SERVER端分配到了IP。

 

PPPOE建立串連後資料報文的流程:

 

如果從eth收到PPPOE資料:   —— 首先資料被PPPOE中RAW SOCKET資料接收, PPPOE解開資料包的PPPOE前序, 然後將資料包傳輸到偽終端主裝置->偽終端的從裝置,然後通過核心到達ppp0解開,ppp0裝置通過驅動將資料包處理後向上層傳輸。

 

資料包發送: —— 首先根據路由知道資料要發送的連接埠在ppp0裝置連接埠,資料達到ppp0裝置後,ppp0將資料轉送到偽終端從裝置->偽終端主裝置,然後到達PPPOE,PPPOE給資料包加上PPPOE前序,然後通過RAW SOCKET從eth介面發送出去。

 

【問題】:

資料包的處理——至上而下:PPP封轉->PPPOE封裝->乙太網路前序,但是PPPOE使用者態(PPPOE核心態的實現是這個理想的流程)的實現流程並不是這樣,使用者態實現用在PPP和PPPOE中添加了一個偽終端,是為了不破壞LINUX核心中原有的終端實現的介面,因為linux核心中是將串列裝置作為終端裝置來驅動的。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.