陳憲超 王 輝,張興海,鄭達標,石海濤 趙先進
(徐工集團徐州建機工程機械有限公司,江蘇 徐州 221001) (徐州赫思曼電子有限公司,江蘇 徐州 221001) (徐州長航科技有限公司,江蘇 徐州 221001)
物聯(lián)網(wǎng)應(yīng)用中TCP重傳隊列的設(shè)計與實現(xiàn)
陳憲超 王 輝,張興海,鄭達標,石海濤 趙先進
(徐工集團徐州建機工程機械有限公司,江蘇 徐州 221001) (徐州赫思曼電子有限公司,江蘇 徐州 221001) (徐州長航科技有限公司,江蘇 徐州 221001)
物聯(lián)網(wǎng)應(yīng)用的關(guān)鍵技術(shù)之一就是要實現(xiàn)嵌入式設(shè)備的網(wǎng)絡(luò)化,其中一種思路就是在嵌入式設(shè)備中集成簡化后的TCP/IP協(xié)議棧。然而在精簡TCP/IP協(xié)議棧中的TCP協(xié)議時會面臨一個技術(shù)難題:如何根據(jù)實際應(yīng)用設(shè)計合適的重傳隊列。以嵌入式Web服務(wù)為例,緊緊圍繞嵌入式Web服務(wù)器應(yīng)用的具體要求,詳細分析了如何設(shè)計并實現(xiàn)TCP重傳隊列。測試結(jié)果表明,該設(shè)計思路可行。
物聯(lián)網(wǎng);TCP/IP;嵌入式Web服務(wù)器;嵌入式TCP;TCP重傳隊列
如何將嵌入式設(shè)備接入網(wǎng)絡(luò),進而實現(xiàn)物聯(lián)網(wǎng)應(yīng)用,是當(dāng)前一個研究熱點[1]。其中,比較常見的一種實現(xiàn)方案是在嵌入式設(shè)備中實現(xiàn)精簡的TCP/IP協(xié)議棧后再將該設(shè)備接入Internet[2-3]。在此過程中,如果需要實現(xiàn)基于TCP協(xié)議的高層應(yīng)用,就必須要根據(jù)嵌入式設(shè)備的具體功能來簡化實現(xiàn)TCP協(xié)議,而設(shè)計實現(xiàn)TCP協(xié)議就必須要實現(xiàn)TCP重傳隊列。因此,如何有針對性地實現(xiàn)TCP重傳隊列就是一個技術(shù)難點。
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是TCP/IP協(xié)議簇的核心協(xié)議, 也是TCP/IP協(xié)議簇中最復(fù)雜的協(xié)議。它是一種面向連接的、可靠的、基于字節(jié)流的運輸層通信協(xié)議[4]。TCP之所以是一種可靠的協(xié)議,就在于它有一種完善的重傳機制。在一般標準的TCP協(xié)議實現(xiàn)中,重傳機制的關(guān)鍵問題是要計算RTO(Retransmission Time Out),花費的代價較大[4-7]。一旦得到RTO之后,剩下的操作就是當(dāng)某個重傳計時器超時后重發(fā)對應(yīng)的TCP包,有多種方式可以完成該重發(fā)操作。在很多的TCP重傳實現(xiàn)中,都需要借助一個重傳隊列來記錄已經(jīng)發(fā)送的TCP報文,并在超時后進行重傳操作。
2.1設(shè)計思路
圖1 順序鏈表結(jié)構(gòu)示意圖
筆者的設(shè)計思路是利用順序鏈表記錄每個已發(fā)送的TCP數(shù)據(jù)包,而當(dāng)收到TCP確認報文時就從該順序鏈表中刪除相應(yīng)的TCP數(shù)據(jù)包。同時,每隔一定的時間就觸發(fā)一個TCP重傳事件,以發(fā)送那些隊列中已經(jīng)超時所有TCP數(shù)據(jù)包。順序鏈表的結(jié)構(gòu)如圖1所示。由圖1可知,每個連接g_Conn[i]都單獨維護一個TCP重傳隊列,該隊列的長度用字段MemPkgNum記錄,隊首部地址由字段MemPoolHeader記錄。該重傳隊列采用一個如圖1所示的雙層順序鏈表來存儲:第1層為一個_MEM_CELL型的結(jié)構(gòu)體,用于存儲可能需要重傳(即已發(fā)送但沒有確認)數(shù)據(jù)包的相關(guān)信息,以便維護該連接所有可能需要重傳的TCP報文。字段Next的作用是將該連接中所有可能需要重傳的TCP報文都連接在一個順序鏈表上,字段RetryTimer是該包的定時器,字段RetryNum記錄的該包重傳的次數(shù)。字段ExpectAck是該結(jié)點中的關(guān)鍵字,在收到對方的確認后會通過該字段值來刪除重傳隊列中相對于的包。BuffPtr和TotalPkgLen字段定義了該數(shù)據(jù)包實體的首地址和總長度。這種設(shè)計結(jié)構(gòu)有如下方便:能在TCP發(fā)送模塊在調(diào)用地層發(fā)送驅(qū)動發(fā)送數(shù)據(jù)包后直接將該包掛到此重傳隊列后面,也便于在ARP解析失敗后直接進行ARP重傳操作的處理。
2.2具體實現(xiàn)
設(shè)計完該數(shù)據(jù)結(jié)構(gòu)后,剩下的工作就是要設(shè)計對應(yīng)鏈表的相關(guān)維護操作,如構(gòu)造操作、插入操作、查找操作和刪除操作等。
1)鏈表結(jié)點的構(gòu)造操作 構(gòu)造鏈表結(jié)點的操作由Get_Mem()函數(shù)負責(zé),在TCP發(fā)送模塊中調(diào)用。每當(dāng)系統(tǒng)需要發(fā)送TCP報文時,就會調(diào)用Get_Mem()以動態(tài)分配2個區(qū)塊:其中一個區(qū)塊用于構(gòu)造_MEM_CELL型數(shù)據(jù)結(jié)構(gòu),以順利完成順序鏈表的相關(guān)操作;另外一個區(qū)塊用于構(gòu)造一個緩存,以裝載要發(fā)送的TCP報文。該函數(shù)的實現(xiàn)流程如圖2所示。
圖2 Get_Mem()函數(shù)和Insert_Mem()函數(shù)的流程圖
2)鏈表結(jié)點的插入操作 當(dāng)Get_Mem()函數(shù)被成功調(diào)用后,系統(tǒng)就會調(diào)用Insert_Mem()函數(shù)將TCP報文插入到對應(yīng)連接的順序鏈表中。該函數(shù)的定義形式如下:void Insert_Mem(p_Conn,p_MemPtr,p_Ack)。該函數(shù)各參數(shù)的意義分別如下:p_Conn指明某個連接號、p_MemPtr指示了該結(jié)點對應(yīng)的首地址指針,p_Ack說明了該TCP報文的期望號,它的實現(xiàn)流程如圖2所示。
3)鏈表結(jié)點的查找操作 Search_Mem()函數(shù)用來查找某個TCP報文,該報文由指定的ACK號確定。
4)鏈表結(jié)點的刪除操作 TCP模塊在接收ACK型的TCP數(shù)據(jù)包后,會對該數(shù)據(jù)包進行合法性檢查,如果認為該數(shù)據(jù)包是合法的,則會根據(jù)收到的ACK號調(diào)用Delete_BeforSeqMem()函數(shù)以刪除那些已經(jīng)成功發(fā)送的TCP報文??紤]到客戶端有可能會對服務(wù)器發(fā)出的TCP數(shù)據(jù)包進行批量確認,因此凡是ACK字段小于或等于收到的ACK號的那些TCP數(shù)據(jù)包都應(yīng)該被刪除掉。Delete_BeforSeqMem()函數(shù)的作用是刪除對應(yīng)的結(jié)點,并釋放該結(jié)點的內(nèi)存區(qū)塊,需要注意的是應(yīng)先釋放其BuffPtr所指的內(nèi)存區(qū)塊,再釋放_MEM_CELL型結(jié)點所占的內(nèi)存區(qū)塊。
筆者采用的測試方法是將嵌入式Web服務(wù)與PC機在RJ-45口及串口分別對接[8]。利用串口精靈接收嵌入式Web服務(wù)器的輸出并顯示,利用Sniffer Pro抓取PC機發(fā)送和接收的數(shù)據(jù)包。
圖3所示的是筆者在測試順序鏈表時系統(tǒng)輸出的信息。圖3中的第4行信息,即“Insert_Mem():firstly insert PkgNum=2”,表達的意義如下:系統(tǒng)將第2個TCP發(fā)送報文插入到重傳隊列的首部。從后續(xù)類似的信息也可以看出,每當(dāng)系統(tǒng)發(fā)送了一個非RST型的TCP報文后,都會將該報文插入到重傳隊列中,以方便后續(xù)的重傳操作;圖3中的第6行信息,即“Search_Mem(): find PkgNum=2 Pkg”,說明系統(tǒng)在收到ACK型報文后,會利用該ACK號(即“576002”)在發(fā)送隊列里查找那些ACK號小于等于的該ACK號的所有TCP報文;圖3中的第24行和第26行信息,即“Delete_Mem():the first Pkg of PkgNum=5 deleted”和“Delete_Mem():the first Pkg of PkgNum=6 deleted”,說明系統(tǒng)在接收到ACK型的TCP報文9后,利用該ACK號刪掉了重傳隊列中對應(yīng)的報文5和報文6,圖3中的第24行信息“Delete_BeforSeqMem(): total 2 pkgs are deleted”也說明了在函數(shù)Delete_BeforSeqMem()中刪除了2個TCP包;圖3中的第25行信息,即“Free_Mem(): free the PkgNum=5 success”,說明系統(tǒng)成功釋放了該TCP包所占的內(nèi)存區(qū)塊。
圖3 測試TCP順序鏈表時的輸出信息 圖4 測試TCP重傳計時器時的輸出信息
由于將系統(tǒng)直接接到PC上時,網(wǎng)絡(luò)環(huán)境比較穩(wěn)定,為了迫使TCP啟動重傳模塊,可以在服務(wù)器TCP層發(fā)送數(shù)據(jù)時人為將系統(tǒng)與PC機的網(wǎng)絡(luò)斷開一會兒后迅速連上。調(diào)試信息如圖4所示。由圖4可以看出,由于沒有及時收到客戶端的ACK而導(dǎo)致重發(fā)了報文5和報文6,并且在收到的報文9后刪掉了順序鏈表中對應(yīng)的報文5和報文6。
為測試筆者實現(xiàn)的TCP重傳模塊是否能正常工作。筆者采用如下思路進行驗證:分別在2個傳輸方向上進行驗證,首先驗證服務(wù)器是否能正常傳輸數(shù)據(jù)到客戶端。試驗過程中采用人工物理方式(如火燒)對嵌入式Web服務(wù)器系統(tǒng)中的傳感器進行升溫,并查看客戶端PC機的Web瀏覽器是否能實時刷新顯示該傳感器的溫度數(shù)據(jù),結(jié)果如圖5所示。該結(jié)果顯示服務(wù)器能正常傳輸數(shù)據(jù)到客戶端;接著驗證客戶端是否能正常上傳數(shù)據(jù)到服務(wù)器,在客戶端PC機上利用鼠標點擊LED的“亮”或者“滅”控制開關(guān),同時查看嵌入式Web服務(wù)器系統(tǒng)中的LED燈是否能同步亮/滅,結(jié)果顯示,用戶完全可以通過Web瀏覽器來控制Web服務(wù)器系統(tǒng)中的LED燈。該結(jié)果顯示客戶端能正常上傳數(shù)據(jù)到服務(wù)器。因此,通過上述TCP重傳隊列實現(xiàn)的TCP重傳機制能完成既定的嵌入式TCP服務(wù)。
圖5 客戶端動態(tài)獲取服務(wù)器系統(tǒng)中的傳感器溫度數(shù)據(jù)
[1]黃文力,馬禮, 王玉超.嵌入式Internet中TCP/IP協(xié)議棧的研究與設(shè)計[J].電腦開發(fā)與應(yīng)用,2008,21(1):46-49.
[2] 馮翠麗,劉波濤.一種嵌入式TCP/IP協(xié)議棧的設(shè)計與實現(xiàn)[J].長江大學(xué)學(xué)報(自然科學(xué)版),2008,5(4):N331-333.
[3] 李金梁,景博.嵌入式Internet中TCP協(xié)議的設(shè)計與實現(xiàn)[J].微計算機信息,2005,21(7):40-138.
[4] 陳維良,趙俊超,魏少軍.TCP/IP協(xié)議的ASIC設(shè)計與實現(xiàn)[J].微電子學(xué),2002,32(2):97-101.
[5] 王敏杰,徐昌彪,劉光明.無線網(wǎng)絡(luò)下TCP重傳定時器研究[J].計算機工程與應(yīng)用,2004(36):146-150.
[6] 章淼,熊勇強,吳建平.TCP重傳計時器的實現(xiàn)和改進[J].計算機工程與應(yīng)用,2000(12):132-146.
[7] 游海峰,何涇沙,張偉.基于TCP重傳計時器的算法分析[J].電腦知識與技術(shù),2007(1):83-89.
[8]劉波濤,馮翠麗,王青海,等.應(yīng)用RTL8019AS的嵌入式Web服務(wù)器硬件實現(xiàn)[J].長江大學(xué)學(xué)報(自然科學(xué)版),2008, 5(1):N75-78.
[編輯] 洪云飛
10.3969/j.issn.1673-1409(N).2012.06.036
TN915.04
A
1673-1409(2012)06-N108-04