許坤 趙亮
摘 ? 要:UDP協(xié)議提供面向操作的簡(jiǎn)單而非可靠的數(shù)據(jù)傳輸服務(wù)。為了同時(shí)獲得數(shù)據(jù)傳輸?shù)母咝院涂煽啃?,本文仿照TCP協(xié)議,在應(yīng)用層建立報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制,基于UDP協(xié)議設(shè)計(jì)了一種可靠的數(shù)據(jù)傳輸方法并在工程項(xiàng)目中得到了應(yīng)用。本文對(duì)兩種協(xié)議的特點(diǎn)進(jìn)行了探討,基于UDP協(xié)議設(shè)計(jì)了一種可靠的數(shù)據(jù)傳輸方法并在工程項(xiàng)目中得到了應(yīng)用。
關(guān)鍵詞:UDP ?可靠傳輸 ?報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制
中圖分類號(hào):TP3017 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A ? ? ? ? ? ? ? ? ? ? ? ?文章編號(hào):1674-098X(2019)06(b)-0007-02
1 ?概述
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的快速發(fā)展,網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性、可靠性越來(lái)越得到重視。而數(shù)據(jù)傳輸?shù)男阅芘c選擇使用的網(wǎng)絡(luò)協(xié)議密切相關(guān)。目前應(yīng)用最廣泛的計(jì)算機(jī)協(xié)議是TCP/IP協(xié)議。TCP/IP協(xié)議棧中與數(shù)據(jù)傳輸相關(guān)的協(xié)議主要包括TCP和UDP兩種。這兩種協(xié)議各有優(yōu)勢(shì),TCP協(xié)議面向連接,更加可靠;UDP協(xié)議面向操作,簡(jiǎn)單高效。在一些實(shí)際工程應(yīng)用中,期望同時(shí)獲得數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性、高效性和可靠性。
2 ?UDP協(xié)議與TCP協(xié)議的比較
2.1 TCP協(xié)議的特點(diǎn)
TCP(傳輸控制協(xié)議)提供了一種面向連接的實(shí)現(xiàn)可靠傳輸?shù)耐ㄐ欧绞?。通信雙方經(jīng)“三次握手”機(jī)制進(jìn)入連接狀態(tài)。通過(guò)設(shè)置滑動(dòng)窗口,接收方只允許發(fā)送方發(fā)送其緩沖區(qū)能夠容納的數(shù)據(jù),實(shí)現(xiàn)流量控制。發(fā)送方對(duì)用戶數(shù)據(jù)進(jìn)行分片,由接收方對(duì)分片進(jìn)行重組排序。接收方對(duì)收到的數(shù)據(jù)進(jìn)行校驗(yàn),如果數(shù)據(jù)校驗(yàn)和有差錯(cuò),則丟棄該數(shù)據(jù)。若數(shù)據(jù)校驗(yàn)無(wú)誤,則接收方向發(fā)送方發(fā)出確認(rèn)信息;而發(fā)送方在發(fā)出數(shù)據(jù)后啟動(dòng)定時(shí)器,若超時(shí)未收到確認(rèn)信息則向接收方重新發(fā)出數(shù)據(jù)。
2.2 UDP協(xié)議的特點(diǎn)
UDP(用戶數(shù)據(jù)報(bào)協(xié)議)提供了一種面向操作的簡(jiǎn)單而非可靠的數(shù)據(jù)傳輸服務(wù)。數(shù)據(jù)發(fā)送時(shí)沒(méi)有建立明確的連接,不提供可靠性,也不提供報(bào)文確認(rèn)、分片與重組排序以及流量控制等功能。UDP只負(fù)責(zé)把應(yīng)用層傳來(lái)的數(shù)據(jù)包發(fā)送出去,但不保證數(shù)據(jù)能達(dá)到目的地。因此存在數(shù)據(jù)包丟失、重復(fù)和亂序的可能性。接收端進(jìn)行數(shù)據(jù)校驗(yàn),并丟棄校驗(yàn)和有差錯(cuò)的數(shù)據(jù),這與TCP是相同的。
2.3 UDP與TCP協(xié)議的比較
簡(jiǎn)而言之,UDP與TCP協(xié)議的差異,見表1。
表1可見,在數(shù)據(jù)傳輸?shù)目煽啃陨?,TCP具有顯而易見的優(yōu)勢(shì)。由于建立了明確的連接,加上有確認(rèn)與超時(shí)重發(fā)、流量控制等功能,端與端之間進(jìn)行數(shù)據(jù)傳輸穩(wěn)定可靠。這樣的通信方式比較適合于網(wǎng)絡(luò)環(huán)境復(fù)雜的廣域網(wǎng),數(shù)據(jù)傳輸可能跨越多個(gè)不可預(yù)知的網(wǎng)段的場(chǎng)合。然而,如果我們的應(yīng)用是在網(wǎng)絡(luò)環(huán)境簡(jiǎn)單明確、各網(wǎng)段因素可預(yù)知的局域網(wǎng),或者當(dāng)我們更加強(qiáng)調(diào)數(shù)據(jù)的快速傳輸而不是數(shù)據(jù)的完整性時(shí),UDP是更合適的通信協(xié)議。它的優(yōu)勢(shì)體現(xiàn)在以下幾點(diǎn)。
(1)充分利用局域網(wǎng)本身的可靠性,無(wú)需連接,節(jié)省系統(tǒng)開銷;
(2)不存在分片與重組管理,節(jié)省系統(tǒng)開銷;
(3)無(wú)需對(duì)數(shù)據(jù)分片進(jìn)行確認(rèn),提高了網(wǎng)絡(luò)使用效率;
(4)支持組播和廣播,提高了數(shù)據(jù)傳輸效率。
對(duì)局域網(wǎng)而言,在實(shí)際工程應(yīng)用中,我們可以借鑒TCP的一些特點(diǎn),在UDP的應(yīng)用層進(jìn)行改進(jìn),從而在實(shí)現(xiàn)數(shù)據(jù)高效傳輸?shù)耐瑫r(shí),提高數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
3 ?UDP協(xié)議下數(shù)據(jù)可靠傳輸?shù)乃悸?/p>
對(duì)于網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)比較簡(jiǎn)單的局域網(wǎng)來(lái)說(shuō),各段網(wǎng)路的性能參數(shù)是可知的,通信質(zhì)量可預(yù)測(cè),可靠性比較好,因此在進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸時(shí)建立連接的步驟可以省略。當(dāng)網(wǎng)絡(luò)環(huán)境處于較差狀態(tài)下,可能會(huì)存在小概率的丟包問(wèn)題。解決這一問(wèn)題的方法,是仿照TCP協(xié)議,在應(yīng)用層建立報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制。
所謂報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制,就是當(dāng)接收方收到來(lái)自發(fā)送方的數(shù)據(jù)報(bào)文后,立即反饋一條確認(rèn)報(bào)文給發(fā)送方;發(fā)送方發(fā)出數(shù)據(jù)報(bào)文后,開啟計(jì)時(shí)器;當(dāng)計(jì)時(shí)達(dá)到某一時(shí)長(zhǎng)仍未收到對(duì)應(yīng)的確認(rèn)報(bào)文,則重新發(fā)出數(shù)據(jù)報(bào)文。采取多次重發(fā)的方法,可以解決偶發(fā)性的丟包問(wèn)題。
4 ?UDP協(xié)議下數(shù)據(jù)可靠傳輸?shù)膶?shí)現(xiàn)
4.1 報(bào)文結(jié)構(gòu)設(shè)置
把UDP數(shù)據(jù)報(bào)分為兩種:數(shù)據(jù)報(bào)文與確認(rèn)報(bào)文。數(shù)據(jù)報(bào)文負(fù)責(zé)傳遞業(yè)務(wù)信息,確認(rèn)報(bào)文負(fù)責(zé)對(duì)收到的數(shù)據(jù)報(bào)文進(jìn)行應(yīng)答。數(shù)據(jù)報(bào)文結(jié)構(gòu)定義見表2。(字段1-3為報(bào)文頭)
確認(rèn)報(bào)文只包含上表中所示的報(bào)文頭,不包含數(shù)據(jù)字段。
對(duì)于發(fā)出的報(bào)文,序列號(hào)從1開始,依次遞增(對(duì)于超時(shí)重發(fā)的報(bào)文則保持原序列號(hào)),到255再循環(huán)回到1。當(dāng)發(fā)出數(shù)據(jù)報(bào)文時(shí),報(bào)文中的確認(rèn)號(hào)設(shè)置為0;當(dāng)發(fā)出確認(rèn)報(bào)文時(shí),確認(rèn)號(hào)設(shè)置為接收到的數(shù)據(jù)報(bào)文的序列號(hào)。
4.2 報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制的實(shí)現(xiàn)
首先建立兩個(gè)環(huán)形數(shù)據(jù)緩沖區(qū):報(bào)文緩沖區(qū)、超時(shí)緩沖區(qū),同時(shí)啟動(dòng)一個(gè)定時(shí)器。報(bào)文緩沖區(qū)存放待確認(rèn)報(bào)文,超時(shí)緩沖區(qū)存放超時(shí)表。定時(shí)器周期性發(fā)出消息用于報(bào)文超時(shí)重發(fā)的倒計(jì)時(shí)。超時(shí)表是記錄數(shù)據(jù)報(bào)文的重發(fā)次數(shù)和超時(shí)值的數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)定義見表3。應(yīng)用程序?qū)Πl(fā)出的每條數(shù)據(jù)報(bào)文維護(hù)一個(gè)超時(shí)表,當(dāng)發(fā)出的數(shù)據(jù)報(bào)文得到接收方的確認(rèn)反饋,則把超時(shí)表從超時(shí)緩沖區(qū)中移除。
報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制的相關(guān)流程如下。
(1)發(fā)出數(shù)據(jù)報(bào)文,同時(shí)把該數(shù)據(jù)報(bào)文投入報(bào)文緩沖區(qū),把該報(bào)文對(duì)應(yīng)的超時(shí)表投入超時(shí)緩沖區(qū)。超時(shí)表中重發(fā)次數(shù)設(shè)置為初始值0,超時(shí)值根據(jù)需要而定,比如100ms。
(2)收到一條報(bào)文時(shí),先判斷確認(rèn)號(hào)(假設(shè)為ACK)。若ACK為0,表示收到的是數(shù)據(jù)報(bào)文,根據(jù)數(shù)據(jù)報(bào)文的序列號(hào)sn,立即反饋一條確認(rèn)報(bào)文,其確認(rèn)號(hào)設(shè)置為等于sn。若ACK非0,表示收到的是確認(rèn)報(bào)文,下一步操作是在報(bào)文緩沖區(qū)中搜索序列號(hào)等于ACK的待確認(rèn)報(bào)文,并從緩沖區(qū)中移除該報(bào)文,同時(shí)在超時(shí)緩沖區(qū)中搜索序列號(hào)等于ACK的超時(shí)表,并從緩沖區(qū)中移除該超時(shí)表。
(3)周期性發(fā)出消息,而應(yīng)用程序響應(yīng)這個(gè)消息,對(duì)超時(shí)緩沖區(qū)中每個(gè)超時(shí)表的超時(shí)值進(jìn)行倒計(jì)時(shí)更新,一旦某個(gè)超時(shí)表的超時(shí)值歸0,則應(yīng)用程序?qū)⑴袛嗥渲匕l(fā)次數(shù)N:若N=0或1,則N自加1,而超時(shí)值更新為100ms(根據(jù)需要而定),并從報(bào)文緩沖區(qū)中提取與超時(shí)表序列號(hào)對(duì)應(yīng)的數(shù)據(jù)報(bào)文重新發(fā)出;若N=2,則把報(bào)文緩沖區(qū)中與該超時(shí)表序列號(hào)對(duì)應(yīng)的數(shù)據(jù)報(bào)文移除,把該超時(shí)表從超時(shí)緩沖區(qū)中移除。
按照上述方法設(shè)計(jì)的程序,應(yīng)用于某工程項(xiàng)目中,在局域網(wǎng)環(huán)境比較惡劣、報(bào)文擁塞的情況下,測(cè)試了數(shù)據(jù)報(bào)文的丟包率,結(jié)果丟包率為0,達(dá)到了預(yù)期目的。
5 ?結(jié)語(yǔ)
引進(jìn)報(bào)文確認(rèn)與超時(shí)重發(fā)機(jī)制,有效改善了UDP協(xié)議下數(shù)據(jù)傳輸?shù)目煽啃裕谔囟ň钟蚓W(wǎng)環(huán)境中,同時(shí)獲得了實(shí)時(shí)高效與可靠傳輸?shù)奶匦?。在?shí)際工程應(yīng)用中,報(bào)文重發(fā)次數(shù)、重發(fā)超時(shí)時(shí)間、定時(shí)器消息周期等參數(shù),可根據(jù)需要進(jìn)行設(shè)定。
參考文獻(xiàn)
[1] 趙飛,葉震.UDP協(xié)議與TCP協(xié)議的對(duì)比分析與可靠性改進(jìn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(9):219-221.
[2] 朱華剛,周祥龍,吳永剛.簡(jiǎn)單可靠實(shí)時(shí)傳送UDP協(xié)議的研究和應(yīng)用[J].水雷戰(zhàn)與艦船防護(hù),2010,18(3):50-53.
[3] 陳佳.基于UDP的數(shù)據(jù)傳輸可靠性保障機(jī)制研究及應(yīng)用[D].西安理工大學(xué),2017.
[4] W.Richard Stevens. TCP/IP詳解 卷1:協(xié)議[M].范建華,胥光輝,張濤,等譯.北京:機(jī)械工業(yè)出版社, 2008.
[5] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社,2008.