陳憲超 王 輝,張興海,鄭達標,石海濤 趙先進
(徐工集團徐州建機工程機械有限公司,江蘇 徐州 221001) (徐州赫思曼電子有限公司,江蘇 徐州 221001) (徐州長航科技有限公司,江蘇 徐州 221001)
物聯網應用中TCP重傳隊列的設計與實現
陳憲超 王 輝,張興海,鄭達標,石海濤 趙先進
(徐工集團徐州建機工程機械有限公司,江蘇 徐州 221001) (徐州赫思曼電子有限公司,江蘇 徐州 221001) (徐州長航科技有限公司,江蘇 徐州 221001)
物聯網應用的關鍵技術之一就是要實現嵌入式設備的網絡化,其中一種思路就是在嵌入式設備中集成簡化后的TCP/IP協議棧。然而在精簡TCP/IP協議棧中的TCP協議時會面臨一個技術難題:如何根據實際應用設計合適的重傳隊列。以嵌入式Web服務為例,緊緊圍繞嵌入式Web服務器應用的具體要求,詳細分析了如何設計并實現TCP重傳隊列。測試結果表明,該設計思路可行。
物聯網;TCP/IP;嵌入式Web服務器;嵌入式TCP;TCP重傳隊列
如何將嵌入式設備接入網絡,進而實現物聯網應用,是當前一個研究熱點[1]。其中,比較常見的一種實現方案是在嵌入式設備中實現精簡的TCP/IP協議棧后再將該設備接入Internet[2-3]。在此過程中,如果需要實現基于TCP協議的高層應用,就必須要根據嵌入式設備的具體功能來簡化實現TCP協議,而設計實現TCP協議就必須要實現TCP重傳隊列。因此,如何有針對性地實現TCP重傳隊列就是一個技術難點。
TCP(Transmission Control Protocol,傳輸控制協議)是TCP/IP協議簇的核心協議, 也是TCP/IP協議簇中最復雜的協議。它是一種面向連接的、可靠的、基于字節流的運輸層通信協議[4]。TCP之所以是一種可靠的協議,就在于它有一種完善的重傳機制。在一般標準的TCP協議實現中,重傳機制的關鍵問題是要計算RTO(Retransmission Time Out),花費的代價較大[4-7]。一旦得到RTO之后,剩下的操作就是當某個重傳計時器超時后重發對應的TCP包,有多種方式可以完成該重發操作。在很多的TCP重傳實現中,都需要借助一個重傳隊列來記錄已經發送的TCP報文,并在超時后進行重傳操作。
2.1設計思路

圖1 順序鏈表結構示意圖
筆者的設計思路是利用順序鏈表記錄每個已發送的TCP數據包,而當收到TCP確認報文時就從該順序鏈表中刪除相應的TCP數據包。同時,每隔一定的時間就觸發一個TCP重傳事件,以發送那些隊列中已經超時所有TCP數據包。順序鏈表的結構如圖1所示。由圖1可知,每個連接g_Conn[i]都單獨維護一個TCP重傳隊列,該隊列的長度用字段MemPkgNum記錄,隊首部地址由字段MemPoolHeader記錄。該重傳隊列采用一個如圖1所示的雙層順序鏈表來存儲:第1層為一個_MEM_CELL型的結構體,用于存儲可能需要重傳(即已發送但沒有確認)數據包的相關信息,以便維護該連接所有可能需要重傳的TCP報文。字段Next的作用是將該連接中所有可能需要重傳的TCP報文都連接在一個順序鏈表上,字段RetryTimer是該包的定時器,字段RetryNum記錄的該包重傳的次數。字段ExpectAck是該結點中的關鍵字,在收到對方的確認后會通過該字段值來刪除重傳隊列中相對于的包。BuffPtr和TotalPkgLen字段定義了該數據包實體的首地址和總長度。這種設計結構有如下方便:能在TCP發送模塊在調用地層發送驅動發送數據包后直接將該包掛到此重傳隊列后面,也便于在ARP解析失敗后直接進行ARP重傳操作的處理。
2.2具體實現
設計完該數據結構后,剩下的工作就是要設計對應鏈表的相關維護操作,如構造操作、插入操作、查找操作和刪除操作等。
1)鏈表結點的構造操作 構造鏈表結點的操作由Get_Mem()函數負責,在TCP發送模塊中調用。每當系統需要發送TCP報文時,就會調用Get_Mem()以動態分配2個區塊:其中一個區塊用于構造_MEM_CELL型數據結構,以順利完成順序鏈表的相關操作;另外一個區塊用于構造一個緩存,以裝載要發送的TCP報文。該函數的實現流程如圖2所示。

