任艷蕾
(涿州市技師學院 河北 涿州 072750)
基于數傳電臺的TCP/IP通信平臺的設計與實現
任艷蕾
(涿州市技師學院 河北 涿州 072750)
本文介紹了一種借鑒虛擬網卡技術設計實現基于數傳電臺的TCP/IP通信平臺的方法,該研究成果的應用進一步拓展了數傳電臺的應用價值與范圍。
數傳電臺;虛擬網絡;TCP/IP
通信網絡是制約野外物探作業信息化發展的關鍵與瓶頸。面對公共運營商網絡的不穩定及衛星通信的高昂費用,在現有通信手段的基礎上,自主研發實現一套通用的、支持公網通信協議(TCP/IP)的網絡通信系統顯得尤為重要。
鑒于數傳電臺在石油等行業野外作業中被廣泛使用,本文以無序的數傳電臺間的通信為基礎,在充分借鑒網卡虛擬化的思想和成果的基礎上,設計實現了一個以虛擬網卡為載體的通信網絡平臺系統。該系統一方面通過對底層網絡協議棧的封裝將多個電臺組一個穩定的、可靠地通信網絡,另一方面為上層應用程序提供統一的網絡編程接口,極大地增強系統的通用性,從而減少不必要的重復開發。
虛擬網卡目前多用于網絡安全和構建虛擬網絡等應用領域,在Linux平臺上,虛擬網卡實際上就是一個網卡驅動程序。
2.1 虛擬網卡工作原理。虛擬網卡并不與真實的物理設備進行數據交互,而是提供了一種數據在操作系統內核態和用戶態之間交互的機制。通常情況下虛擬網卡驅動并不是單純的網卡驅動程序,其中還實現了部分字符設備驅動的功能。在此基礎上,通過訪問用戶態字符設備文件,即可實現數據在Linux操作系統兩種運行狀態下的交互。

圖1 虛擬網卡原理

圖2 網絡驅動體系結構
2.2 虛擬網卡體系結構。通用虛擬網卡程序的體系結構如圖2所示,可分為網絡協議接口層、網絡設備接口層、設備驅動功能層及網絡設備與媒介層。
網絡協議接口層為虛擬網卡與內核TCP/IP協議棧之間的接口,通過調用該層提供的dev_queue_xmit函數和netif_rx函數,虛擬網卡主邏輯功能可分別實現IP包的接收與發送。網絡設備接口層提供了統一的用于描述具體網絡設備屬性和操作的結構體net_device。設備驅動功能層是網絡設備接口層net_device結構中各成員函數的實現,是網絡設備屬性和操作功能的體現。網絡設備與媒介層是完成數據包在物理設備上的發送和接收的物理設備接口。虛擬網卡驅動程序最主要的設計工作集中在設備驅動功能層。
本文設計的虛擬網卡由協議預處理層、數據鏈路層及物理接口層組成,系統架構設計如圖3所示。虛擬網卡的設計核心是數據鏈路層,該層在定義了數據幀格式的基礎上,實現了數傳電臺組網、通信鏈路控制等功能。協議預處理層介于內核協議棧與數據鏈路層之間,實現了網絡層數據格式與自定義數據鏈路層間的轉換及數據的雙向傳輸。物理接口層介于數據鏈路層與物理設備(數傳電臺)之間,通過串口讀寫操作,實現了數據幀的收發。

圖3 虛擬網卡架構設計

圖4 數據幀格式定義
3.1 數據鏈路層設計
3.1.1 數據幀格式定義。數據幀保障了數據在鏈路層上傳輸的完整性和有序性,其格式定義如圖4所示。其中,Type字段占一個字節,其中bit0表示該數據幀的類型,“0”代表普通數據幀,“1”代表網絡管理數據幀;bit1用于區分原幀與應答幀,“0”代表原幀,“1”代表應答幀;bit2用于標識該數據幀的本次傳輸是否由主節點發起,“0”代表由從節點發起,“1”代表由主節點發起;bit3-7暫未定義。To字段占一個字節,標識該數據幀的目的地址;From字段占一個字節,標識該數據幀的源地址;Seq.字段占一個字節,用于標識該原幀在發送隊列中的序號,接收方正確接收數據后,在應答幀中沿用原幀Seq.值。Data字段占0~64個字節,為實際發送的數據。Resd.字段為保留字段,占一個字節,用于今后協議的擴展。Checksum字段占一個字節,為該數據幀的校驗和。
3.1.2 自組網協議設計。自組網協議由組網策略、入網策略、出網策略組成。該協議通過組網策略將多個網絡設備(數傳電臺)以主從模式組成穩定、有序的數據通信網絡,對網絡成員進行統一管理。具體有以下三個功能:
組網策略:利用最小ID分簇算法(LID),選出中心節點,中心節點負責維護網絡成員列表。

