任雁
(長治學(xué)院計算機(jī)系,山西長治046011)
基于窗口滑動協(xié)議的UDP傳輸研究
任雁
(長治學(xué)院計算機(jī)系,山西長治046011)
文章解釋了滑動窗口傳輸協(xié)議的概念,并與傳統(tǒng)的UDP傳輸方式進(jìn)行了比較,針對其在傳輸網(wǎng)絡(luò)中的應(yīng)用進(jìn)行了探討。并模仿了窗口滑動協(xié)議傳輸方式,完整、高效的對數(shù)據(jù)進(jìn)行了實(shí)時傳輸,確保了數(shù)據(jù)文件在網(wǎng)絡(luò)傳輸應(yīng)用中的可靠性和高效性,為P2P網(wǎng)絡(luò)傳輸提供了參考。
UDP,窗口滑動協(xié)議,C++
窗口滑動協(xié)議[1]一般應(yīng)用于大數(shù)據(jù)實(shí)時傳輸。為確保數(shù)據(jù)傳輸?shù)目煽颗c高效,協(xié)議允許發(fā)送端在傳輸過程中可以一次性發(fā)送多個數(shù)據(jù)分組,在接收端確認(rèn)收到所有數(shù)據(jù)包,并規(guī)定只有接收端向前滑動窗口時,發(fā)送端才能向前滑動窗口。接收方和發(fā)送方按照上面的規(guī)律不斷向前滑動。
與傳統(tǒng)的傳輸方式(發(fā)送端每發(fā)送一個數(shù)據(jù)包后,必須等待接收端的確認(rèn),才能繼續(xù)發(fā)送下一個數(shù)據(jù)包)相比較,窗口滑動協(xié)議可以在未接收到確認(rèn)消息之前,一次發(fā)送多個數(shù)據(jù)包,避免了發(fā)送端在數(shù)據(jù)傳輸過程中頻繁的等待確認(rèn),從而大大提高了傳輸效率。此外,窗口傳輸協(xié)議還可以很好的解決端到端的通信流量控制問題,它允許接收端在擁有足夠數(shù)據(jù)緩沖之前對傳輸進(jìn)行限制。在實(shí)時傳輸中,滑動窗口的大小可以隨時調(diào)整,接收端在進(jìn)行分組確認(rèn)時,還可以交換滑動窗口控制信息,使收發(fā)兩端的窗口大小可以根據(jù)需要動態(tài)調(diào)整,在高效率傳輸數(shù)據(jù)的同時,避免擁塞的發(fā)生。
2.1停止等待協(xié)議
當(dāng)發(fā)送端窗口和接收端窗口的大小都等于1時。
2.2回退N步協(xié)議
當(dāng)發(fā)送端窗口大于1,接收端窗口等于1時。
2.3選擇重發(fā)協(xié)議
當(dāng)發(fā)送端窗口和接收端窗口大小都大于1時。
假設(shè)發(fā)送窗口和接收窗口尺寸都為2。
首先,發(fā)送端無數(shù)據(jù)發(fā)出,發(fā)送窗口前后沿重合,接收端0號、1號窗口打開,等待接收0號、1號幀;發(fā)送方打開0號、1號窗口,表示0、1幀均在等待確認(rèn)隊列,發(fā)送方此時打開的窗口數(shù)已經(jīng)達(dá)到最大,在未收到新的確認(rèn)回復(fù)幀之前,將暫停發(fā)送新的數(shù)據(jù)幀。
接收方收到0號、1號幀,0、1號窗口關(guān)閉,2號、3號窗口打開,表示準(zhǔn)備接收2號、3號幀數(shù)據(jù);
發(fā)送方收到從接收方發(fā)來的0號、1號幀確認(rèn)回復(fù)信息后,關(guān)閉0號、1號窗口,表示從重發(fā)表中刪除0號、1號幀數(shù)據(jù),發(fā)送方繼續(xù)發(fā)送2、3號數(shù)據(jù)幀,2號、3號窗口打開,2、3號幀進(jìn)入等待確認(rèn)隊列。此時,發(fā)送方打開的窗口數(shù)已經(jīng)達(dá)到最大值,在未收到新的確認(rèn)回復(fù)幀之前,將暫停發(fā)送新的數(shù)據(jù)幀。
接收方收到2、3號數(shù)據(jù)幀,2、3號窗口關(guān)閉,4、5號窗口打開,表示準(zhǔn)備接收4、5號幀。
發(fā)送方收到從接收方發(fā)來的2號、3號幀確認(rèn)回復(fù)信息后,關(guān)閉2號、3號窗口,表示從重發(fā)表中刪除2號、3號幀數(shù)據(jù),發(fā)送方繼續(xù)發(fā)送4、5號數(shù)據(jù)幀,4號、5號窗口打開。像這樣,窗口一直持續(xù)不斷的向前遞延,直到最后一幀數(shù)據(jù)被發(fā)送完成。如發(fā)送方發(fā)送的幀數(shù)據(jù)在設(shè)定時間內(nèi)未得到響應(yīng),將啟動超時重發(fā)機(jī)制,對該數(shù)據(jù)進(jìn)行重發(fā),直至收到對方確認(rèn)回復(fù)信息。
文章采用C++編程語言進(jìn)行具體實(shí)現(xiàn)。
首先定義幀數(shù)據(jù)相關(guān)數(shù)據(jù)結(jié)構(gòu),格式如下:

