日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

如何保證udp可靠傳輸

如何讓UDP實現(xiàn)可靠傳輸
自定義通訊協(xié)議,在應用層定義一些可靠的協(xié)議,比如檢測包的順序,重復包等問題,如果沒有收到對方的ACK,重新發(fā)包
UDP沒有Delievery Garuantee,也沒有順序保證,所以如果你要求你的數據發(fā)送與接受既要高效,又要保證有序,收包確認等,你就需要在UDP協(xié)議上構建自己的協(xié)議 。比如RTCP,RTP協(xié)議就是在UPD協(xié)議之上專門為H.323協(xié)議簇上的IP電話設計的一種介于傳輸層和應用層之間的協(xié)議 。
UDP構建可靠數據傳輸
簡單來講,要使用UDP來構建可靠的面向連接的數據傳輸,就要實現(xiàn)類似于TCP協(xié)議的超時重傳,有序接受,應答確認,滑動窗口流量控制等機制,等于說要在傳輸層的上一層(或者直接在應用層)實現(xiàn)TCP協(xié)議的可靠數據傳輸機制,比如使用UDP數據包+序列號,UDP數據包+時間戳等方法,在服務器端進行應答確認機制,這樣就會保證不可靠的UDP協(xié)議進行可靠的數據傳輸,不過這好像也是一個難題!
(一)可靠性協(xié)議
(可靠性協(xié)議這部分協(xié)議 參考論文《 基于UDP 的可靠文件傳輸協(xié)議設計與實現(xiàn) 》)
首先來設計最為重要的可靠性 。在UDP增加報頭前,我們先定義8個字節(jié)的協(xié)議頭,為2個字節(jié)的數據包標識,2個字節(jié)的發(fā)送序號,2個字節(jié)的文件指針定位和2個字節(jié)的數據包中數據大小信息 。數據包標志指明該數據包為文件數據包、確認包或者其它控制包,發(fā)送序號用來指明數據包的順序信息,指針定位字節(jié)數據用來指明該數據包中數據被填寫到文件的哪個位置,最后的大小信息也是用來向文件中讀寫數據時使用 。
協(xié)議保證可靠性的大致流程是(先只考慮單對單情況下的單方向發(fā)送):
首先發(fā)送端發(fā)送一個文件信息報文,這個報文就是最簡單的UDP報文,但是里面的信息很重要,記錄著文件的大小,被分隔成的報文數,文件序號 。發(fā)完這個信息包,發(fā)送端阻塞,等待接收端的回復報文才能繼續(xù) 。文件信息包被接收端接受以后使用確認機制確定是否接受這個文件,并把決定回饋給發(fā)送端 。此時,發(fā)送端如果收到的是“確定接受”的結果,將會把這個文件的整組數據報全部發(fā)送過去,這里我們并不像最傳統(tǒng)的可靠傳輸協(xié)議TCP協(xié)議一樣,對于每個每個報文都要確認接受完才會對下一個報文進行處理,太沒效率,遵守本協(xié)議的接受端在接受這組報文的時候將遵守錯序重排機制,來對收到的這組報文進行按序號排序,期間可能序號不聯(lián)系不過沒關系,接受過程只要保證序號從小到大即可 。發(fā)送端發(fā)完所有報文延遲一點時間再發(fā)送一個結束報文,延遲時間是為了減少結束報文比數據報文還早被接受的情況,當然即使這種情況出現(xiàn)也不會破壞可靠性,只不過在在結束報文之后的數據報文會被當做丟失的包被要求重發(fā),降低效率 。接受端接受到結束報文后按照一開始的文件信息包的信息和序列號做對比,把沒有的序列號的報文的信息傳回給發(fā)送端,要求重新發(fā)送這些報文 。發(fā)送端接到信息以后重發(fā)丟失的數據包 。直到接收端拿到的報文和信息匹配,接受端就可以發(fā)回一個“接受完畢”的報文 。這樣發(fā)送端接受端再進行下一次文件傳輸 。
在這個流程中有幾個重要的機制保證流程的可靠性:
確認機制
【如何保證udp可靠傳輸】本系統(tǒng)接收方并非對任意數據包都進行確認,在下面的一些情況下會使用到該確認機制:
1、接收方收到文件信息包時,要對是否接收進行確認 。
2、接收方收到結束包時要進行確認,然后檢測該分組內數據包是否丟失 。
3、接收方收到全部數據包時要進行確認,以便結束文件的傳輸過程 。
重發(fā)機制
協(xié)議設計了兩種重發(fā)機制:一種是自動重發(fā)機制,另一種是請求重發(fā)機制 。自動重發(fā)機制是消息發(fā)送時啟動一個定時器,如果在規(guī)定的一段時間內未收到接收方的確認消息,則斷定這段時間內發(fā)送的報文已經丟失并進行重發(fā) 。請求重發(fā)機制則是在接收方收到發(fā)送方發(fā)來的傳輸結束消息后,在接收方對收到的所有報文序號進行檢測,如果發(fā)現(xiàn)某些序號的報文缺失,接收方主動請求重發(fā)缺失的序號對應的報文 。具體實現(xiàn)設計如下所述:
1、自動重發(fā)機制
通信發(fā)送方和接收方都維持一個自動重發(fā)定時器,在通信開始前會檢查自動重發(fā)定時器是否啟動,如果沒有啟動,就會啟動這個定時器 。如果在一個特定時間間隔內發(fā)送方沒有收到來自接收方的任何確認消息,或者接收方沒有到發(fā)送方的通道檢測報文 。這時系統(tǒng)會將這個定時器歸零,并將這段時間內發(fā)送的消息重發(fā)一遍,把記錄重發(fā)次數變量加1 。如果過在規(guī)定的時間內依然沒有收到對方的任何確認信息,則重新將定時器歸0,執(zhí)行重發(fā)操作并將重發(fā)次數加1,如此循環(huán),在重發(fā)次數未達到指定數據之前,直到收到對方的一個確認消息,然后停止自動重發(fā)定時器,將重發(fā)次數清 0;否則證明傳輸路徑出現(xiàn)問題 。
2、請求重發(fā)機制
接收方記錄著已收到數據包的序列以及未收到的數據包序列 。當接收到分組結束包時,接收方就會啟動定時器,檢索該分組內未收到的數據包,如果數據包已全部接收到,則關閉定時器,進行下一個分組的傳輸 。否則查找丟失 數據包的序號并依次發(fā)送請求重發(fā)數據包,在規(guī)定時間內接收發(fā)送方重發(fā)的數據包,然后定時器歸 0,重新檢索未收到數據包,并按上述情況做出反應,如此循環(huán)往復,直到最終完成該分組的傳輸過程 。
協(xié)議的錯序重排機制
協(xié)議頭結構中有2個字節(jié)的序號字段,當發(fā)送端接收到對端發(fā)送的確認接收報文后,開始讀取文件數據塊內容寫入協(xié)議數據區(qū),為每一個數據塊編制一個序號,序號的最大值要求與接收端維護的一個為了實現(xiàn)錯序重排機制的動態(tài)表長度一致 。序號排滿后,后面的報文會在下一個分組中進行發(fā)送 。這時發(fā)送端 會根據當前分組下讀取的數據塊大小及起始位置填寫協(xié)議頭中的字段,最后將數據包發(fā)送出去 。接收端起初會生成一個動態(tài)數組用來存儲接收到的數據包序號,當接收端準備好接收文件后將數組的每一位置為無效,每收到一個數據包,就會讀取其序號字段值并將數組相應位置為有效,然后將數據區(qū)的內容寫入文件 。這樣即使由于網絡狀況導致數據包不能按序到達,接收端也能根據數據包位置字段和大小字段將數據寫入文件 。序號字段在收到結束包后用于檢索動態(tài)數組啟動請求重傳機制 。
(二)多用戶并發(fā)訪問和文件下載協(xié)議
前面我們說UDP是面向無連接的,這樣一來就可以打破一對一連接的狀態(tài),使得一臺服務器可以向多個客戶端傳輸相同信息 。
所以我們如何利用它來實現(xiàn)多用戶并發(fā)訪問和文件下載呢?本協(xié)議中,首先發(fā)送方會開辟一個空間,這個空間儲存著發(fā)送端有的各個文件的序號和可能出現(xiàn)的接收方希望得到某個序號文件的ip地址端口號等信息 。在發(fā)送端開始運作之后,就會有一個進程一直在監(jiān)聽是否有對某個文件的請求,如果有就把請求方的信息儲存在這個空間里 。假如請求某個文件的ip+端口只有一個,那么這個協(xié)議是沒有實質性作用 。然而一旦短時間內有大量的ip請求這個文件,那么在某次我們上邊設計的可靠性協(xié)議的傳輸過程中,就可以好好利用這個時間差,下一段具體說明 。除此之外還有一個很人性化的設計可以加入到這里,就是可以在監(jiān)聽到某次請求時向對方返回目前的服務器狀況,比如對應文件的等待ip有多少,這樣讓接受方決定狀況比較擁堵時候是否等一下再請求 。
具體來說,我們每次發(fā)送文件信息報文時,在多個接收方請求的情況下將是一組一組發(fā)送的,把目前在等待空間的所有(或者限制一個上限個數10個)接收方都發(fā)送文件信息報文 。收到的同意接受報文后把這些同意接受的信息記錄下來,將文件報文組和發(fā)送完畢的報文同時發(fā)送給這些接受方,再把各個接收方返回的缺失報文記錄下來,再重傳 。
非常重要的一點是,其實對于接受方來說在文件傳輸過程中并沒有什么多余的動作,它要做的和只有他一個接收方的情況沒有任何的不同,可能只是整個過程的流暢性會受影響 。需要變動的主要是發(fā)送方,它在做好可靠性協(xié)議要求的幾點之外,還要做好一系列的記錄操作,保證整個過程不會亂套 。
(三)針對下載的文件大小不應有限制設計的協(xié)議
解答問題時候其實就把思路講完全了,對于一份任意大小的文件,我們都是可以通過切分成固定大小的N個報文然后將他們組成一組發(fā)送的 。在每次組報文傳輸過程之前傳輸的文件信息報文也是這個過程之一,它記錄了本次文件的大小,被分成的報文數量,每個報文的大?。ㄍǔ4_定的大小) 。這種方法下,不管多大的文件都視作一定數量的報文,只要發(fā)送方和接受方在信息報文中確定了信息,文件大小就沒有限制
所以,利用上邊設計的可靠性協(xié)議、多用戶并發(fā)訪問和文件下載協(xié)議和針對下載的文件大小不應有限制設計的協(xié)議,我們就能實現(xiàn)一個可靠的文件傳輸協(xié)議,并滿足以下要求:1)下層使用不可靠的UDP服務(即使用數據報方式的套接字);2)能夠支持多用戶并發(fā)訪問和文件下載;3)下載的文件大小不應有限制 。

    推薦閱讀