色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

如何保證UDP可靠傳輸

如何保證UDP可靠傳輸?

如何讓UDP實(shí)現(xiàn)可靠傳輸

自定義通訊協(xié)議,在應(yīng)用層定義一些可靠的協(xié)議,比如檢測(cè)包的順序,重復(fù)包等問題,如果沒有收到對(duì)方的ACK,重新發(fā)包

UDP沒有Delievery Garuantee,也沒有順序保證,所以如果你要求你的數(shù)據(jù)發(fā)送與接受既要高效,又要保證有序,收包確認(rèn)等,你就需要在UDP協(xié)議上構(gòu)建自己的協(xié)議。比如RTCP,RTP協(xié)議就是在UPD協(xié)議之上專門為H.323協(xié)議簇上的IP電話設(shè)計(jì)的一種介于傳輸層和應(yīng)用層之間的協(xié)議。

UDP構(gòu)建可靠數(shù)據(jù)傳輸

簡(jiǎn)單來講,要使用UDP來構(gòu)建可靠的面向連接的數(shù)據(jù)傳輸,就要實(shí)現(xiàn)類似于TCP協(xié)議的超時(shí)重傳,有序接受,應(yīng)答確認(rèn),滑動(dòng)窗口流量控制等機(jī)制,等于說要在傳輸層的上一層(或者直接在應(yīng)用層)實(shí)現(xiàn)TCP協(xié)議的可靠數(shù)據(jù)傳輸機(jī)制,比如使用UDP數(shù)據(jù)包+序列號(hào),UDP數(shù)據(jù)包+時(shí)間戳等方法,在服務(wù)器端進(jìn)行應(yīng)答確認(rèn)機(jī)制,這樣就會(huì)保證不可靠的UDP協(xié)議進(jìn)行可靠的數(shù)據(jù)傳輸,不過這好像也是一個(gè)難題!

(一)可靠性協(xié)議

(可靠性協(xié)議這部分協(xié)議 參考論文《 基于UDP 的可靠文件傳輸協(xié)議設(shè)計(jì)與實(shí)現(xiàn) 》)

首先來設(shè)計(jì)最為重要的可靠性。在UDP增加報(bào)頭前,我們先定義8個(gè)字節(jié)的協(xié)議頭,為2個(gè)字節(jié)的數(shù)據(jù)包標(biāo)識(shí),2個(gè)字節(jié)的發(fā)送序號(hào),2個(gè)字節(jié)的文件指針定位和2個(gè)字節(jié)的數(shù)據(jù)包中數(shù)據(jù)大小信息。數(shù)據(jù)包標(biāo)志指明該數(shù)據(jù)包為文件數(shù)據(jù)包、確認(rèn)包或者其它控制包,發(fā)送序號(hào)用來指明數(shù)據(jù)包的順序信息,指針定位字節(jié)數(shù)據(jù)用來指明該數(shù)據(jù)包中數(shù)據(jù)被填寫到文件的哪個(gè)位置,最后的大小信息也是用來向文件中讀寫數(shù)據(jù)時(shí)使用。

協(xié)議保證可靠性的大致流程是(先只考慮單對(duì)單情況下的單方向發(fā)送):

