任艷蕾
(涿州市技師學(xué)院 河北 涿州 072750)
基于數(shù)傳電臺(tái)的TCP/IP通信平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
任艷蕾
(涿州市技師學(xué)院 河北 涿州 072750)
本文介紹了一種借鑒虛擬網(wǎng)卡技術(shù)設(shè)計(jì)實(shí)現(xiàn)基于數(shù)傳電臺(tái)的TCP/IP通信平臺(tái)的方法,該研究成果的應(yīng)用進(jìn)一步拓展了數(shù)傳電臺(tái)的應(yīng)用價(jià)值與范圍。
數(shù)傳電臺(tái);虛擬網(wǎng)絡(luò);TCP/IP
通信網(wǎng)絡(luò)是制約野外物探作業(yè)信息化發(fā)展的關(guān)鍵與瓶頸。面對(duì)公共運(yùn)營商網(wǎng)絡(luò)的不穩(wěn)定及衛(wèi)星通信的高昂費(fèi)用,在現(xiàn)有通信手段的基礎(chǔ)上,自主研發(fā)實(shí)現(xiàn)一套通用的、支持公網(wǎng)通信協(xié)議(TCP/IP)的網(wǎng)絡(luò)通信系統(tǒng)顯得尤為重要。
鑒于數(shù)傳電臺(tái)在石油等行業(yè)野外作業(yè)中被廣泛使用,本文以無序的數(shù)傳電臺(tái)間的通信為基礎(chǔ),在充分借鑒網(wǎng)卡虛擬化的思想和成果的基礎(chǔ)上,設(shè)計(jì)實(shí)現(xiàn)了一個(gè)以虛擬網(wǎng)卡為載體的通信網(wǎng)絡(luò)平臺(tái)系統(tǒng)。該系統(tǒng)一方面通過對(duì)底層網(wǎng)絡(luò)協(xié)議棧的封裝將多個(gè)電臺(tái)組一個(gè)穩(wěn)定的、可靠地通信網(wǎng)絡(luò),另一方面為上層應(yīng)用程序提供統(tǒng)一的網(wǎng)絡(luò)編程接口,極大地增強(qiáng)系統(tǒng)的通用性,從而減少不必要的重復(fù)開發(fā)。
虛擬網(wǎng)卡目前多用于網(wǎng)絡(luò)安全和構(gòu)建虛擬網(wǎng)絡(luò)等應(yīng)用領(lǐng)域,在Linux平臺(tái)上,虛擬網(wǎng)卡實(shí)際上就是一個(gè)網(wǎng)卡驅(qū)動(dòng)程序。
2.1 虛擬網(wǎng)卡工作原理。虛擬網(wǎng)卡并不與真實(shí)的物理設(shè)備進(jìn)行數(shù)據(jù)交互,而是提供了一種數(shù)據(jù)在操作系統(tǒng)內(nèi)核態(tài)和用戶態(tài)之間交互的機(jī)制。通常情況下虛擬網(wǎng)卡驅(qū)動(dòng)并不是單純的網(wǎng)卡驅(qū)動(dòng)程序,其中還實(shí)現(xiàn)了部分字符設(shè)備驅(qū)動(dòng)的功能。在此基礎(chǔ)上,通過訪問用戶態(tài)字符設(shè)備文件,即可實(shí)現(xiàn)數(shù)據(jù)在Linux操作系統(tǒng)兩種運(yùn)行狀態(tài)下的交互。
圖1 虛擬網(wǎng)卡原理
圖2 網(wǎng)絡(luò)驅(qū)動(dòng)體系結(jié)構(gòu)
2.2 虛擬網(wǎng)卡體系結(jié)構(gòu)。通用虛擬網(wǎng)卡程序的體系結(jié)構(gòu)如圖2所示,可分為網(wǎng)絡(luò)協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動(dòng)功能層及網(wǎng)絡(luò)設(shè)備與媒介層。
網(wǎng)絡(luò)協(xié)議接口層為虛擬網(wǎng)卡與內(nèi)核TCP/IP協(xié)議棧之間的接口,通過調(diào)用該層提供的dev_queue_xmit函數(shù)和netif_rx函數(shù),虛擬網(wǎng)卡主邏輯功能可分別實(shí)現(xiàn)IP包的接收與發(fā)送。網(wǎng)絡(luò)設(shè)備接口層提供了統(tǒng)一的用于描述具體網(wǎng)絡(luò)設(shè)備屬性和操作的結(jié)構(gòu)體net_device。設(shè)備驅(qū)動(dòng)功能層是網(wǎng)絡(luò)設(shè)備接口層net_device結(jié)構(gòu)中各成員函數(shù)的實(shí)現(xiàn),是網(wǎng)絡(luò)設(shè)備屬性和操作功能的體現(xiàn)。網(wǎng)絡(luò)設(shè)備與媒介層是完成數(shù)據(jù)包在物理設(shè)備上的發(fā)送和接收的物理設(shè)備接口。虛擬網(wǎng)卡驅(qū)動(dòng)程序最主要的設(shè)計(jì)工作集中在設(shè)備驅(qū)動(dòng)功能層。
本文設(shè)計(jì)的虛擬網(wǎng)卡由協(xié)議預(yù)處理層、數(shù)據(jù)鏈路層及物理接口層組成,系統(tǒng)架構(gòu)設(shè)計(jì)如圖3所示。虛擬網(wǎng)卡的設(shè)計(jì)核心是數(shù)據(jù)鏈路層,該層在定義了數(shù)據(jù)幀格式的基礎(chǔ)上,實(shí)現(xiàn)了數(shù)傳電臺(tái)組網(wǎng)、通信鏈路控制等功能。協(xié)議預(yù)處理層介于內(nèi)核協(xié)議棧與數(shù)據(jù)鏈路層之間,實(shí)現(xiàn)了網(wǎng)絡(luò)層數(shù)據(jù)格式與自定義數(shù)據(jù)鏈路層間的轉(zhuǎn)換及數(shù)據(jù)的雙向傳輸。物理接口層介于數(shù)據(jù)鏈路層與物理設(shè)備(數(shù)傳電臺(tái))之間,通過串口讀寫操作,實(shí)現(xiàn)了數(shù)據(jù)幀的收發(fā)。
圖3 虛擬網(wǎng)卡架構(gòu)設(shè)計(jì)
圖4 數(shù)據(jù)幀格式定義
3.1 數(shù)據(jù)鏈路層設(shè)計(jì)
3.1.1 數(shù)據(jù)幀格式定義。數(shù)據(jù)幀保障了數(shù)據(jù)在鏈路層上傳輸?shù)耐暾院陀行蛐?,其格式定義如圖4所示。其中,Type字段占一個(gè)字節(jié),其中bit0表示該數(shù)據(jù)幀的類型,“0”代表普通數(shù)據(jù)幀,“1”代表網(wǎng)絡(luò)管理數(shù)據(jù)幀;bit1用于區(qū)分原幀與應(yīng)答幀,“0”代表原幀,“1”代表應(yīng)答幀;bit2用于標(biāo)識(shí)該數(shù)據(jù)幀的本次傳輸是否由主節(jié)點(diǎn)發(fā)起,“0”代表由從節(jié)點(diǎn)發(fā)起,“1”代表由主節(jié)點(diǎn)發(fā)起;bit3-7暫未定義。To字段占一個(gè)字節(jié),標(biāo)識(shí)該數(shù)據(jù)幀的目的地址;From字段占一個(gè)字節(jié),標(biāo)識(shí)該數(shù)據(jù)幀的源地址;Seq.字段占一個(gè)字節(jié),用于標(biāo)識(shí)該原幀在發(fā)送隊(duì)列中的序號(hào),接收方正確接收數(shù)據(jù)后,在應(yīng)答幀中沿用原幀Seq.值。Data字段占0~64個(gè)字節(jié),為實(shí)際發(fā)送的數(shù)據(jù)。Resd.字段為保留字段,占一個(gè)字節(jié),用于今后協(xié)議的擴(kuò)展。Checksum字段占一個(gè)字節(jié),為該數(shù)據(jù)幀的校驗(yàn)和。
3.1.2 自組網(wǎng)協(xié)議設(shè)計(jì)。自組網(wǎng)協(xié)議由組網(wǎng)策略、入網(wǎng)策略、出網(wǎng)策略組成。該協(xié)議通過組網(wǎng)策略將多個(gè)網(wǎng)絡(luò)設(shè)備(數(shù)傳電臺(tái))以主從模式組成穩(wěn)定、有序的數(shù)據(jù)通信網(wǎng)絡(luò),對(duì)網(wǎng)絡(luò)成員進(jìn)行統(tǒng)一管理。具體有以下三個(gè)功能:
組網(wǎng)策略:利用最小ID分簇算法(LID),選出中心節(jié)點(diǎn),中心節(jié)點(diǎn)負(fù)責(zé)維護(hù)網(wǎng)絡(luò)成員列表。
圖5 入網(wǎng)流程
圖6 鏈路控制流程
圖7 數(shù)據(jù)發(fā)送流程
入網(wǎng)策略:中心節(jié)點(diǎn)收到子節(jié)點(diǎn)入網(wǎng)請(qǐng)求后,中心節(jié)點(diǎn)將該節(jié)點(diǎn)加入網(wǎng)絡(luò)成員列表并告知該節(jié)點(diǎn)(子節(jié)點(diǎn)入網(wǎng)過程如圖5所示)。
出網(wǎng)策略:中心節(jié)點(diǎn)對(duì)網(wǎng)絡(luò)成員進(jìn)行超時(shí)監(jiān)控,發(fā)現(xiàn)節(jié)點(diǎn)處于覆蓋范圍外(通信超時(shí)),則從成員列表中刪除該成員。
3.1.3 數(shù)據(jù)鏈路控制模塊設(shè)計(jì)。數(shù)據(jù)鏈路控制模塊負(fù)責(zé)解析網(wǎng)絡(luò)管理幀緩存區(qū)中的管理命令,并通過改變功能模塊標(biāo)志位來通知對(duì)應(yīng)功能模塊進(jìn)行工作。以信道使用權(quán)為例,當(dāng)數(shù)據(jù)接收模塊將帶有信道使用權(quán)的管理幀放入網(wǎng)絡(luò)管理幀緩沖區(qū)。數(shù)據(jù)鏈路模塊開始遍歷該緩沖區(qū),解析到獲取信道使用權(quán)的命令后,將數(shù)據(jù)發(fā)送模塊的標(biāo)志位置1,通知數(shù)據(jù)發(fā)送模塊開始工作。圖6所示為數(shù)據(jù)鏈路控制流程。
3.1.4 數(shù)據(jù)發(fā)送模塊設(shè)計(jì)。數(shù)據(jù)發(fā)送模塊負(fù)責(zé)將虛擬網(wǎng)卡產(chǎn)生的數(shù)據(jù)幀發(fā)送到網(wǎng)絡(luò)中。有數(shù)據(jù)要發(fā)送時(shí),數(shù)據(jù)發(fā)送模塊先判斷是否具有信道使用權(quán)限,如果當(dāng)前節(jié)點(diǎn)具有信道使用權(quán),數(shù)據(jù)發(fā)送模塊將緩存區(qū)的數(shù)據(jù)幀取出,調(diào)用串口操作接口將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中。然后向主節(jié)點(diǎn)發(fā)送釋放信道使用權(quán)的控制幀。數(shù)據(jù)發(fā)送流程如圖7所示。
3.1.5 數(shù)據(jù)接收模塊設(shè)計(jì)。數(shù)據(jù)接收模塊負(fù)責(zé)接收網(wǎng)絡(luò)數(shù)據(jù),首先判斷數(shù)據(jù)目的地是否為自己,如果是將接收的數(shù)據(jù)按數(shù)據(jù)幀和控制幀分別存到接收數(shù)據(jù)緩存區(qū)和接收控制命令緩沖區(qū)。反之不做任何操作。
3.2 IP包預(yù)處理模塊設(shè)計(jì)。IP包預(yù)處理模塊主要有兩個(gè)功能:一是將協(xié)議棧下發(fā)的IP數(shù)據(jù)包按數(shù)據(jù)傳輸幀格式進(jìn)行分割和組幀如圖8所示,然后存入發(fā)送緩沖區(qū);二是接收緩存區(qū)的傳輸幀按IP包的幀格式解包和組幀,然后傳入內(nèi)核協(xié)議棧中。通過IP包預(yù)處理模塊實(shí)現(xiàn)了IP數(shù)據(jù)與傳輸幀的轉(zhuǎn)換,完成內(nèi)核協(xié)議棧和數(shù)據(jù)鏈路層數(shù)據(jù)的交換。
3.3 串口讀寫模塊設(shè)計(jì)。物理接口層兼容網(wǎng)絡(luò)設(shè)備基本操作,為數(shù)據(jù)鏈路層的數(shù)據(jù)收發(fā)模塊提供操作接口,使數(shù)據(jù)鏈路層無需關(guān)系底層網(wǎng)絡(luò)設(shè)備,實(shí)現(xiàn)數(shù)據(jù)鏈路層的數(shù)據(jù)在物理網(wǎng)絡(luò)設(shè)備上的傳輸。
圖8 數(shù)據(jù)幀封包流程
4.1 測試環(huán)境。本測試?yán)脙膳_(tái)計(jì)算機(jī)通過數(shù)傳電臺(tái)進(jìn)行網(wǎng)絡(luò)通信,來驗(yàn)證虛擬網(wǎng)卡的工作情況。
主機(jī)A:虛擬網(wǎng)卡IP為192.168.0.1,操作系統(tǒng)是Linux(內(nèi)核版本 2.6.32);主機(jī)B:虛擬網(wǎng)卡 IP為192.168.0.2,操作系統(tǒng)是Linux(內(nèi)核版本2.6.32)。
4.2 數(shù)傳電臺(tái)PING命令測試。①insmod vnic.ko加載驅(qū)動(dòng)程序。②ifconfig vnic 192.168.0.1 up啟動(dòng)A主機(jī)虛擬網(wǎng)卡;ifconfig vnic 192.168.0.2 up啟動(dòng)B主機(jī)虛擬網(wǎng)卡;③A主機(jī)向B主機(jī)發(fā)送ping命令。
4.3 測試結(jié)果。主機(jī)B接收到A的ping包后經(jīng)過差錯(cuò)控制,寫入虛擬網(wǎng)卡,并讀出虛擬網(wǎng)卡的恢復(fù)包。然后發(fā)向主機(jī)A,B接收到84字節(jié)的ping包,并以16進(jìn)制的形式打印出來,其中“c0 a8 00 02和c0 a8 00 01”分別表示源地址和目的地址。第21個(gè)字節(jié)“08”表示此ping的請(qǐng)求包。Ping包的回復(fù)內(nèi)容也類似,第21個(gè)字節(jié)“00”表示數(shù)據(jù)包時(shí)ping的回復(fù)包。
[1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè) [M].北京:人民郵電出版社,2008.
[2]JONATHANCORBET,ALESSANDRORUBINI& GREG KROAH-HARTMAN.Linux設(shè)備驅(qū)動(dòng)程序 (第三版) [M].北京:中國電力出版社,2006.
[3]Douglas E.Comer,David L.Stevens著,張衛(wèi)、王能譯.TCP/IP網(wǎng)絡(luò)互聯(lián)技術(shù)卷3客戶-服務(wù)器編程與應(yīng)用windows套接字版 [M].北京:清華大學(xué)出版社,2004.
[4]Klaus Wehrle Frank Pahlke,Hartmut Ritter著,汪青青,盧祖英譯.Linux網(wǎng)絡(luò)體系結(jié)構(gòu) [M].北京:清華學(xué)出版社,2006.