張紹鳳,羅佳偉,姜勝明
(上海海事大學(xué)信息工程學(xué)院,上海 201306)
Semi-TCP[1]通過將TCP的擁塞控制下放到鏈路層,已經(jīng)提高了無線多跳網(wǎng)絡(luò)下的擁塞控制性能[2],但是實現(xiàn)可靠性控制的ARQ重傳機制和TCP并沒有結(jié)合,因此導(dǎo)致ARQ傳輸節(jié)點傳輸壓力很大,針對該種現(xiàn)狀,Semi-TCP與ARQ協(xié)議相結(jié)合的差錯控制的研究是很有意義的。ARQ是一種基于幀的差錯控制技術(shù)[3],主要是通過重傳鏈路中丟失或出錯的數(shù)據(jù)幀來提高數(shù)據(jù)傳輸?shù)目煽啃?,一般來講,ARQ協(xié)議涉及了以下機制:鏈路錯誤檢測、定時器、確認(rèn)和重傳。當(dāng)發(fā)送方無法確認(rèn)接收方是否正確收到某些數(shù)據(jù)幀時[4],它就自動重傳這些幀。因此提出在無線多跳網(wǎng)絡(luò)下,通過將數(shù)據(jù)鏈路層的ARQ協(xié)議和現(xiàn)有Semi-TCP聯(lián)合實現(xiàn)來提高數(shù)據(jù)傳輸可靠性。
Semi-TCP協(xié)議已經(jīng)在實際平臺ARM開發(fā)板得以實現(xiàn)[3],現(xiàn)基于ARM內(nèi)核的nRF51822開發(fā)板,通過C語言修改相關(guān)函數(shù)完成數(shù)據(jù)收發(fā)、手動定義發(fā)送幀、以及設(shè)置相應(yīng)參數(shù)、不修改已有MAC層的底層幀和現(xiàn)有的硬件配置信息,完成鏈路層ARQ協(xié)議的添加并進行功能和性能測試[5]。
差錯控制一般是指監(jiān)測和改正錯誤數(shù)據(jù)包的機制[6]。大多數(shù)ARQ的差錯控制技術(shù)是基于ACK/NACK和重傳。一般情況下有三種基本的ARQ理論[7]:stopand-wait ARQ,go-back-N ARQ 和 selective-repeat ARQ。
在stop-and-wait ARQ中,發(fā)送端每發(fā)出一個數(shù)據(jù)包都必須等待確認(rèn)信號,在收到確認(rèn)信號之前不發(fā)任何新的數(shù)據(jù)包。它的主要優(yōu)點是構(gòu)造簡單、算法復(fù)雜度低,缺點是效率低下,目前很少單獨使用。在goback-N ARQ中,發(fā)送端不考慮接收端的接收情況連續(xù)發(fā)出數(shù)據(jù)包,若沒有錯誤產(chǎn)生,接收端確認(rèn)所有收到的幀。如果接收端檢測到錯誤,則向發(fā)送端發(fā)出NACK信號,發(fā)送端收到此信號后開始重新發(fā)送從錯誤包開始之后的所有數(shù)據(jù),這樣以來重發(fā)的數(shù)據(jù)包個數(shù)N不能確定,因此稱作go-back-N ARQ。在接收端,如果一個數(shù)據(jù)包存在錯誤,那么在此數(shù)據(jù)包之后所收到的N個數(shù)據(jù)包都將被丟棄。這種算法的主要優(yōu)點是復(fù)雜度低,缺點是信道利用率不高,當(dāng)信道條件較差的時候通過率急劇下降。在selective-repeat ARQ中,僅重傳錯誤數(shù)據(jù)包。它的效率最高,但是存在一個影響其應(yīng)用的缺點:為保證重傳數(shù)據(jù)包邏輯順序的正確,接收端需要一個足夠大的緩存來存儲已經(jīng)接收到的所有數(shù)據(jù)包直到錯誤數(shù)據(jù)重傳成功。隨著傳輸速率的加大,這種重傳方案所需要的緩存數(shù)量是驚人的。
基于nRF51822開發(fā)板低功耗并且接收到數(shù)據(jù)能及時轉(zhuǎn)發(fā)同時擦除緩存數(shù)據(jù),采用selective-repeat ARQ相對較適宜,因此主要實現(xiàn)selective-repeat ARQ的算法流程。
ARQ協(xié)議的實現(xiàn)場景適用于無線網(wǎng)絡(luò)場景下,而nRF51822作為一個一款集成nRF51x系列無線收發(fā)器的超低功耗的片上系統(tǒng)(SoC),包含32位ARM Cortex-M0 CPU等,同時具有完善的藍牙協(xié)議棧,支持網(wǎng)絡(luò)協(xié)議的添加和更改,是測試協(xié)議及其增強的良好平臺,藍牙協(xié)議棧的無線架構(gòu)如圖1所示。
圖1 藍牙協(xié)議棧無線架構(gòu)概覽
圖1中從上到下依次是應(yīng)用層、主協(xié)議層以及控制層,其中控制層(Controller)中從下到上分別是物理層、數(shù)據(jù)鏈路層和主機控制層(HCI),這三層主要位于控制器中。其中物理層主要負責(zé)從信道中發(fā)送接收數(shù)據(jù),使數(shù)據(jù)符合數(shù)據(jù)流的格式;而數(shù)據(jù)鏈路層則負責(zé)鏈路的管理和控制,包括創(chuàng)建、維護、釋放等;主機控制器則負責(zé)與數(shù)據(jù)無關(guān)的藍牙系統(tǒng)的操作,例如詢問藍牙設(shè)備是否存在,連接藍牙設(shè)備,或者讓本地的藍牙可以被其他設(shè)備發(fā)現(xiàn)或連接。為了執(zhí)行響應(yīng)的功能,HCI要求及通過基帶的資源控制器訪問傳輸媒介。同時,設(shè)備管理器還通過HCI命令控制本地設(shè)備的控制行為。
主協(xié)議層(Host)包括邏輯鏈路控制和適配協(xié)議(L2CAP),應(yīng)用程序和服務(wù)提供了基于信道的抽象,包括進行數(shù)據(jù)分片化和組裝應(yīng)用程序的數(shù)據(jù),復(fù)用和反復(fù)用多通道共享一個邏輯鏈路。除了L2CAP,主協(xié)議層還包括安全管理協(xié)議(SMP)和屬性協(xié)議(ATT);安全管理協(xié)議(SMP)負責(zé)使用信道實現(xiàn)設(shè)備之間安全功能,屬性協(xié)議(ATT)提供了在一個固定的L2CAP信道上傳輸少量數(shù)據(jù)的方法,也用于確定其他設(shè)備的服務(wù)和其他設(shè)備的功能;而通用屬性(GATT)配置文件指定了配置文件數(shù)據(jù)交換的結(jié)構(gòu),該結(jié)構(gòu)定義概要文件中使用的基本元素,如服務(wù)和特性;最后通用訪問配置文件(GAP)定義了藍牙設(shè)備的基本要求。
應(yīng)用層(Apps)上定義了三種規(guī)范:特征、服務(wù)和概述。每種規(guī)范都是建立在GAP上,GAP定義了特征和服務(wù)的屬性,應(yīng)用層則定義如何使用這些屬性組。
nRF51822屬于挪威NORDIC公司推出的nRF51系列2.4G無線低功耗片上方案解決系統(tǒng)中的一員,以Cortex M0內(nèi)核為基礎(chǔ),結(jié)合BLE4.0的SoC,因此開發(fā)軟件也與其他ARM芯片類似,都采用Keil進行開發(fā),而Keil MDK-ARM是美國Keil軟件公司出品的支持ARM微控制器的一款集成開發(fā)環(huán)境,包含了工業(yè)標(biāo)準(zhǔn)的編譯器和調(diào)試器等組件,是目前來說比較完善的開發(fā)環(huán)境。一般而言,nRF51822芯片有兩種開發(fā)方式,一種是直接在上面編寫應(yīng)用程序;一種是使用nRF51822的SoftDevice,SoftDevice是一個低功耗藍牙協(xié)議棧,這個協(xié)議棧并沒有像TI一樣做成系統(tǒng)形式直接和應(yīng)用代碼一起下載,而是先必須把協(xié)議棧燒錄到芯片內(nèi),然后再用Keil通過仿真器下載應(yīng)用代碼,并且安裝協(xié)議棧工具nRFgostudio來實現(xiàn)協(xié)議棧的代碼。
ARQ協(xié)議的實現(xiàn)關(guān)鍵在于對于幀結(jié)構(gòu)的定義以及定時器的設(shè)置。就停等式ARQ協(xié)議而言,發(fā)送數(shù)據(jù)的同時設(shè)置定時器開始計時,接收端收到數(shù)據(jù)則發(fā)送ACK確認(rèn)幀,定時器規(guī)定時間內(nèi)收到接收端的確認(rèn)幀則發(fā)送成功,若數(shù)據(jù)幀在發(fā)送過程中丟失,則不會產(chǎn)生確認(rèn)幀,等定時器時間到后重新發(fā)送該數(shù)據(jù),若確認(rèn)幀丟失,則也重新發(fā)送,最后若定時器未超時,數(shù)據(jù)校驗后出現(xiàn)錯誤,也要重傳數(shù)據(jù)。該ARQ協(xié)議實現(xiàn)流程如圖2所示。
圖2 ARQ算法實現(xiàn)流程圖
在進行協(xié)議添加之前首先需要完成協(xié)議棧的初始化,其中包括使用timers_init()函數(shù)完成定時器的初始化,以及使用ble_stack_init()完成藍牙協(xié)議棧的初始化,同時還有使用device_manager_init(eraser_bonds)完成設(shè)備管理初始化等,還包括使用gap_params_init()函數(shù)完成GAP參數(shù)的初始化,使用services_init()函數(shù)完成服務(wù)初始化和使用conn_params_init()函數(shù)完成更新過程的初始化,更為重要的是需要使用nrf_esb_init()函數(shù)完成esb初始化,然后通過nrf_esb_enable()函數(shù)打開esb。開發(fā)板進行通信之前也需要完成相應(yīng)的參數(shù)配置,參數(shù)配置完成以及初始化完成后進行數(shù)據(jù)的相應(yīng)發(fā)送和接收,主要通過application_timers_start()實現(xiàn)定時器開始計時,使用nrf_esb_add_packet_to_tx_fifo()將相應(yīng)數(shù)據(jù)加入發(fā)送隊列,發(fā)送方板子通過rx_char_add發(fā)送數(shù)據(jù),接收方板子通過tx_char_add接收數(shù)據(jù),接收到數(shù)據(jù)之后查看定時器時間,若未超時則觸發(fā)函數(shù)發(fā)送ACK確認(rèn)幀,然后根據(jù)判定條件完成數(shù)據(jù)分析,若判定條件為正確的,則完成一次數(shù)據(jù)發(fā)送。若規(guī)定時間內(nèi)未收到發(fā)送數(shù)據(jù)或者數(shù)據(jù)分析判定條件顯示錯誤,則不發(fā)送ACK確認(rèn)幀,只等待數(shù)據(jù)的下一次發(fā)送。發(fā)送方在規(guī)定時間內(nèi)未接收到ACK確認(rèn)幀,則重新發(fā)送數(shù)據(jù)。
測試的目的主要是為了測試ARQ協(xié)議添加之后網(wǎng)絡(luò)是否出現(xiàn)異常以及ARQ協(xié)議是否按照最初設(shè)想完成相應(yīng)協(xié)議功能。測試環(huán)境首先需要兩臺開發(fā)板測試機,一臺作為發(fā)送方測試機,一臺作為接收方,然后通過端到端的連通測試工具ping命令對網(wǎng)絡(luò)連通狀態(tài)進行判斷和分析[2],通過ping命令的反饋查看網(wǎng)絡(luò)連通狀態(tài)是否良好,是否連接暢通;其次在通過ARQ協(xié)議收發(fā)ACK確認(rèn)幀數(shù)據(jù)的同時,也設(shè)置了相應(yīng)的收發(fā)判斷函數(shù),通過該判斷函數(shù)查看數(shù)據(jù)是否同ACK幀反應(yīng)的收發(fā)情況一致。
通過ping命令反應(yīng)發(fā)送方與接收方之間網(wǎng)絡(luò)連接暢通,丟包率為0,只是時延略有一點延長;同時通過函數(shù) void nrf_esb_tx_success(uint32_t tx_pipe,int32_t rssi)以及函數(shù) void nrf_esb_tx_failed(uint32_t tx_pipe)以及函 數(shù) void nrf_esb_rx_data_ready(uint32_trx_pipe,int32_t rssi)以及 void nrf_esb_disabled(void)完成結(jié)果測試,最終發(fā)現(xiàn)測試函數(shù)反映的數(shù)據(jù)收發(fā)情況與ACK確認(rèn)幀反映的數(shù)據(jù)收發(fā)情況一致。
隨著對網(wǎng)絡(luò)協(xié)議的研究深入,網(wǎng)絡(luò)協(xié)議在實際平臺上的實現(xiàn)與測試也變得愈發(fā)重要。在實際平臺nRF51822開發(fā)板,通過函數(shù)的調(diào)用與協(xié)議棧的參數(shù)設(shè)置聯(lián)合實現(xiàn)Semi-TCP與ARQ協(xié)議,并通過建立ARQ不同的糾錯能力的多個場景,根據(jù)具體測試函數(shù)完成對該方案的測試,對其的性能進行分析。由此得知,Semi-TCP與ARQ協(xié)議的聯(lián)合實現(xiàn),確實在一定程度上提高了通信的可靠性,減小了ARQ節(jié)點傳輸壓力,但仍需在平臺不斷調(diào)試優(yōu)化。
[1]Jiang Sheng-ming,Zuo Qin,Wei Gang.Decoupling Congestion Control from TCP for Multi-hop Wireless Networks:Semi-TCP[C].Proc.of the 4th ACM Workshop on Challenged Networks.Beijing,China:ACM Press,2009.
[2]劉杰,姜勝明.Semi-Tcp協(xié)議在ARM開發(fā)板RP4412下的實現(xiàn)方法.上海:1007-1423(2017)11-0065-05,2017-04-10
[3]謝希仁.計算機網(wǎng)絡(luò)[M](第4版).北京:電子工業(yè)出版社,2003.
[4]莫國慶,馬濤.具有鏈路層ARQ機制的TCP研究.解放軍理工大學(xué),2007.
[5]熊晨霖.Semi-TCP在海洋互聯(lián)網(wǎng)中的應(yīng)用仿真研究[D].華南理工大學(xué),2016.
[6]劉梅,姜勝明,陸以勤.無線多跳網(wǎng)絡(luò)中Semi-TCP協(xié)議的實現(xiàn)[J].計算機工程,2012(09):79-82.
[7]W.Stallings.Data and Computer Communications.Upper Saddle River,NJ.Prentice Hall,1997.