首先發(fā)送端發(fā)送一個(gè)文件信息報(bào)文,這個(gè)報(bào)文就是最簡(jiǎn)單的UDP報(bào)文,但是里面的信息很重要,記錄著文件的大小,被分隔成的報(bào)文數(shù),文件序號(hào)。發(fā)完這個(gè)信息包,發(fā)送端阻塞,等待接收端的回復(fù)報(bào)文才能繼續(xù)。文件信息包被接收端接受以后使用確認(rèn)機(jī)制確定是否接受這個(gè)文件,并把決定回饋給發(fā)送端。此時(shí),發(fā)送端如果收到的是“確定接受”的結(jié)果,將會(huì)把這個(gè)文件的整組數(shù)據(jù)報(bào)全部發(fā)送過去,這里我們并不像最傳統(tǒng)的可靠傳輸協(xié)議TCP協(xié)議一樣,對(duì)于每個(gè)每個(gè)報(bào)文都要確認(rèn)接受完才會(huì)對(duì)下一個(gè)報(bào)文進(jìn)行處理,太沒效率,遵守本協(xié)議的接受端在接受這組報(bào)文的時(shí)候?qū)⒆袷劐e(cuò)序重排機(jī)制,來對(duì)收到的這組報(bào)文進(jìn)行按序號(hào)排序,期間可能序號(hào)不聯(lián)系不過沒關(guān)系,接受過程只要保證序號(hào)從小到大即可。發(fā)送端發(fā)完所有報(bào)文延遲一點(diǎn)時(shí)間再發(fā)送一個(gè)結(jié)束報(bào)文,延遲時(shí)間是為了減少結(jié)束報(bào)文比數(shù)據(jù)報(bào)文還早被接受的情況,當(dāng)然即使這種情況出現(xiàn)也不會(huì)破壞可靠性,只不過在在結(jié)束報(bào)文之后的數(shù)據(jù)報(bào)文會(huì)被當(dāng)做丟失的包被要求重發(fā),降低效率。接受端接受到結(jié)束報(bào)文后按照一開始的文件信息包的信息和序列號(hào)做對(duì)比,把沒有的序列號(hào)的報(bào)文的信息傳回給發(fā)送端,要求重新發(fā)送這些報(bào)文。發(fā)送端接到信息以后重發(fā)丟失的數(shù)據(jù)包。直到接收端拿到的報(bào)文和信息匹配,接受端就可以發(fā)回一個(gè)“接受完畢”的報(bào)文。這樣發(fā)送端接受端再進(jìn)行下一次文件傳輸。

在這個(gè)流程中有幾個(gè)重要的機(jī)制保證流程的可靠性:

確認(rèn)機(jī)制

本系統(tǒng)接收方并非對(duì)任意數(shù)據(jù)包都進(jìn)行確認(rèn),在下面的一些情況下會(huì)使用到該確認(rèn)機(jī)制:

1、接收方收到文件信息包時(shí),要對(duì)是否接收進(jìn)行確認(rèn)。

2、接收方收到結(jié)束包時(shí)要進(jìn)行確認(rèn),然后檢測(cè)該分組內(nèi)數(shù)據(jù)包是否丟失。

3、接收方收到全部數(shù)據(jù)包時(shí)要進(jìn)行確認(rèn),以便結(jié)束文件的傳輸過程。

重發(fā)機(jī)制

協(xié)議設(shè)計(jì)了兩種重發(fā)機(jī)制:一種是自動(dòng)重發(fā)機(jī)制,另一種是請(qǐng)求重發(fā)機(jī)制。自動(dòng)重發(fā)機(jī)制是消息發(fā)送時(shí)啟動(dòng)一個(gè)定時(shí)器,如果在規(guī)定的一段時(shí)間內(nèi)未收到接收方的確認(rèn)消息,則斷定這段時(shí)間內(nèi)發(fā)送的報(bào)文已經(jīng)丟失并進(jìn)行重發(fā)。請(qǐng)求重發(fā)機(jī)制則是在接收方收到發(fā)送方發(fā)來的傳輸結(jié)束消息后,在接收方對(duì)收到的所有報(bào)文序號(hào)進(jìn)行檢測(cè),如果發(fā)現(xiàn)某些序號(hào)的報(bào)文缺失,接收方主動(dòng)請(qǐng)求重發(fā)缺失的序號(hào)對(duì)應(yīng)的報(bào)文。具體實(shí)現(xiàn)設(shè)計(jì)如下所述:

1、自動(dòng)重發(fā)機(jī)制

