Linux PPP詳細介紹 .


什么是PPP

PPP是一種網絡中最為基礎的協議。PPP協議(Point-to-Point Protocol)是一種數據鏈路層協議,它是為在同等單元之間傳輸數據包這樣的簡單鏈路而設計的。這種鏈路提供全雙工操作,並按照順序傳遞數據包。PPP為基於各種主機、網橋和路由器的簡單連接提供一種共通的解決方案。

 

PPP協議包括以下三個部分:

1. 數據幀封裝方法。

2. 鏈路控制協議LCP(Link Control Protocol):它用於對封裝格式選項的自動協商,建立和終止連接,探測鏈路錯誤和配置錯誤。

3. 針對不同網絡層協議的一族網絡控制協議NCP(Network Control Protocol): PPP協議規定了針對每一種網絡層協議都有相應的網絡控制協議,並用它們來管理各個協議不同的需求。

 

 

PPP認證方式
  1. 口令驗證協議(PAP)
  PAP 是一種簡單的明文驗證方式。NAS(網絡接入服務器,Network Access Server)要求用戶提供用戶名和口令,PAP以明文方式返回用戶信息。

  2. 挑戰-握手驗證協議(CHAP) 
   CHAP是一種加密的驗證方式,能夠避免建立連接時傳送用戶的真實密碼。NAS向遠程用戶發送一個挑戰口令(challenge),其中包括會話ID和 一個任意生成的挑戰字串(arbitrary challenge string)。遠程客戶必須使用MD5單向哈希算法(one-way hashing algorithm)返回用戶名和加密的挑戰口令,會話ID以及用戶口令,稱為Secret Password,其中用戶名以非哈希方式發送。

 

linux中PPP怎樣實現的

 

PPP 協議之下是以太網和串口等物理層,之上是IP協議等網絡層。這里,對於下層,我們只討論串口的情況,對於上層,我們只討論TCP/IP的情況。發送 時,TCP/IP數據包經過PPP打包之后經過串口發送。接收時,從串口上來的數據經PPP解包之后上報給TCP/IP協議層。linux下ppp框架結構如下圖:

image

PPP協議棧

主要負責PPP層數據的封裝、壓縮與解壓縮.另外,它還對普通數據包和Ppp過程的數據包進行了分流,將普通數據包提交到TCP/IP協議棧,而將Ppp過程的數據包放到/dev/ppp設備隊列中,等待Pppd去收取並處理.

PPP 是一個分層結構。在底層,它能使用同步媒介(如 ISDN 或同步 DDN 專線),也能適用異步媒介(如基於 Modem 撥號的 PSTN 網絡)。在數據鏈路層,PPP 在鏈路建立方面提供了豐富的服務,這些服務以 LCP 協商選項的形式提供。在上層,PPP 通過 NCPs 提供對多種網絡層協議的支持。PPP 對於每一種網絡層協議都有一種封裝格式來區別它們的報文。

什么是pppd

pppd是一個用戶空間的后台服務進程(daemon。pppd實現了所有鑒權、壓縮/解壓和加密/解密等擴展功能的控制協議。pppd只是一個普通的用戶進程,pppd與內核中的PPP協議處理模塊之間通過設備文件(/dev/ppp)進行通信pppd有一個輔助工具chat,用來與GSM模組建立會話。它向串口發送AT命令,建立與GSM模組的會話,以便讓PPP協議可以在串口上傳輸數據包。

 

/dev/ppp

設備文件/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的網絡接口,該網絡接口的傳輸函數指向ppp_start_xmit。當應用程序發送數據時,內核根據IP地址和路由表,找到ppp網絡接口,然后調用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發送數據包。pch->chan->ops->start_xmit是什么?它就是具體的傳輸方式了,比如說對於串口發送方式,則是ppp_async.c: ppp_asynctty_open中注冊的ppp_async_send函數,ppp_async_sendppp_async_push函數調用tty->driver->write把數據發送串口。

 

 

接收數據

接收數據的情形又是如何的?ppp_async.c在初始化(ppp_async_init),調用tty_register_ldisc向tty注冊了行規程處理接口,也就是一組回調函數,當串口tty收到數據時,它就會回調ppp_ldisc的 ppp_asynctty_receive函數接收數據。ppp_asynctty_receive調用ppp_async_input把數據buffer轉換成sk_buff,並放入接收隊列ap->rqueue中。ppp_async另外有一個tasklet(ppp_async_process)專門處理接收隊列ap->rqueue中的數據包,ppp_async_process一直掛在接收隊列ap->rqueue上,一旦被喚醒,它就調用ppp_input函數讓PPP協議處理模塊處理該數據包。
    在ppp_input函數中,數據被分成兩路,一路是控制協議數據包,放入pch->file.rqb隊列,交給pppd處理。另外一路是用戶數據包,經ppp_do_recv/ppp_receive_frame進行PPP處理之后,再由netif_rx提交給上層協議處理,最后經 socket傳遞到應用程序。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM