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