本發(fā)明涉及在UDP層之上建立一種可靠傳輸?shù)姆椒?,是一種基于UDP的可靠傳輸方法。
背景技術(shù):
隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,網(wǎng)絡(luò)應(yīng)用增長速度飛快。應(yīng)用對網(wǎng)絡(luò)的要求也越來越高。通常游戲應(yīng)用要求網(wǎng)絡(luò)具有較低的延時且能夠頻繁地收發(fā)數(shù)據(jù)。TCP由IETF制定的一個傳輸層的控制協(xié)議,它是面向連接的、基于字節(jié)流的、可靠的傳輸控制協(xié)議。TCP層是位于IP層之上,應(yīng)用層之下的中間層。它為應(yīng)用層提供可靠的數(shù)據(jù)傳輸、擁塞控制等功能。
TCP并不適用于這種情形,因為它具有較高的延時和流方向。UDP是由IETF制定的一個面向無連接的、基于數(shù)據(jù)報的、不可靠的傳輸層協(xié)議。然而UDP不具有可靠的數(shù)據(jù)傳輸、流量控制和擁塞控制,所以UDP本身也不適合這種情況。
應(yīng)用可以同時使用UDP和TCP以便獲取兩者的功能。但是,由此產(chǎn)生的協(xié)議組合仍然有很多不足之處。例如TCP缺乏通過建立多路套接字來完成多路通信,由于其緩沖機制使得TCP的包劃分十分復(fù)雜。UDP缺乏序列號、連接管理和帶寬資源管理等機制,并且限制了數(shù)據(jù)包的大小。因此,采用UDP協(xié)議進行可靠數(shù)據(jù)傳輸?shù)姆椒ń陙慝@得了迅速的發(fā)展。
技術(shù)實現(xiàn)要素:
為了克服已有UDP協(xié)議數(shù)據(jù)傳輸方式的可靠性較低的不足,本發(fā)明提供一種可靠性良好的基于UDP的可靠傳輸方法
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
一種基于UDP的可靠傳輸方法,所述可靠傳輸方法是一種UDP層上的可靠傳輸協(xié)議,所述可靠傳輸協(xié)議包括可靠傳輸、不可靠傳輸和亂序傳輸;
所述可靠傳輸,用于在兩個上層應(yīng)用之間提供可靠的數(shù)據(jù)傳輸,接收的數(shù)據(jù)報需要進行確認,丟失的數(shù)據(jù)報需要進行重傳,接收到的數(shù)據(jù)報按報文可靠序列號的順序提交給上層應(yīng)用;
所述不可靠傳輸,用于在兩個上層應(yīng)用之間提供不可靠的數(shù)據(jù)傳輸,接收的數(shù)據(jù)報不需要進行確認,丟失的數(shù)據(jù)報不需要進行重傳,接收到的數(shù)據(jù)報按報文不可靠序列號的順序提交給上層應(yīng)用;
所述亂序傳輸,用于在兩個上層應(yīng)用之間提供亂序的數(shù)據(jù)傳輸,接收的數(shù)據(jù)報不需要進行確認,丟失的數(shù)據(jù)不需要進行重傳,接收到的數(shù)據(jù)報直接按接收順序提交給上層應(yīng)用。
進一步,所述可靠傳輸中,通過提供確認機制和超時重傳機制來實現(xiàn)基于UDP的可靠傳輸:當本地主機需要發(fā)送可靠數(shù)據(jù)報時,首先將待發(fā)送數(shù)據(jù)報的相應(yīng)標志位設(shè)置為可靠數(shù)據(jù)報;然后將該可靠數(shù)據(jù)報插入到待發(fā)送可靠消息列隊中等待發(fā)送;發(fā)送函數(shù)周期性遍歷各個待發(fā)送消息列隊,將列隊中的消息進行封裝加上一個協(xié)議頭并調(diào)用UDP層的套接字sendmsg()函數(shù)發(fā)送;
設(shè)定3個待發(fā)送消息列隊:待發(fā)送確認消息列隊、待發(fā)送可靠消息列隊和待發(fā)送不可靠消息列隊,這三個消息列隊用于存放待發(fā)送的確認消息、可靠消息和不可靠消息,消息封裝的規(guī)則如下:
1)、協(xié)議優(yōu)先查詢待發(fā)送確認消息列隊,如果待發(fā)送確認消息列隊不為空,則將列隊中的若干確認消息取出準備封裝;
2)、如果待發(fā)送確認消息列隊為空或者待發(fā)送確認消息列隊中的確認消息已取出準備封裝,則查詢待發(fā)送可靠消息列隊,并將該列隊中滿足發(fā)送條件的可靠消息取出準備封裝;
3)、最后查詢待發(fā)送不可靠消息列隊,將該列隊中滿足發(fā)送條件的不可靠消息取出封裝發(fā)送;
4)、如果封裝數(shù)據(jù)報中包含可靠消息,則在該協(xié)議頭添加一個時間戳選項,如果該封裝數(shù)據(jù)報中不含有可靠消息,則不需要添加時間戳選項,只需包含對等主機號即可。
再進一步,接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的可靠數(shù)據(jù)報;然后根據(jù)數(shù)據(jù)報報頭中的對等主機號選擇相應(yīng)的對等主機進行處理;處理函數(shù)將已接收的可靠數(shù)據(jù)報根據(jù)可靠序列號按從小到大的順序進行排序并將排好序的數(shù)據(jù)報提交給上層應(yīng)用;然后根據(jù)接收數(shù)據(jù)報的可靠序列號創(chuàng)建一個確認消息,然后將該確認消息插入到待發(fā)送確認消息列隊中等待發(fā)送;
發(fā)送端每次接收到遠程主機發(fā)回的確認消息時,都根據(jù)確認消息中的已接收時間戳字段計算本次傳輸?shù)膶崟rRTT(Round Trip Time)值,并更新RTT平滑估計器的估計值R和RTT平滑估計器均值標準差D,然后將該確認消息中已接收可靠序列號指向的消息從已發(fā)送可靠消息列隊中移除,并釋放相應(yīng)的內(nèi)存資源;
協(xié)議周期性調(diào)用檢查超時函數(shù),當已發(fā)送可靠消息列隊中的消息經(jīng)過往返超時值還沒收到該消息的確認消息時,將該消息從已發(fā)送可靠消息列隊移至待發(fā)送可靠消息列隊的隊首進行重傳。超時重傳的策略為:首次超時的時間為:
RTO=R+4D
其中,R為RTT平滑估計器,D為RTT平滑估計器的均值標準差,平滑估計器R的計算式如下:
其中,加權(quán)因子β=5,M為實際測量的RTT值,平滑估計器R的均值標準差D的計算式如下:
D=D+h(|M-R|-D)
其中,增益因子h=0.25,M為實際測量的RTT值;
協(xié)議每次接收到來自遠程主機的ACK時,都計算本次傳輸?shù)腞TT值M,然后用該實際測量的RTT值M更新RTT平滑估計器及其均值標準差D;
首次重傳超時后,往返超時值RTO按照指數(shù)退避的方式遞增:
RTO=2*RTO
當往返超時值大于等于往返超時值的最大值時,往返超時值不再遞增,并按照該最大值重傳丟失的數(shù)據(jù)報;當經(jīng)過最大超時值還未收到該消息的確認消息時,則認為網(wǎng)絡(luò)斷開,執(zhí)行相應(yīng)的斷開連接操作。
更進一步,所述可靠傳輸包括基于帶寬估計的擁塞控制機制,估計當前網(wǎng)絡(luò)實際可用帶寬,并根據(jù)該估計值調(diào)整當前發(fā)送速率,該帶寬估計方法是一種基于RUDP吞吐量的估計方法,當網(wǎng)絡(luò)工作在飽和狀態(tài)下時,根據(jù)接收端的接收速率來估計鏈路的實際可用帶寬;接收端中保存有一個Data_Received的變量用于統(tǒng)計帶寬估計期間接收到的數(shù)據(jù)量,接收端每接收到一條可靠數(shù)據(jù)消息,都將Data_Received變量值和該消息長度相加并重新賦值,在帶寬估計期間,假設(shè)接收到第一條數(shù)據(jù)消息的時間為tk,接收到最后一條數(shù)據(jù)消息的時間為tk+1,則帶寬估計B為:
接收端周期性進行帶寬估計,并將帶寬估計值封裝在帶寬通知消息中發(fā)送給發(fā)送端;
發(fā)送端在接收到帶寬通知消息后,對帶寬通知消息中的帶寬估計值進行平滑估計,以減小鏈路抖動等因數(shù)對實際采樣帶寬值造成的影響:
Bavailable=αBavailable+(1-α)B
其中,α是平滑因子,Bavailable為實際可用帶寬的估計值,發(fā)送端每次接收到帶寬通知消息后,都用該帶寬通知消息中的帶寬估計值更新估計器Bavailable;
發(fā)送端保存一個發(fā)送窗口值Send_window用于控制網(wǎng)絡(luò)中實際傳輸?shù)臄?shù)據(jù)量,發(fā)送端還保存一個統(tǒng)計已發(fā)送未確認數(shù)據(jù)量的變量,每次發(fā)送可靠數(shù)據(jù)消息前,都將該變量與待發(fā)送消息的數(shù)據(jù)長度相加并判斷是否大于Send_window;如果大于,停止發(fā)送該可靠數(shù)據(jù)消息;如果小于,發(fā)送該消息并將相加值更新至該變量中,Send_window的初始值為W,每次當本地主機接收到遠程主機發(fā)來的ACK消息時:
Send_window+=Winc
Winc是一個窗口值常量,每當本地主機檢測到一個丟包時,如果
Bavailable*min{R}<Winmin:
Send_window=Winmin
否則:
Send_window=Bavailable*min{R}
其中,R是當前時刻鏈路的RTT估計值,Winmin是發(fā)送窗口最小值,min{R}表示沒有排隊時延的往返RTT值。
所述不可靠傳輸中,當本地主機需要發(fā)送不可靠數(shù)據(jù)報時,首先將待發(fā)送的數(shù)據(jù)報的相應(yīng)標志位設(shè)置為不可靠數(shù)據(jù)報;然后將該不可靠數(shù)據(jù)報插入到待發(fā)送不可靠消息列隊中等待發(fā)送;發(fā)送函數(shù)將各個待發(fā)送消息列隊中消息進行封裝加上一個協(xié)議頭并調(diào)用UDP層的套接字sendmsg()函數(shù)發(fā)送;然后將該數(shù)據(jù)報從待發(fā)送不可靠消息列隊移至已發(fā)送不可靠消息列隊;再將該消息從已發(fā)消息列隊移除并釋放相應(yīng)的內(nèi)存資源;接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的不可靠數(shù)據(jù)報;并根據(jù)接收數(shù)據(jù)報頭中的對等主機號選擇相應(yīng)的對等主機進行處理;處理函數(shù)將已接收的不可靠數(shù)據(jù)報根據(jù)可靠序列號和不可靠序列號進行排序;最后將排好序的數(shù)據(jù)報提交給上層應(yīng)用。
不可靠數(shù)據(jù)報的排序規(guī)則如下:
①、首先根據(jù)可靠序列號按照從小到大的順序進行排序。
②、可靠序列號相同時,根據(jù)不可序列號按照從小到大的順序進行排序。
所述亂序傳輸中,當本地主機需要發(fā)送亂序數(shù)據(jù)報時,首先將待發(fā)送數(shù)據(jù)報的相應(yīng)標志位設(shè)置為亂序數(shù)據(jù)報;然后將該亂序數(shù)據(jù)報插入到待發(fā)送不可靠消息列隊中等待發(fā)送;然后將各個待發(fā)送消息列隊中的消息進行封裝加上一個協(xié)議頭并調(diào)用UDP層的套接字sendmsg()函數(shù)發(fā)送;接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的亂序數(shù)據(jù)報;然后根據(jù)接收數(shù)據(jù)報包頭的對等主機號選擇相應(yīng)的對等主機進行處理;處理函數(shù)將已接收的亂序數(shù)據(jù)報按照接收順序進行排序;最后將排好序的數(shù)據(jù)報提交給上層應(yīng)用。
在所述可靠傳輸協(xié)議中,有規(guī)定的最大傳輸單元MTU值,當數(shù)據(jù)報長度大于MTU時,則需要對數(shù)據(jù)報進行分片處理,接收端接收到該分片數(shù)據(jù)報時在接收端進行組包然后排序并提交給上層應(yīng)用。
本發(fā)明的有益效果主要表現(xiàn)在:1、本發(fā)明可以在UDP層上實現(xiàn)可靠數(shù)據(jù)通信;2、本發(fā)明可以用于快速高效地傳輸數(shù)據(jù);3、本發(fā)明可以降低網(wǎng)絡(luò)擁塞發(fā)生的概率并提高了網(wǎng)絡(luò)的吞吐量。
附圖說明
圖1是基于UDP的可靠傳輸協(xié)議的UDP/IP層級結(jié)構(gòu)。
圖2是可靠數(shù)據(jù)消息的結(jié)構(gòu)圖。
圖3是不可靠數(shù)據(jù)消息的結(jié)構(gòu)圖。
圖4是亂序數(shù)據(jù)消息的結(jié)構(gòu)圖。
圖5是分片數(shù)據(jù)消息的結(jié)構(gòu)圖。
圖6是確認消息的結(jié)構(gòu)圖。
圖7是基于UDP的可靠傳輸協(xié)議的數(shù)據(jù)報封裝格式(包含可靠數(shù)據(jù)消息)。
圖8是基于UDP的可靠傳輸協(xié)議的數(shù)據(jù)報封裝格式(不包含可靠數(shù)據(jù)消息)。
圖9是基于UDP的可靠傳輸協(xié)議的OPNET仿真網(wǎng)絡(luò)模型。
圖10是鏈路的背景流量隨時間的關(guān)系圖。
圖11是RUDP主機的發(fā)送速率隨時間的關(guān)系圖。
圖12是RUDP主機對RUDP服務(wù)器下行帶寬的估計值隨時間的關(guān)系圖。
圖13為RUDP服務(wù)器的接收速率(下行帶寬)隨時間的關(guān)系圖。
圖14是RUDP仿真網(wǎng)絡(luò)的發(fā)送窗口值隨時間的關(guān)系圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明作進一步描述。
參照圖1~圖14,一種基于UDP的可靠傳輸方法,所述可靠傳輸方法是一種UDP層上的可靠傳輸協(xié)議,所述可靠傳輸協(xié)議提供了多種可靠性要求的數(shù)據(jù)傳輸以滿足不同應(yīng)用的需求,包括:可靠傳輸、不可靠傳輸和亂序傳輸;
所述可靠傳輸,用于在兩個上層應(yīng)用之間提供可靠的數(shù)據(jù)傳輸,接收的數(shù)據(jù)報需要進行確認,丟失的數(shù)據(jù)報需要進行重傳,接收到的數(shù)據(jù)報按報文可靠序列號的順序提交給上層應(yīng)用;
所述不可靠傳輸,用于在兩個上層應(yīng)用之間提供不可靠的數(shù)據(jù)傳輸,接收的數(shù)據(jù)報不需要進行確認,丟失的數(shù)據(jù)報不需要進行重傳,接收到的數(shù)據(jù)報按報文不可靠序列號的順序提交給上層應(yīng)用;
所述亂序傳輸,用于在兩個上層應(yīng)用之間提供亂序的數(shù)據(jù)傳輸,接收的數(shù)據(jù)報不需要進行確認,丟失的數(shù)據(jù)不需要進行重傳,接收到的數(shù)據(jù)報直接按接收順序提交給上層應(yīng)用;
進一步,所述的基于UDP的可靠傳輸協(xié)議的可靠傳輸中,所述的基于UDP的可靠傳輸協(xié)議通過提供確認機制和超時重傳機制來實現(xiàn)基于UDP的可靠傳輸:當本地主機需要發(fā)送可靠數(shù)據(jù)報時,首先將待發(fā)送數(shù)據(jù)報的相應(yīng)標志位設(shè)置為可靠數(shù)據(jù)報;然后將該可靠數(shù)據(jù)報插入到待發(fā)送可靠消息列隊中等待發(fā)送;發(fā)送函數(shù)周期性遍歷各個待發(fā)送消息列隊,將列隊中的消息進行封裝加上一個協(xié)議頭并調(diào)用UDP層的套接字sendmsg()函數(shù)發(fā)送;
協(xié)議有3個待發(fā)送消息列隊:待發(fā)送確認消息列隊、待發(fā)送可靠消息列隊和待發(fā)送不可靠消息列隊,這三個消息列隊用于存放待發(fā)送的確認消息、可靠消息和不可靠消息。消息封裝的規(guī)則如下:
1)、協(xié)議優(yōu)先查詢待發(fā)送確認消息列隊,如果待發(fā)送確認消息列隊不為空,則將列隊中的若干確認消息取出準備封裝。
2)、如果待發(fā)送確認消息列隊為空或者待發(fā)送確認消息列隊中的確認消息已取出準備封裝,則查詢待發(fā)送可靠消息列隊,并將該列隊中滿足發(fā)送條件的可靠消息取出準備封裝。
3)、最后查詢待發(fā)送不可靠消息列隊,將該列隊中滿足發(fā)送條件的不可靠消息取出封裝發(fā)送。
4)、如果封裝數(shù)據(jù)報中包含可靠消息,則在該協(xié)議頭添加一個時間戳選項。如果該封裝數(shù)據(jù)報中不含有可靠消息,則不需要添加時間戳選項,只需包含對等主機號即可。
接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的可靠數(shù)據(jù)報;然后根據(jù)數(shù)據(jù)報報頭中的對等主機號選擇相應(yīng)的對等主機進行處理;處理函數(shù)將已接收的可靠數(shù)據(jù)報根據(jù)可靠序列號按從小到大的順序進行排序并將排好序的數(shù)據(jù)報提交給上層應(yīng)用;然后根據(jù)接收數(shù)據(jù)報的可靠序列號創(chuàng)建一個確認消息,然后將該確認消息插入到待發(fā)送確認消息列隊中等待發(fā)送;
發(fā)送端每次接收到遠程主機發(fā)回的確認消息時,都根據(jù)確認消息中的已接收時間戳字段計算本次傳輸?shù)膶崟rRTT(Round Trip Time)值,并更新RTT平滑估計器的估計值R和RTT平滑估計器均值標準差D。然后將該確認消息中已接收可靠序列號指向的消息從已發(fā)送可靠消息列隊中移除,并釋放相應(yīng)的內(nèi)存資源;
協(xié)議周期性調(diào)用檢查超時函數(shù),當已發(fā)送可靠消息列隊中的消息經(jīng)過往返超時值還沒收到該消息的確認消息時,將該消息從已發(fā)送可靠消息列隊移至待發(fā)送可靠消息列隊的隊首進行重傳。超時重傳的策略為:首次超時的時間為:
RTO=R+4D
其中,R為RTT平滑估計器,D為RTT平滑估計器的均值標準差。平滑估計器R的計算式如下:
其中,加權(quán)因子β=5,M為實際測量的RTT值。平滑估計器R的均值標準差D的計算式如下:
D=D+h(|M-R|-D)
其中,增益因子h=0.25,M為實際測量的RTT值。
協(xié)議每次接收到來自遠程主機的ACK時,都計算本次傳輸?shù)腞TT值M。然后用該實際測量的RTT值M更新RTT平滑估計器及其均值標準差D。
首次重傳超時后,往返超時值RTO按照指數(shù)退避的方式遞增:
RTO=2*RTO
當往返超時值大于等于往返超時值的最大值時,往返超時值不再遞增,并按照該最大值重傳丟失的數(shù)據(jù)報。當經(jīng)過最大超時值還未收到該消息的確認消息時,則認為網(wǎng)絡(luò)斷開,執(zhí)行相應(yīng)的斷開連接操作;
可靠傳輸提供了一種基于帶寬估計的擁塞控制機制,該擁塞控制機制提供了一種估計當前網(wǎng)絡(luò)實際可用帶寬,并根據(jù)該估計值調(diào)整當前發(fā)送速率的功能。該帶寬估計方法是一種基于RUDP吞吐量的估計方法。該方法的思想是當網(wǎng)絡(luò)工作在飽和狀態(tài)下時,根據(jù)接收端的接收速率來估計鏈路的實際可用帶寬。具體為:接收端中保存有一個Data_Received的變量用于統(tǒng)計帶寬估計期間接收到的數(shù)據(jù)量。接收端每接收到一條可靠數(shù)據(jù)消息,都將Data_Received變量值和該消息長度相加并重新賦值。在帶寬估計期間,假設(shè)接收到第一條數(shù)據(jù)消息的時間為tk,接收到最后一條數(shù)據(jù)消息的時間為tk+1,則帶寬估計B為:
接收端周期性進行帶寬估計,并將帶寬估計值封裝在帶寬通知消息中發(fā)送給發(fā)送端。
發(fā)送端在接收到帶寬通知消息后,對帶寬通知消息中的帶寬估計值進行平滑估計,以減小鏈路抖動等因數(shù)對實際采樣帶寬值造成的影響:
Bavailable=αBavailable+(1-α)B
其中,α是平滑因子,Bavailable為實際可用帶寬的估計值。發(fā)送端每次接收到帶寬通知消息后,都用該帶寬通知消息中的帶寬估計值更新估計器Bavailable。
發(fā)送端保存一個發(fā)送窗口值Send_window用于控制網(wǎng)絡(luò)中實際傳輸?shù)臄?shù)據(jù)量,發(fā)送端還保存一個統(tǒng)計已發(fā)送未確認數(shù)據(jù)量的變量。每次發(fā)送可靠數(shù)據(jù)消息前,都將該變量與待發(fā)送消息的數(shù)據(jù)長度相加并判斷是否大于Send_window。如果大于,停止發(fā)送該可靠數(shù)據(jù)消息;如果小于,發(fā)送該消息并將相加值更新至該變量中。Send_window的初始值為W,每次當本地主機接收到遠程主機發(fā)來的ACK消息時:
Send_window+=WinC
WinC是一個窗口值常量。每當本地主機檢測到一個丟包時,如果
Bavailable*min{R}<Winmin:
Send_window=Winmin
否則:
Send_window=Bavailable*min{R}
其中,R是當前時刻鏈路的RTT估計值,Winmin是發(fā)送窗口最小值,min{R}表示沒有排隊時延的往返RTT值。
所述基于UDP的可靠傳輸協(xié)議的不可靠傳輸中,當本地主機需要發(fā)送不可靠數(shù)據(jù)報時,首先將待發(fā)送的數(shù)據(jù)報的相應(yīng)標志位設(shè)置為不可靠數(shù)據(jù)報;然后將該不可靠數(shù)據(jù)報插入到待發(fā)送不可靠消息列隊中等待發(fā)送;發(fā)送函數(shù)將各個待發(fā)送消息列隊中消息進行封裝(封裝規(guī)則如上所述)加上一個協(xié)議頭并調(diào)用UDP層的套接字sendmsg()函數(shù)發(fā)送;然后將該數(shù)據(jù)報從待發(fā)送不可靠消息列隊移至已發(fā)送不可靠消息列隊;再將該消息從已發(fā)消息列隊移除并釋放相應(yīng)的內(nèi)存資源;接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的不可靠數(shù)據(jù)報;并根據(jù)接收數(shù)據(jù)報頭中的對等主機號選擇相應(yīng)的對等主機進行處理;處理函數(shù)將已接收的不可靠數(shù)據(jù)報根據(jù)可靠序列號和不可靠序列號進行排序;最后將排好序的數(shù)據(jù)報提交給上層應(yīng)用。
不可靠數(shù)據(jù)報的排序規(guī)則如下:
①、首先根據(jù)可靠序列號按照從小到大的順序進行排序。
②、可靠序列號相同時,根據(jù)不可序列號按照從小到大的順序進行排序。
所述的基于UDP的可靠傳輸協(xié)議的亂序傳輸中,當本地主機需要發(fā)送亂序數(shù)據(jù)報時,首先將待發(fā)送數(shù)據(jù)報的相應(yīng)標志位設(shè)置為亂序數(shù)據(jù)報;然后將該亂序數(shù)據(jù)報插入到待發(fā)送不可靠消息列隊中等待發(fā)送;然后將各個待發(fā)送消息列隊中的消息進行封裝(封裝規(guī)則如上所述)加上一個協(xié)議頭并調(diào)用UDP層的套接字sendmsg()函數(shù)發(fā)送;接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的亂序數(shù)據(jù)報;然后根據(jù)接收數(shù)據(jù)報包頭的對等主機號選擇相應(yīng)的對等主機進行處理;處理函數(shù)將已接收的亂序數(shù)據(jù)報按照接收順序進行排序;最后將排好序的數(shù)據(jù)報提交給上層應(yīng)用。
在所述的基于UDP的可靠傳輸協(xié)議中,協(xié)議有規(guī)定的最大傳輸單元MTU值,當數(shù)據(jù)報(可靠數(shù)據(jù)報、不可靠數(shù)據(jù)報或亂序數(shù)據(jù)報)長度大于MTU時,則需要對數(shù)據(jù)報進行分片處理,接收端接收到該分片數(shù)據(jù)報時在接收端進行組包然后排序并提交給上層應(yīng)用。
本實施例的基于UDP的可靠傳輸方法是一種UDP層上的可靠傳輸協(xié)議。該可靠傳輸協(xié)議包括:可靠傳輸、不可靠傳輸和亂序傳輸。
所述協(xié)議的技術(shù)的主體構(gòu)架是C語言,C語言是一種易于移植的高級語言。
圖1是基于UDP的可靠傳輸協(xié)議的UDP/IP層級結(jié)構(gòu)?;赨DP的可靠傳輸協(xié)議的UDP/IP層級結(jié)構(gòu)由數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、UDP層、基于UDP的可靠傳輸層和應(yīng)用層組成。本發(fā)明是一種基于UDP的可靠傳輸層中的一種可靠傳輸協(xié)議。
圖2是可靠數(shù)據(jù)消息的結(jié)構(gòu)圖,可靠數(shù)據(jù)消息的第一個字節(jié)是消息類型,消息類型用于指示本條消息的類型;接著一個字節(jié)是信道號,信道號用于指定發(fā)送消息的信道;接著兩個字節(jié)是可靠序列號,可靠序列號用于對可靠消息的進行編序;接著兩個字節(jié)是數(shù)據(jù)長度,數(shù)據(jù)長度用于指示可靠數(shù)據(jù)消息包含的數(shù)據(jù)消息長度;緊接著就是可靠數(shù)據(jù)消息包含的數(shù)據(jù)消息。
圖3是不可靠數(shù)據(jù)消息的結(jié)構(gòu)圖,不可靠數(shù)據(jù)消息的第一個字節(jié)是消息類型,消息類型用于說明本條消息的類型;接著一個字節(jié)是信道號,信道號用于指定發(fā)送消息的信道;接著兩個字節(jié)是可靠序列號,可靠序列號用于對可靠消息進行編序;接著兩個字節(jié)是不可靠序列號,不可靠序列號用于對不可靠數(shù)據(jù)消息進行編序;接著兩個字節(jié)是數(shù)據(jù)長度,數(shù)據(jù)長度用于指示不可靠數(shù)據(jù)消息包含的數(shù)據(jù)消息長度;緊接著就是不可靠數(shù)據(jù)消息包含的數(shù)據(jù)消息。
圖4是亂序數(shù)據(jù)消息的結(jié)構(gòu)圖,亂序數(shù)據(jù)消息的結(jié)構(gòu)除亂序組值外與不可靠數(shù)據(jù)消息相同,亂序組值用于對亂序數(shù)據(jù)消息進行編序。
圖5是分片數(shù)據(jù)消息的結(jié)構(gòu)圖,分片數(shù)據(jù)消息的第一個字節(jié)是消息類型、第二個字節(jié)是信道號、第三、四字節(jié)是可靠序列號,其功能如上所述;接著兩個字節(jié)是起始序列號,起始序列號用于指示分片數(shù)據(jù)消息從哪一個序列號開始;接著兩個字節(jié)是數(shù)據(jù)長度,數(shù)據(jù)長度用于指示當前分片數(shù)據(jù)消息包含的數(shù)據(jù)消息長度;接著四個字節(jié)是分片數(shù),分片數(shù)用于指示原始數(shù)據(jù)包被分成多少個分片消息;接著四個字節(jié)是分片號,分片號用于對各個分片數(shù)據(jù)消息進行編號;接著是四個字節(jié)的數(shù)據(jù)總長度,數(shù)據(jù)總長度用于指示原始數(shù)據(jù)包的長度;接著4個字節(jié)是分片偏移量,分片偏移量用于指示當前分片數(shù)據(jù)消息處于未分片數(shù)據(jù)中的位置;緊接著就是分片數(shù)據(jù)消息包含的數(shù)據(jù)消息。
圖6是確認消息的結(jié)構(gòu)圖,確認消息包含一字節(jié)的消息類型、一字節(jié)的信道號、兩字節(jié)的可靠序列號、兩字節(jié)的已接收可靠序列號和兩字節(jié)的已接收時間戳。消息類型、信道號和可靠序列號的作用與上面的相同;已接收可靠序列號即待確認消息的可靠序列號;已接收時間戳即待確認消息的時間戳,該時間戳用于計算往返時間。
圖7是所述基于UDP的可靠傳輸協(xié)議的數(shù)據(jù)報封裝格式(包含可靠數(shù)據(jù)消息),前20個字節(jié)是IP首部;接著8個字節(jié)是UDP首部;接著4個字節(jié)是RUDP的協(xié)議頭;包含2字節(jié)的對等主機號和2字節(jié)的時間戳選項;只有當數(shù)據(jù)報中包含可靠數(shù)據(jù)消息時,數(shù)據(jù)報頭才包含時間戳。接著是若干個8字節(jié)確認消息;接著是若干個不定長度的可靠數(shù)據(jù)消息;接著是若干個不定長度的不可靠數(shù)據(jù)消息或者亂序數(shù)據(jù)消息。
圖8是所述基于UDP的可靠傳輸協(xié)議的數(shù)據(jù)報封裝格式(不包含可靠數(shù)據(jù)消息),前20個字節(jié)是IP首部;接著8個字節(jié)是UDP首部;接著2個字節(jié)是RUDP的協(xié)議頭,包含2字節(jié)的對等主機號;接著是若干個8字節(jié)確認消息;接著是若干個不定長度的可靠數(shù)據(jù)消息;接著是若干個不定長度的不可靠數(shù)據(jù)消息或者亂序數(shù)據(jù)消息。
所述基于UDP的可靠傳輸協(xié)議的可靠傳輸中,其總流程的步驟為:
9.1)當本地主機需要發(fā)送可靠數(shù)據(jù)報時,首先將待發(fā)送的數(shù)據(jù)報的相應(yīng)標志位設(shè)置為可靠數(shù)據(jù)報;
9.2)將該數(shù)據(jù)報插入到待發(fā)送可靠消息列隊中等待發(fā)送;
9.3)發(fā)送函數(shù)將各個待發(fā)送消息列隊中的消息組包加上一個協(xié)議頭并調(diào)用UDP層的sendmsg()函數(shù)發(fā)送;
9.4)接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的可靠數(shù)據(jù)報;
9.5)然后根據(jù)可靠數(shù)據(jù)報報頭的對等主機號選擇相應(yīng)的對等主機進行處理;
9.6)處理函數(shù)將已接收的可靠數(shù)據(jù)報根據(jù)可靠序列號按從小到大的順序進行排序并將排好序的數(shù)據(jù)報提交給上層應(yīng)用;
9.7)根據(jù)接收數(shù)據(jù)報的可靠序列號創(chuàng)建一個確認消息并將該確認消息插入到待發(fā)送確認消息列隊等待發(fā)送;
9.8)發(fā)送端每次接收到遠程主機發(fā)回的確認消息,都根據(jù)確認消息中的已接收時間戳字段計算本次傳輸?shù)膶崟rRTT值并更新RTT平滑估計器R和RTT平滑估計器標準差D。然后將確認消息指向的消息從已發(fā)送可靠消息列隊中移除并釋放相應(yīng)的內(nèi)存資源;
9.9)協(xié)議周期性調(diào)用檢查超時函數(shù),如果已發(fā)送列隊中的消息超時,則執(zhí)行相應(yīng)的重傳或者斷開連接操作;
所述的基于UDP的可靠傳輸協(xié)議的不可靠傳輸中,其總流程的步驟為:
10.1)當遠程主機需要發(fā)送不可靠數(shù)據(jù)報時,首先將待發(fā)送的數(shù)據(jù)報的相應(yīng)標志位設(shè)置為不可靠數(shù)據(jù)報;
10.2)將該數(shù)據(jù)報插入到待發(fā)送不可靠消息列隊中等待發(fā)送;
10.3)發(fā)送函數(shù)將各個待發(fā)送消息列隊中的消息組包加上一個協(xié)議頭并調(diào)用UDP層的sendmsg()函數(shù)發(fā)送;
10.4)接收端周期想調(diào)用接收函數(shù)接收來自各個遠程主機的不可靠數(shù)據(jù)報;
10.5)然后根據(jù)不可靠數(shù)據(jù)報報頭的對等主機號選擇相應(yīng)的對等主機進行處理;
10.6)處理函數(shù)將已接收的不可靠數(shù)據(jù)報根據(jù)可靠序列號和不可靠序列號進行排序并提交給上層應(yīng)用;
所述的基于UDP的可靠傳輸協(xié)議的亂序傳輸中,其總流程的步驟為:
11.1)當遠程主機需要發(fā)送亂序數(shù)據(jù)報時,首先將待發(fā)送的數(shù)據(jù)報的相應(yīng)標志位設(shè)置為亂序數(shù)據(jù)報;
11.2)將該數(shù)據(jù)報插入到待發(fā)送不可靠消息列隊中等待發(fā)送;
11.3)發(fā)送函數(shù)將各個待發(fā)送消息列隊中的消息組包加上一個協(xié)議頭并調(diào)用UDP層的sendmsg()函數(shù)發(fā)送;
11.4)接收端周期性調(diào)用接收函數(shù)接收來自各個遠程主機的亂序數(shù)據(jù)報;
11.5)然后根據(jù)亂序數(shù)據(jù)報報頭的對等主機號選擇相應(yīng)的對等主機進行處理;
11.6)處理函數(shù)將已接收的亂序數(shù)據(jù)報按照接收順序進行排序并提交給上層應(yīng)用;
圖9是基于UDP的可靠傳輸協(xié)議的OPNET仿真網(wǎng)絡(luò)模型,Client是一個RUDP主機,Server是一個RUDP服務(wù)器,IP Network是一個IP網(wǎng)絡(luò),鏈路模型為PPP-DS3(帶寬44.736Mbps),網(wǎng)絡(luò)的丟包率為0.01%,網(wǎng)絡(luò)延時服從Uniform(0.015,0.0175)(s)分布,圖10為鏈路的背景流量隨時間的關(guān)系圖。圖11為RUDP主機的發(fā)送速率隨時間的關(guān)系圖。圖12為RUDP主機對RUDP服務(wù)器下行帶寬的估計值隨時間的關(guān)系圖。圖13為RUDP服務(wù)器的接收速率(下行帶寬)隨時間的關(guān)系圖。圖14為RUDP主機的發(fā)送窗口值隨時間的關(guān)系圖。
通過分析圖10、圖11、圖12、圖13和圖14可以得出,本發(fā)明所提供的基于UDP的可靠傳輸協(xié)議:
13.1)可以較為精確地估計RUDP服務(wù)器的下行帶寬;
13.2)可以根據(jù)下行帶寬估計值實時調(diào)整RUDP主機的發(fā)送窗口值,在網(wǎng)絡(luò)背景流比較大時,減小發(fā)送窗口值,降低發(fā)送速率;在網(wǎng)絡(luò)背景流比較小時,增加發(fā)送窗口,增加發(fā)送速率;
13.3)可以將RUDP主機的發(fā)送速率鎖定為RUDP服務(wù)器的實際下行帶寬值,避免擁塞并提高網(wǎng)絡(luò)的吞吐量。