UDP之極速平滑可靠傳輸的實現

2021-06-20 15:47:20 字數 1341 閱讀 8597

今天心血來潮,想寫點東西,反哺一下。該文是我的**作,是我幾年前優化udp網路傳輸時的所得。

大家都知道,udp傳輸一般都是不斷地、迴圈地取資料,然後傳送,這就會造成了兩個問題,第一:資料傳送一窩蜂,如此,若網路頻寬不夠,則丟包,而要是對端接收處理不過來,則造成資料人為性丟失;第二:網路得不到充分的利用,有資料時一窩蜂,取資料時閒置等待。第一點應該很多人感同身受,深受其害,經常有人在論壇裡丟擲這個問題。而第二點,留意的人可能就不多了。一窩蜂的擁擠,必然會導致無資料的空閒,這個在抓包下就會露出原型。有時一秒鐘內,前100毫秒在拼命地擠著往外跑,剩下900毫秒在等待新資料。如果你遇到這個問題了,那就接著往下看......

udp是不可靠傳輸,因此要實現可靠傳輸,必須有丟失重傳機制,因此,在接收端就得在接收到資料後,把資料頭返回,我們把它稱為確認 ack,而傳送端接收到這個確認,才釋放資料記憶體,如果在規定時間內未接收到確認,則重傳。如此,重傳就實現了,現在開始使其極速平滑傳輸。

極速與平滑:傳輸速度取決於兩個方面,乙個是傳輸資料的長度,另乙個是傳送的頻率。因此為了達到極速,我們就得從資料傳輸長度與傳送頻率來著手;而平滑,則是控制傳送,使資料傳送不至於一窩蜂,這個也是要在控制傳送頻率來著手。

我們需要兩組丟包率閥值。

第一組packet_len_rate_min與packet_len_rate_max,用於判斷傳送資料報包長與丟包率的關係,這個關係,是由路徑最小mtu引起的。在丟包率小於packet_len_rate_min時,我們增加包長,當丟包率大於packet_len_rate_max時我們減短包長度。當然包長度不小於576,不大於1500。而這個丟包率計算方法是:在單位時間內,丟失的包佔總發包數的百分比。這樣就實現了從資料報長度方面來動態調節傳送速度。

第二組packet_send_rate_min與packet_send_rate_max,該組用於調控傳送頻率,使之實現極速與平滑。我們先來說下資料塊的讀取與傳送,我們從源資料a上每次獲取一等塊資料,然後把資料放入到傳送佇列b裡面,我們的傳送執行緒再在b裡獲取資料並傳送出去,然後等待,一直等待到接收到返回確認後,再去從資料來源a讀取資料,然後放入到傳送佇列b裡。如此這般,一直迴圈。現在好了資料可以傳送了,但速度不快,沒關係,我們用手給它撥動下:在每接收到返回確認後,我們從源資料a裡面讀取兩份資料,放入到傳送佇列b裡面,由此,1變2,2變4,4變8......傳送的速度是越來越快。但傳送速度太快可能會頻寬不夠,或對端處理能力不足而丟包,此時,packet_send_rate_min與packet_send_rate_max就用上了。在變變變之後,當丟包率達到packet_send_rate_min時停止增速,而當大於packet_send_rate_max時,降低從資料來源數獲取的資料塊數。

這樣實現的傳送頻率非常均勻,而且在傳送資料的時候,傳輸速度是由慢變快,自適應變化,達到極速。

UDP實現可靠傳輸

如何讓udp實現可靠傳輸 自定義通訊協議,在應用層定義一些可靠的協議,比如檢測包的順序,重複包等問題,如果沒有收到對方的ack,重新發包 udp沒有delievery garuantee,也沒有順序保證,所以如果你要求你的資料傳送與接受既要高效,又要保證有序,收包確認等,你就需要在udp協議上構建自...

怎樣實現UDP可靠傳輸

相對於tcp,由於udp是面向無連線 不可靠的傳輸協議。如果我們要用udp去實現可靠的傳輸,則需要解決兩個問題 丟包和後發先至 包的順序 解決方法 1 給資料報編號,按照包的順序接收並儲存 2 接收端接收到資料報後傳送確認資訊給傳送端,傳送端接收確認資料以後再繼續傳送下乙個包,如果接收端收到的資料報...

如何實現udp的可靠傳輸

傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現了。實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。最簡單的方式是在應用層模仿傳輸層tcp的可靠性傳輸。下面不考慮擁塞處理,可靠udp的簡單設計。1 新增seq ack機制,確保資料傳送到對端 2 新增傳送和接收緩衝...