圖2 Get_Mem()函數和Insert_Mem()函數的流程圖
2)鏈表結點的插入操作 當Get_Mem()函數被成功調用后,系統就會調用Insert_Mem()函數將TCP報文插入到對應連接的順序鏈表中。該函數的定義形式如下:void Insert_Mem(p_Conn,p_MemPtr,p_Ack)。該函數各參數的意義分別如下:p_Conn指明某個連接號、p_MemPtr指示了該結點對應的首地址指針,p_Ack說明了該TCP報文的期望號,它的實現流程如圖2所示。
3)鏈表結點的查找操作 Search_Mem()函數用來查找某個TCP報文,該報文由指定的ACK號確定。
4)鏈表結點的刪除操作 TCP模塊在接收ACK型的TCP數據包后,會對該數據包進行合法性檢查,如果認為該數據包是合法的,則會根據收到的ACK號調用Delete_BeforSeqMem()函數以刪除那些已經成功發送的TCP報文。考慮到客戶端有可能會對服務器發出的TCP數據包進行批量確認,因此凡是ACK字段小于或等于收到的ACK號的那些TCP數據包都應該被刪除掉。Delete_BeforSeqMem()函數的作用是刪除對應的結點,并釋放該結點的內存區塊,需要注意的是應先釋放其BuffPtr所指的內存區塊,再釋放_MEM_CELL型結點所占的內存區塊。
筆者采用的測試方法是將嵌入式Web服務與PC機在RJ-45口及串口分別對接[8]。利用串口精靈接收嵌入式Web服務器的輸出并顯示,利用Sniffer Pro抓取PC機發送和接收的數據包。
圖3所示的是筆者在測試順序鏈表時系統輸出的信息。圖3中的第4行信息,即“Insert_Mem():firstly insert PkgNum=2”,表達的意義如下:系統將第2個TCP發送報文插入到重傳隊列的首部。從后續類似的信息也可以看出,每當系統發送了一個非RST型的TCP報文后,都會將該報文插入到重傳隊列中,以方便后續的重傳操作;圖3中的第6行信息,即“Search_Mem(): find PkgNum=2 Pkg”,說明系統在收到ACK型報文后,會利用該ACK號(即“576002”)在發送隊列里查找那些ACK號小于等于的該ACK號的所有TCP報文;圖3中的第24行和第26行信息,即“Delete_Mem():the first Pkg of PkgNum=5 deleted”和“Delete_Mem():the first Pkg of PkgNum=6 deleted”,說明系統在接收到ACK型的TCP報文9后,利用該ACK號刪掉了重傳隊列中對應的報文5和報文6,圖3中的第24行信息“Delete_BeforSeqMem(): total 2 pkgs are deleted”也說明了在函數Delete_BeforSeqMem()中刪除了2個TCP包;圖3中的第25行信息,即“Free_Mem(): free the PkgNum=5 success”,說明系統成功釋放了該TCP包所占的內存區塊。

圖3 測試TCP順序鏈表時的輸出信息 圖4 測試TCP重傳計時器時的輸出信息
由于將系統直接接到PC上時,網絡環境比較穩定,為了迫使TCP啟動重傳模塊,可以在服務器TCP層發送數據時人為將系統與PC機的網絡斷開一會兒后迅速連上。調試信息如圖4所示。由圖4可以看出,由于沒有及時收到客戶端的ACK而導致重發了報文5和報文6,并且在收到的報文9后刪掉了順序鏈表中對應的報文5和報文6。
為測試筆者實現的TCP重傳模塊是否能正常工作。筆者采用如下思路進行驗證:分別在2個傳輸方向上進行驗證,首先驗證服務器是否能正常傳輸數據到客戶端。試驗過程中采用人工物理方式(如火燒)對嵌入式Web服務器系統中的傳感器進行升溫,并查看客戶端PC機的Web瀏覽器是否能實時刷新顯示該傳感器的溫度數據,結果如圖5所示。該結果顯示服務器能正常傳輸數據到客戶端;接著驗證客戶端是否能正常上傳數據到服務器,在客戶端PC機上利用鼠標點擊LED的“亮”或者“滅”控制開關,同時查看嵌入式Web服務器系統中的LED燈是否能同步亮/滅,結果顯示,用戶完全可以通過Web瀏覽器來控制Web服務器系統中的LED燈。該結果顯示客戶端能正常上傳數據到服務器。因此,通過上述TCP重傳隊列實現的TCP重傳機制能完成既定的嵌入式TCP服務。

圖5 客戶端動態獲取服務器系統中的傳感器溫度數據
[1]黃文力,馬禮, 王玉超.嵌入式Internet中TCP/IP協議棧的研究與設計[J].電腦開發與應用,2008,21(1):46-49.
[2] 馮翠麗,劉波濤.一種嵌入式TCP/IP協議棧的設計與實現[J].長江大學學報(自然科學版),2008,5(4):N331-333.
[3] 李金梁,景博.嵌入式Internet中TCP協議的設計與實現[J].微計算機信息,2005,21(7):40-138.
[4] 陳維良,趙俊超,魏少軍.TCP/IP協議的ASIC設計與實現[J].微電子學,2002,32(2):97-101.
[5] 王敏杰,徐昌彪,劉光明.無線網絡下TCP重傳定時器研究[J].計算機工程與應用,2004(36):146-150.
[6] 章淼,熊勇強,吳建平.TCP重傳計時器的實現和改進[J].計算機工程與應用,2000(12):132-146.
[7] 游海峰,何涇沙,張偉.基于TCP重傳計時器的算法分析[J].電腦知識與技術,2007(1):83-89.
[8]劉波濤,馮翠麗,王青海,等.應用RTL8019AS的嵌入式Web服務器硬件實現[J].長江大學學報(自然科學版),2008, 5(1):N75-78.
[編輯] 洪云飛
10.3969/j.issn.1673-1409(N).2012.06.036
TN915.04
A
1673-1409(2012)06-N108-04