通信發(fā)送方和接收方都維持一個(gè)自動(dòng)重發(fā)定時(shí)器,在通信開始前會(huì)檢查自動(dòng)重發(fā)定時(shí)器是否啟動(dòng),如果沒有啟動(dòng),就會(huì)啟動(dòng)這個(gè)定時(shí)器。如果在一個(gè)特定時(shí)間間隔內(nèi)發(fā)送方?jīng)]有收到來自接收方的任何確認(rèn)消息,或者接收方?jīng)]有到發(fā)送方的通道檢測(cè)報(bào)文。這時(shí)系統(tǒng)會(huì)將這個(gè)定時(shí)器歸零,并將這段時(shí)間內(nèi)發(fā)送的消息重發(fā)一遍,把記錄重發(fā)次數(shù)變量加1。如果過在規(guī)定的時(shí)間內(nèi)依然沒有收到對(duì)方的任何確認(rèn)信息,則重新將定時(shí)器歸0, 執(zhí)行重發(fā)操作并將重發(fā)次數(shù)加1,如此循環(huán),在重發(fā)次數(shù)未達(dá)到指定數(shù)據(jù)之前,直到收到對(duì)方的一個(gè)確認(rèn)消息,然后停止自動(dòng)重發(fā)定時(shí)器,將重發(fā)次數(shù)清 0;否則證明傳輸路徑出現(xiàn)問題。

2、請(qǐng)求重發(fā)機(jī)制

接收方記錄著已收到數(shù)據(jù)包的序列以及未收到的數(shù)據(jù)包序列。當(dāng)接收到分組結(jié)束包時(shí),接收方就會(huì)啟動(dòng)定時(shí)器,檢索該分組內(nèi)未收到的數(shù)據(jù)包,如果數(shù)據(jù)包已全部接收到,則關(guān)閉定時(shí)器,進(jìn)行下一個(gè)分組的傳輸。否則查找丟失 數(shù)據(jù)包的序號(hào)并依次發(fā)送請(qǐng)求重發(fā)數(shù)據(jù)包,在規(guī)定時(shí)間內(nèi)接收發(fā)送方重發(fā)的數(shù)據(jù)包,然后定時(shí)器歸 0,重新檢索未收到數(shù)據(jù)包,并按上述情況做出反應(yīng),如此循環(huán)往復(fù),直到最終完成該分組的傳輸過程。

協(xié)議的錯(cuò)序重排機(jī)制

協(xié)議頭結(jié)構(gòu)中有2個(gè)字節(jié)的序號(hào)字段,當(dāng)發(fā)送端接收到對(duì)端發(fā)送的確認(rèn)接收?qǐng)?bào)文后,開始讀取文件數(shù)據(jù)塊內(nèi)容寫入?yún)f(xié)議數(shù)據(jù)區(qū),為每一個(gè)數(shù)據(jù)塊編制一個(gè)序號(hào),序號(hào)的最大值要求與接收端維護(hù)的一個(gè)為了實(shí)現(xiàn)錯(cuò)序重排機(jī)制的動(dòng)態(tài)表長(zhǎng)度一致。序號(hào)排滿后,后面的報(bào)文會(huì)在下一個(gè)分組中進(jìn)行發(fā)送。這時(shí)發(fā)送端 會(huì)根據(jù)當(dāng)前分組下讀取的數(shù)據(jù)塊大小及起始位置填寫協(xié)議頭中的字段,最后將數(shù)據(jù)包發(fā)送出去。接收端起初會(huì)生成一個(gè)動(dòng)態(tài)數(shù)組用來存儲(chǔ)接收到的數(shù)據(jù)包序號(hào),當(dāng)接收端準(zhǔn)備好接收文件后將數(shù)組的每一位置為無效,每收到一個(gè)數(shù)據(jù)包,就會(huì)讀取其序號(hào)字段值并將數(shù)組相應(yīng)位置為有效,然后將數(shù)據(jù)區(qū)的內(nèi)容寫入文件。這樣即使由于網(wǎng)絡(luò)狀況導(dǎo)致數(shù)據(jù)包不能按序到達(dá),接收端也能根據(jù)數(shù)據(jù)包位置字段和大小字段將數(shù)據(jù)寫入文件。序號(hào)字段在收到結(jié)束包后用于檢索動(dòng)態(tài)數(shù)組啟動(dòng)請(qǐng)求重傳機(jī)制。

(二)多用戶并發(fā)訪問和文件下載協(xié)議

前面我們說UDP是面向無連接的,這樣一來就可以打破一對(duì)一連接的狀態(tài),使得一臺(tái)服務(wù)器可以向多個(gè)客戶端傳輸相同信息。