在程序開始,需將上面相關(guān)數(shù)據(jù)初始化為0,這里不在一一列舉。接收端需建立相關(guān)監(jiān)聽程序,用來監(jiān)聽是否收到信息,并對接收到的幀信息進(jìn)行處理,例如拷貝數(shù)據(jù)段信息:


設(shè)置標(biāo)記為已接收:slot->recevied=TRUE。
回傳幀頭部信息:send_socket(LINK,m,ALEN)。
發(fā)送端需建立相關(guān)處理程序,用來接收確認(rèn)回復(fù)信息:slot=&state->sendQ[state->LAR++% SWS]。
刪除超時重發(fā)隊列相關(guān)信息:evCancel (&slot->timeout)。
發(fā)送端在未接收到新的回復(fù)信息時,需等待發(fā)送窗口的打開:wait_for_semaphore= WaitForSingleObject(*sendWindowNotFull,-1);當(dāng)有消息進(jìn)入,并已確認(rèn)可以發(fā)送下一幀數(shù)據(jù)時,需將幀序號加1,state->hdr.SeqNum=state->LFS++;并拷貝相關(guān)信息,msgAddHdr(frame,hbuf);msgSaveCopy (slot->msg,frame);發(fā)送并同時打開計時器slot->timeout=evSchedule(frame,SWP_SEND_ TIMEOUT);send_socket(LINK,frame,HLEN+DLEN)。如果在設(shè)定時間內(nèi),未收到對方確認(rèn)接收信息,那么,該條信息將被重新發(fā)送,程序則會一直重復(fù)下去,新的窗口被不斷的打開,直到所有數(shù)據(jù)傳輸完畢。
因篇幅所限,例如端口設(shè)置、創(chuàng)建綁定與監(jiān)聽線程、捕獲異常等基礎(chǔ)功能將不再贅述。
UDP是一種高效的傳輸協(xié)議,為了彌補(bǔ)它在傳輸過程中很容易丟包的缺點(diǎn),文章引入了滑動窗口傳輸協(xié)議。與普通的傳輸方式相比,它的傳輸更加的有效,也更加的靈活。在數(shù)據(jù)傳輸和通信服務(wù)與日俱增的今天,滑動窗口協(xié)議不失為一種較好的選擇。
[1]陳川,林亞平.滑動窗口協(xié)議分析及其在微機(jī)上的模擬實(shí)現(xiàn)[J].計算機(jī)應(yīng)用,2000,2(2):24-26.
[2]Debbie Leung,Jonathan Oppenheim,Andreas Winter.Quantum Network Communication-TheButterfly and Beyond.IEEE Transactions on Information Theory.2010.
(責(zé)任編輯張劍妹)
TP393.021
A
1673-2014(2016)05-0040-02
長治學(xué)院校級科研課題“基于IPv4向IPv6過渡的NAT穿越技術(shù)研究”(201520)。
2016—09—06
任雁(1984—),女,山西長治人,實(shí)驗(yàn)師,主要從事無線寬帶通信研究。