2009年7月12日 星期日

實作於 User-space 的 pppd

Standard
前些日子在『Linux 下的網路連線整合』曾提到 Linux 網路機制的實作情況,若要做大整合,PPP (Point-to-Point Protocol)是首要考量的目標之一,因此這兩天就花了一點時間,透過現有 user-space 的 pppd 實作 PPP 的狀態提取,初步得到了些成果。

由於 PPP 存在的架構特殊,深入了解 pppd 的原理是必要的,如此才能完整處理資訊。不過,PPP 所牽涉的範疇比較廣,不少相關機制交錯於 kernel-space/user-space 之間,還好實作在 kernel-space 的機制,我們都可以統一透過 ioctl 去操作(如:Network Interface),並無太大困難。可是, PPP 實作於 user-space 的另一半機制,就沒有一定的 syscall 可以保證達成全部操作。

為何 PPP 有 kernel-space/user-space 的設計,要從瞭解 PPP 是什麼東西開始。正確來說,PPP 只是一種通訊協定,讓兩端通訊點能夠在此通訊協定上,建立 TCP/IP 等網路連線,它與硬體絲毫不相干,硬體裝置對它來說只是種傳輸資料的媒介。而一般人會誤以為 PPP 也處理 Modem 的 AT Command,是因為在過去語音通訊的年代,PPP 總是被拿來做在舊式撥號連線的通訊協定,大部份相關應用都是搭配 AT Command 使用。

也因為 PPP 本身很單純,在 kernel-space 的設計,只負責資料壓縮、解壓縮、轉換以及 Network interface 的建立和對應,而真正在與 Modem 溝通的,則是透過 user-space 的 pppd 這支程式。pppd 透過開啟 /dev/tty* ,並使用 AT Command 和 Modem 交換資料,取得通訊後再將通訊資料傳回 kernel-space 實作做解壓縮、轉換等處理,最後以 virtual network interface(ppp0, ppp1...) 的形式出現。

整個流程之中,其實 PPP 的 kernel-space 實作並不曉得資料是從哪個裝置進來,也不經手網路設定,除資料處理和 interface 對應的操作外,全都由 user-space 的 pppd 負責, pppd 的工作包括記錄 ppp0 與 /dev/tty* 的對應、分析遠端 Server 給的資訊以及各種網路設定。對於網路狀態的記錄,pppd 都存在 /var/run/pppd2.tdb 之中,而該資料庫是採用 samba tdb 的格式所寫成,若是想得知目前 PPP 的網路狀態,可透過分析該檔案達成。

當然,我們可以自己撰寫程式取代 pppd,就不用去讀取 tdb 檔案,不過因為 pppd 幾乎已經被各 Unix-like 系統(Linux、FreeBSD 等等)所使用,近乎標準,似乎沒什麼必要重寫。