国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

物聯(lián)網(wǎng)應(yīng)用中TCP重傳隊(duì)列的設(shè)計(jì)與實(shí)現(xiàn)

2012-11-21 09:51陳憲超張興海鄭達(dá)標(biāo)石海濤趙先進(jìn)
關(guān)鍵詞:重傳鏈表結(jié)點(diǎn)

陳憲超 王 輝,張興海,鄭達(dá)標(biāo),石海濤 趙先進(jìn)

(徐工集團(tuán)徐州建機(jī)工程機(jī)械有限公司,江蘇 徐州 221001) (徐州赫思曼電子有限公司,江蘇 徐州 221001) (徐州長航科技有限公司,江蘇 徐州 221001)

物聯(lián)網(wǎng)應(yīng)用中TCP重傳隊(duì)列的設(shè)計(jì)與實(shí)現(xiàn)

陳憲超 王 輝,張興海,鄭達(dá)標(biāo),石海濤 趙先進(jìn)

(徐工集團(tuán)徐州建機(jī)工程機(jī)械有限公司,江蘇 徐州 221001) (徐州赫思曼電子有限公司,江蘇 徐州 221001) (徐州長航科技有限公司,江蘇 徐州 221001)

物聯(lián)網(wǎng)應(yīng)用的關(guān)鍵技術(shù)之一就是要實(shí)現(xiàn)嵌入式設(shè)備的網(wǎng)絡(luò)化,其中一種思路就是在嵌入式設(shè)備中集成簡化后的TCP/IP協(xié)議棧。然而在精簡TCP/IP協(xié)議棧中的TCP協(xié)議時(shí)會(huì)面臨一個(gè)技術(shù)難題:如何根據(jù)實(shí)際應(yīng)用設(shè)計(jì)合適的重傳隊(duì)列。以嵌入式Web服務(wù)為例,緊緊圍繞嵌入式Web服務(wù)器應(yīng)用的具體要求,詳細(xì)分析了如何設(shè)計(jì)并實(shí)現(xiàn)TCP重傳隊(duì)列。測試結(jié)果表明,該設(shè)計(jì)思路可行。

物聯(lián)網(wǎng);TCP/IP;嵌入式Web服務(wù)器;嵌入式TCP;TCP重傳隊(duì)列

如何將嵌入式設(shè)備接入網(wǎng)絡(luò),進(jìn)而實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用,是當(dāng)前一個(gè)研究熱點(diǎn)[1]。其中,比較常見的一種實(shí)現(xiàn)方案是在嵌入式設(shè)備中實(shí)現(xiàn)精簡的TCP/IP協(xié)議棧后再將該設(shè)備接入Internet[2-3]。在此過程中,如果需要實(shí)現(xiàn)基于TCP協(xié)議的高層應(yīng)用,就必須要根據(jù)嵌入式設(shè)備的具體功能來簡化實(shí)現(xiàn)TCP協(xié)議,而設(shè)計(jì)實(shí)現(xiàn)TCP協(xié)議就必須要實(shí)現(xiàn)TCP重傳隊(duì)列。因此,如何有針對性地實(shí)現(xiàn)TCP重傳隊(duì)列就是一個(gè)技術(shù)難點(diǎn)。

1 標(biāo)準(zhǔn)TCP重傳隊(duì)列的功能及作用

TCP(Transmission Control Protocol,傳輸控制協(xié)議)是TCP/IP協(xié)議簇的核心協(xié)議, 也是TCP/IP協(xié)議簇中最復(fù)雜的協(xié)議。它是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議[4]。TCP之所以是一種可靠的協(xié)議,就在于它有一種完善的重傳機(jī)制。在一般標(biāo)準(zhǔn)的TCP協(xié)議實(shí)現(xiàn)中,重傳機(jī)制的關(guān)鍵問題是要計(jì)算RTO(Retransmission Time Out),花費(fèi)的代價(jià)較大[4-7]。一旦得到RTO之后,剩下的操作就是當(dāng)某個(gè)重傳計(jì)時(shí)器超時(shí)后重發(fā)對應(yīng)的TCP包,有多種方式可以完成該重發(fā)操作。在很多的TCP重傳實(shí)現(xiàn)中,都需要借助一個(gè)重傳隊(duì)列來記錄已經(jīng)發(fā)送的TCP報(bào)文,并在超時(shí)后進(jìn)行重傳操作。