所以我們?nèi)绾卫盟鼇韺?shí)現(xiàn)多用戶并發(fā)訪問和文件下載呢?本協(xié)議中,首先發(fā)送方會(huì)開辟一個(gè)空間,這個(gè)空間儲(chǔ)存著發(fā)送端有的各個(gè)文件的序號(hào)和可能出現(xiàn)的接收方希望得到某個(gè)序號(hào)文件的ip地址端口號(hào)等信息。在發(fā)送端開始運(yùn)作之后,就會(huì)有一個(gè)進(jìn)程一直在監(jiān)聽是否有對(duì)某個(gè)文件的請(qǐng)求,如果有就把請(qǐng)求方的信息儲(chǔ)存在這個(gè)空間里。假如請(qǐng)求某個(gè)文件的ip+端口只有一個(gè),那么這個(gè)協(xié)議是沒有實(shí)質(zhì)性作用。然而一旦短時(shí)間內(nèi)有大量的ip請(qǐng)求這個(gè)文件,那么在某次我們上邊設(shè)計(jì)的可靠性協(xié)議的傳輸過程中,就可以好好利用這個(gè)時(shí)間差,下一段具體說明。除此之外還有一個(gè)很人性化的設(shè)計(jì)可以加入到這里,就是可以在監(jiān)聽到某次請(qǐng)求時(shí)向?qū)Ψ椒祷啬壳暗姆?wù)器狀況,比如對(duì)應(yīng)文件的等待ip有多少,這樣讓接受方?jīng)Q定狀況比較擁堵時(shí)候是否等一下再請(qǐng)求。

具體來說,我們每次發(fā)送文件信息報(bào)文時(shí),在多個(gè)接收方請(qǐng)求的情況下將是一組一組發(fā)送的,把目前在等待空間的所有(或者限制一個(gè)上限個(gè)數(shù)10個(gè))接收方都發(fā)送文件信息報(bào)文。收到的同意接受報(bào)文后把這些同意接受的信息記錄下來,將文件報(bào)文組和發(fā)送完畢的報(bào)文同時(shí)發(fā)送給這些接受方,再把各個(gè)接收方返回的缺失報(bào)文記錄下來,再重傳。

非常重要的一點(diǎn)是,其實(shí)對(duì)于接受方來說在文件傳輸過程中并沒有什么多余的動(dòng)作,它要做的和只有他一個(gè)接收方的情況沒有任何的不同,可能只是整個(gè)過程的流暢性會(huì)受影響。需要變動(dòng)的主要是發(fā)送方,它在做好可靠性協(xié)議要求的幾點(diǎn)之外,還要做好一系列的記錄操作,保證整個(gè)過程不會(huì)亂套。

(三)針對(duì)下載的文件大小不應(yīng)有限制設(shè)計(jì)的協(xié)議

回答問題時(shí)候其實(shí)就把思路講完全了,對(duì)于一份任意大小的文件,我們都是可以通過切分成固定大小的N個(gè)報(bào)文然后將他們組成一組發(fā)送的。在每次組報(bào)文傳輸過程之前傳輸?shù)奈募畔?bào)文也是這個(gè)過程之一,它記錄了本次文件的大小,被分成的報(bào)文數(shù)量,每個(gè)報(bào)文的大小(通常確定的大?。?。這種方法下,不管多大的文件都視作一定數(shù)量的報(bào)文,只要發(fā)送方和接受方在信息報(bào)文中確定了信息,文件大小就沒有限制

所以,利用上邊設(shè)計(jì)的可靠性協(xié)議、多用戶并發(fā)訪問和文件下載協(xié)議和針對(duì)下載的文件大小不應(yīng)有限制設(shè)計(jì)的協(xié)議,我們就能實(shí)現(xiàn)一個(gè)可靠的文件傳輸協(xié)議,并滿足以下要求:1)下層使用不可靠的UDP服務(wù)(即使用數(shù)據(jù)報(bào)方式的套接字);2)能夠支持多用戶并發(fā)訪問和文件下載;3)下載的文件大小不應(yīng)有限制。