可靠UDP-GBN
聲明:以下內(nèi)容包括代碼均為個(gè)人記錄分享學(xué)習(xí)歷程,受限于個(gè)人水平,僅供參考
PS:評(píng)論區(qū)總是被默認(rèn)關(guān)閉 搞不明白
????書接上文,將停等機(jī)制改成基于滑動(dòng)窗口的流量控制機(jī)制,采用固定窗口大小,支持累積確認(rèn),完成給定測(cè)試文件的傳輸。?
協(xié)議設(shè)計(jì)變動(dòng):


滑動(dòng)窗口(GBN):


累計(jì)確認(rèn)+超時(shí)重傳:
?????? 服務(wù)器端采用累計(jì)確認(rèn),并選擇不對(duì)失序后的報(bào)文進(jìn)行緩存。服務(wù)器對(duì)客戶端做出的回復(fù)ACK=n,代表已經(jīng)收到了包括序號(hào)n在內(nèi)的及其之前的所有報(bào)文。服務(wù)器端重傳主要在主函數(shù)內(nèi),每次收到報(bào)文會(huì)進(jìn)行有效性檢查,通過有效性檢查的報(bào)文將檢查Seq是否為預(yù)期Seq。維護(hù)一個(gè)計(jì)數(shù)器countReAck,每當(dāng)出現(xiàn)非預(yù)期Seq報(bào)文時(shí),計(jì)數(shù)器countReAck遞增,當(dāng)計(jì)數(shù)器遞增到countReAck %4==0時(shí)觸發(fā)ACK重傳。這樣設(shè)計(jì)的目的是因?yàn)槔塾?jì)重傳會(huì)一次性傳回Base之后所有報(bào)文,但實(shí)際上服務(wù)器只需要某一個(gè)報(bào)文,因此利用計(jì)數(shù)器來減少冗余回傳。
????為了展示超時(shí)重傳,特別在當(dāng)服務(wù)器接收到第一個(gè)STR時(shí)令主線程暫時(shí)休眠2.5S,這個(gè)時(shí)間超過了客戶端超時(shí)時(shí)間2S,將會(huì)觸發(fā)超時(shí)重傳。
線程:


????服務(wù)器端線程十分簡(jiǎn)單,不多介紹。
差錯(cuò)檢驗(yàn):校驗(yàn)和與有效位檢查,略
握手揮手:不變
文件傳輸:
????客戶端,相較于上次,讀取文件無變化;將文件發(fā)送函數(shù)替換為了文件入隊(duì)函數(shù),不再負(fù)責(zé)發(fā)送文件,并且新增參數(shù)ifCont表示是否復(fù)用連接。

????服務(wù)器端,收到報(bào)文后將會(huì)自動(dòng)由服務(wù)器接收線程把數(shù)據(jù)段從接收隊(duì)列轉(zhuǎn)存到接收緩存區(qū)。當(dāng)所有報(bào)文確認(rèn)傳輸無誤后后調(diào)用文件寫入函數(shù),把數(shù)據(jù)寫入給定路徑內(nèi)。
套接字初始化:不變
運(yùn)行細(xì)節(jié)補(bǔ)充:


日志打?。郝?/p>
代碼:見 https://github.com/BluesPizza/ComputerNetworks?