2 嵌入式TCP重傳隊(duì)列的設(shè)計(jì)與實(shí)現(xiàn)

2.1設(shè)計(jì)思路

圖1 順序鏈表結(jié)構(gòu)示意圖

筆者的設(shè)計(jì)思路是利用順序鏈表記錄每個(gè)已發(fā)送的TCP數(shù)據(jù)包,而當(dāng)收到TCP確認(rèn)報(bào)文時(shí)就從該順序鏈表中刪除相應(yīng)的TCP數(shù)據(jù)包。同時(shí),每隔一定的時(shí)間就觸發(fā)一個(gè)TCP重傳事件,以發(fā)送那些隊(duì)列中已經(jīng)超時(shí)所有TCP數(shù)據(jù)包。順序鏈表的結(jié)構(gòu)如圖1所示。由圖1可知,每個(gè)連接g_Conn[i]都單獨(dú)維護(hù)一個(gè)TCP重傳隊(duì)列,該隊(duì)列的長度用字段MemPkgNum記錄,隊(duì)首部地址由字段MemPoolHeader記錄。該重傳隊(duì)列采用一個(gè)如圖1所示的雙層順序鏈表來存儲(chǔ):第1層為一個(gè)_MEM_CELL型的結(jié)構(gòu)體,用于存儲(chǔ)可能需要重傳(即已發(fā)送但沒有確認(rèn))數(shù)據(jù)包的相關(guān)信息,以便維護(hù)該連接所有可能需要重傳的TCP報(bào)文。字段Next的作用是將該連接中所有可能需要重傳的TCP報(bào)文都連接在一個(gè)順序鏈表上,字段RetryTimer是該包的定時(shí)器,字段RetryNum記錄的該包重傳的次數(shù)。字段ExpectAck是該結(jié)點(diǎn)中的關(guān)鍵字,在收到對方的確認(rèn)后會(huì)通過該字段值來刪除重傳隊(duì)列中相對于的包。BuffPtr和TotalPkgLen字段定義了該數(shù)據(jù)包實(shí)體的首地址和總長度。這種設(shè)計(jì)結(jié)構(gòu)有如下方便:能在TCP發(fā)送模塊在調(diào)用地層發(fā)送驅(qū)動(dòng)發(fā)送數(shù)據(jù)包后直接將該包掛到此重傳隊(duì)列后面,也便于在ARP解析失敗后直接進(jìn)行ARP重傳操作的處理。

2.2具體實(shí)現(xiàn)

設(shè)計(jì)完該數(shù)據(jù)結(jié)構(gòu)后,剩下的工作就是要設(shè)計(jì)對應(yīng)鏈表的相關(guān)維護(hù)操作,如構(gòu)造操作、插入操作、查找操作和刪除操作等。

1)鏈表結(jié)點(diǎn)的構(gòu)造操作 構(gòu)造鏈表結(jié)點(diǎn)的操作由Get_Mem()函數(shù)負(fù)責(zé),在TCP發(fā)送模塊中調(diào)用。每當(dāng)系統(tǒng)需要發(fā)送TCP報(bào)文時(shí),就會(huì)調(diào)用Get_Mem()以動(dòng)態(tài)分配2個(gè)區(qū)塊:其中一個(gè)區(qū)塊用于構(gòu)造_MEM_CELL型數(shù)據(jù)結(jié)構(gòu),以順利完成順序鏈表的相關(guān)操作;另外一個(gè)區(qū)塊用于構(gòu)造一個(gè)緩存,以裝載要發(fā)送的TCP報(bào)文。該函數(shù)的實(shí)現(xiàn)流程如圖2所示。

圖2 Get_Mem()函數(shù)和Insert_Mem()函數(shù)的流程圖

2)鏈表結(jié)點(diǎn)的插入操作 當(dāng)Get_Mem()函數(shù)被成功調(diào)用后,系統(tǒng)就會(huì)調(diào)用Insert_Mem()函數(shù)將TCP報(bào)文插入到對應(yīng)連接的順序鏈表中。該函數(shù)的定義形式如下:void Insert_Mem(p_Conn,p_MemPtr,p_Ack)。該函數(shù)各參數(shù)的意義分別如下:p_Conn指明某個(gè)連接號、p_MemPtr指示了該結(jié)點(diǎn)對應(yīng)的首地址指針,p_Ack說明了該TCP報(bào)文的期望號,它的實(shí)現(xiàn)流程如圖2所示。