圖5 入網流程

圖6 鏈路控制流程

圖7 數據發送流程
入網策略:中心節點收到子節點入網請求后,中心節點將該節點加入網絡成員列表并告知該節點(子節點入網過程如圖5所示)。
出網策略:中心節點對網絡成員進行超時監控,發現節點處于覆蓋范圍外(通信超時),則從成員列表中刪除該成員。
3.1.3 數據鏈路控制模塊設計。數據鏈路控制模塊負責解析網絡管理幀緩存區中的管理命令,并通過改變功能模塊標志位來通知對應功能模塊進行工作。以信道使用權為例,當數據接收模塊將帶有信道使用權的管理幀放入網絡管理幀緩沖區。數據鏈路模塊開始遍歷該緩沖區,解析到獲取信道使用權的命令后,將數據發送模塊的標志位置1,通知數據發送模塊開始工作。圖6所示為數據鏈路控制流程。
3.1.4 數據發送模塊設計。數據發送模塊負責將虛擬網卡產生的數據幀發送到網絡中。有數據要發送時,數據發送模塊先判斷是否具有信道使用權限,如果當前節點具有信道使用權,數據發送模塊將緩存區的數據幀取出,調用串口操作接口將數據發送到網絡中。然后向主節點發送釋放信道使用權的控制幀。數據發送流程如圖7所示。
3.1.5 數據接收模塊設計。數據接收模塊負責接收網絡數據,首先判斷數據目的地是否為自己,如果是將接收的數據按數據幀和控制幀分別存到接收數據緩存區和接收控制命令緩沖區。反之不做任何操作。
3.2 IP包預處理模塊設計。IP包預處理模塊主要有兩個功能:一是將協議棧下發的IP數據包按數據傳輸幀格式進行分割和組幀如圖8所示,然后存入發送緩沖區;二是接收緩存區的傳輸幀按IP包的幀格式解包和組幀,然后傳入內核協議棧中。通過IP包預處理模塊實現了IP數據與傳輸幀的轉換,完成內核協議棧和數據鏈路層數據的交換。
3.3 串口讀寫模塊設計。物理接口層兼容網絡設備基本操作,為數據鏈路層的數據收發模塊提供操作接口,使數據鏈路層無需關系底層網絡設備,實現數據鏈路層的數據在物理網絡設備上的傳輸。

圖8 數據幀封包流程
4.1 測試環境。本測試利用兩臺計算機通過數傳電臺進行網絡通信,來驗證虛擬網卡的工作情況。
主機A:虛擬網卡IP為192.168.0.1,操作系統是Linux(內核版本 2.6.32);主機B:虛擬網卡 IP為192.168.0.2,操作系統是Linux(內核版本2.6.32)。
4.2 數傳電臺PING命令測試。①insmod vnic.ko加載驅動程序。②ifconfig vnic 192.168.0.1 up啟動A主機虛擬網卡;ifconfig vnic 192.168.0.2 up啟動B主機虛擬網卡;③A主機向B主機發送ping命令。
4.3 測試結果。主機B接收到A的ping包后經過差錯控制,寫入虛擬網卡,并讀出虛擬網卡的恢復包。然后發向主機A,B接收到84字節的ping包,并以16進制的形式打印出來,其中“c0 a8 00 02和c0 a8 00 01”分別表示源地址和目的地址。第21個字節“08”表示此ping的請求包。Ping包的回復內容也類似,第21個字節“00”表示數據包時ping的回復包。
[1]韋東山.嵌入式Linux應用開發完全手冊 [M].北京:人民郵電出版社,2008.
[2]JONATHANCORBET,ALESSANDRORUBINI& GREG KROAH-HARTMAN.Linux設備驅動程序 (第三版) [M].北京:中國電力出版社,2006.
[3]Douglas E.Comer,David L.Stevens著,張衛、王能譯.TCP/IP網絡互聯技術卷3客戶-服務器編程與應用windows套接字版 [M].北京:清華大學出版社,2004.
[4]Klaus Wehrle Frank Pahlke,Hartmut Ritter著,汪青青,盧祖英譯.Linux網絡體系結構 [M].北京:清華學出版社,2006.