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傳遞到應用程序。

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章