3)鏈表結(jié)點(diǎn)的查找操作 Search_Mem()函數(shù)用來查找某個(gè)TCP報(bào)文,該報(bào)文由指定的ACK號確定。

4)鏈表結(jié)點(diǎn)的刪除操作 TCP模塊在接收ACK型的TCP數(shù)據(jù)包后,會(huì)對該數(shù)據(jù)包進(jìn)行合法性檢查,如果認(rèn)為該數(shù)據(jù)包是合法的,則會(huì)根據(jù)收到的ACK號調(diào)用Delete_BeforSeqMem()函數(shù)以刪除那些已經(jīng)成功發(fā)送的TCP報(bào)文??紤]到客戶端有可能會(huì)對服務(wù)器發(fā)出的TCP數(shù)據(jù)包進(jìn)行批量確認(rèn),因此凡是ACK字段小于或等于收到的ACK號的那些TCP數(shù)據(jù)包都應(yīng)該被刪除掉。Delete_BeforSeqMem()函數(shù)的作用是刪除對應(yīng)的結(jié)點(diǎn),并釋放該結(jié)點(diǎn)的內(nèi)存區(qū)塊,需要注意的是應(yīng)先釋放其BuffPtr所指的內(nèi)存區(qū)塊,再釋放_(tái)MEM_CELL型結(jié)點(diǎn)所占的內(nèi)存區(qū)塊。

3 嵌入式TCP測試結(jié)果

筆者采用的測試方法是將嵌入式Web服務(wù)與PC機(jī)在RJ-45口及串口分別對接[8]。利用串口精靈接收嵌入式Web服務(wù)器的輸出并顯示,利用Sniffer Pro抓取PC機(jī)發(fā)送和接收的數(shù)據(jù)包。

圖3所示的是筆者在測試順序鏈表時(shí)系統(tǒng)輸出的信息。圖3中的第4行信息,即“Insert_Mem():firstly insert PkgNum=2”,表達(dá)的意義如下:系統(tǒng)將第2個(gè)TCP發(fā)送報(bào)文插入到重傳隊(duì)列的首部。從后續(xù)類似的信息也可以看出,每當(dāng)系統(tǒng)發(fā)送了一個(gè)非RST型的TCP報(bào)文后,都會(huì)將該報(bào)文插入到重傳隊(duì)列中,以方便后續(xù)的重傳操作;圖3中的第6行信息,即“Search_Mem(): find PkgNum=2 Pkg”,說明系統(tǒng)在收到ACK型報(bào)文后,會(huì)利用該ACK號(即“576002”)在發(fā)送隊(duì)列里查找那些ACK號小于等于的該ACK號的所有TCP報(bào)文;圖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報(bào)文9后,利用該ACK號刪掉了重傳隊(duì)列中對應(yīng)的報(bào)文5和報(bào)文6,圖3中的第24行信息“Delete_BeforSeqMem(): total 2 pkgs are deleted”也說明了在函數(shù)Delete_BeforSeqMem()中刪除了2個(gè)TCP包;圖3中的第25行信息,即“Free_Mem(): free the PkgNum=5 success”,說明系統(tǒng)成功釋放了該TCP包所占的內(nèi)存區(qū)塊。

圖3 測試TCP順序鏈表時(shí)的輸出信息 圖4 測試TCP重傳計(jì)時(shí)器時(shí)的輸出信息

由于將系統(tǒng)直接接到PC上時(shí),網(wǎng)絡(luò)環(huán)境比較穩(wěn)定,為了迫使TCP啟動(dòng)重傳模塊,可以在服務(wù)器TCP層發(fā)送數(shù)據(jù)時(shí)人為將系統(tǒng)與PC機(jī)的網(wǎng)絡(luò)斷開一會(huì)兒后迅速連上。調(diào)試信息如圖4所示。由圖4可以看出,由于沒有及時(shí)收到客戶端的ACK而導(dǎo)致重發(fā)了報(bào)文5和報(bào)文6,并且在收到的報(bào)文9后刪掉了順序鏈表中對應(yīng)的報(bào)文5和報(bào)文6。

為測試筆者實(shí)現(xiàn)的TCP重傳模塊是否能正常工作。筆者采用如下思路進(jìn)行驗(yàn)證:分別在2個(gè)傳輸方向上進(jìn)行驗(yàn)證,首先驗(yàn)證服務(wù)器是否能正常傳輸數(shù)據(jù)到客戶端。試驗(yàn)過程中采用人工物理方式(如火燒)對嵌入式Web服務(wù)器系統(tǒng)中的傳感器進(jìn)行升溫,并查看客戶端PC機(jī)的Web瀏覽器是否能實(shí)時(shí)刷新顯示該傳感器的溫度數(shù)據(jù),結(jié)果如圖5所示。該結(jié)果顯示服務(wù)器能正常傳輸數(shù)據(jù)到客戶端;接著驗(yàn)證客戶端是否能正常上傳數(shù)據(jù)到服務(wù)器,在客戶端PC機(jī)上利用鼠標(biāo)點(diǎn)擊LED的“亮”或者“滅”控制開關(guān),同時(shí)查看嵌入式Web服務(wù)器系統(tǒng)中的LED燈是否能同步亮/滅,結(jié)果顯示,用戶完全可以通過Web瀏覽器來控制Web服務(wù)器系統(tǒng)中的LED燈。該結(jié)果顯示客戶端能正常上傳數(shù)據(jù)到服務(wù)器。因此,通過上述TCP重傳隊(duì)列實(shí)現(xiàn)的TCP重傳機(jī)制能完成既定的嵌入式TCP服務(wù)。

圖5 客戶端動(dòng)態(tài)獲取服務(wù)器系統(tǒng)中的傳感器溫度數(shù)據(jù)

[1]黃文力,馬禮, 王玉超.嵌入式Internet中TCP/IP協(xié)議棧的研究與設(shè)計(jì)[J].電腦開發(fā)與應(yīng)用,2008,21(1):46-49.

[2] 馮翠麗,劉波濤.一種嵌入式TCP/IP協(xié)議棧的設(shè)計(jì)與實(shí)現(xiàn)[J].長江大學(xué)學(xué)報(bào)(自然科學(xué)版),2008,5(4):N331-333.

[3] 李金梁,景博.嵌入式Internet中TCP協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2005,21(7):40-138.

[4] 陳維良,趙俊超,魏少軍.TCP/IP協(xié)議的ASIC設(shè)計(jì)與實(shí)現(xiàn)[J].微電子學(xué),2002,32(2):97-101.

[5] 王敏杰,徐昌彪,劉光明.無線網(wǎng)絡(luò)下TCP重傳定時(shí)器研究[J].計(jì)算機(jī)工程與應(yīng)用,2004(36):146-150.

[6] 章淼,熊勇強(qiáng),吳建平.TCP重傳計(jì)時(shí)器的實(shí)現(xiàn)和改進(jìn)[J].計(jì)算機(jī)工程與應(yīng)用,2000(12):132-146.

[7] 游海峰,何涇沙,張偉.基于TCP重傳計(jì)時(shí)器的算法分析[J].電腦知識與技術(shù),2007(1):83-89.

[8]劉波濤,馮翠麗,王青海,等.應(yīng)用RTL8019AS的嵌入式Web服務(wù)器硬件實(shí)現(xiàn)[J].長江大學(xué)學(xué)報(bào)(自然科學(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

猜你喜歡
重傳鏈表結(jié)點(diǎn)
基于八數(shù)碼問題的搜索算法的研究
基于二進(jìn)制鏈表的粗糙集屬性約簡
跟麥咭學(xué)編程
面向異構(gòu)網(wǎng)絡(luò)的多路徑數(shù)據(jù)重傳研究?
基于鏈表多分支路徑樹的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
數(shù)據(jù)鏈路層的選擇重傳協(xié)議的優(yōu)化改進(jìn)
鏈表方式集中器抄表的設(shè)計(jì)
基于Raspberry PI為結(jié)點(diǎn)的天氣云測量網(wǎng)絡(luò)實(shí)現(xiàn)
MPTCP中一種減緩緩存阻塞的重傳策略
選擇性重傳法在IPTV中的應(yīng)用
丰都县| 达拉特旗| 霍城县| 霍州市| 黎城县| 乌什县| 合作市| 泽库县| 龙南县| 融水| 临沭县| 乌什县| 河曲县| 澄江县| 缙云县| 广州市| 青川县| 洛扎县| 阿坝| 拜城县| 台中县| 综艺| 禄劝| 和硕县| 越西县| 荥经县| 长葛市| 阜新市| 秦安县| 永定县| 翼城县| 蒙自县| 蒙山县| 虎林市| 扎囊县| 金溪县| 兴文县| 彰化市| 固原市| 新源县| 织金县|