最近和很多實時音視頻領(lǐng)域的朋友交流中都有談論到RUDP(Reliable UDP),這其實是個老生常談的問題,RUDP在很多著名的項目上都有使用,例如google的QUIC和webRTC。在UDP之上做一層可靠,很多朋友認為這是很不靠譜的事情,也有朋友認為這是一個大殺器,可以解決實時領(lǐng)域里大部分問題。作為在教育公司來說,學霸君在很多實時場景下確實使用RUDP技術(shù)來解決我們的問題,不同場景我們采用的RUDP方式也不一樣。先來看看學霸君哪些場景使用了RUDP:
1) 全局250毫秒延遲的實時1V1答疑,采用的是RUDP + 多點relay智能路由方案。
2) 500毫秒1080P視頻連麥互動系統(tǒng),采用的是RUDP + PROXY調(diào)度傳輸方案。
3) 6方實時同步書寫系統(tǒng),采用的是RUDP+redo log的可靠傳輸技術(shù)。
4) 弱網(wǎng)WIFI下Pad的720P同屏傳輸系統(tǒng),采用的是RUDP +GCC實時流控技術(shù)。
5) 大型直播的P2P分發(fā)系統(tǒng),通過RUDP + 多點并聯(lián)relay技術(shù)節(jié)省了75%以上的分發(fā)帶寬。
涉及到實時傳輸我們都會先考慮RUDP,RUDP應用在學霸君核心傳輸體系的各個方面,但不同的系統(tǒng)場景我們設(shè)計了不同的RUDP方式,所以基于那些激烈的討論和我們使用的經(jīng)驗我扒一扒RUDP。其實在實時通信領(lǐng)域存在一個三角平衡關(guān)系:成本,質(zhì)量,時延三者的制約關(guān)系(圖1)
圖1
也就是說投入的成本、獲得的質(zhì)量和通信的時延之間是一個三角制約(LEQ)關(guān)系,所以實時通信系統(tǒng)的設(shè)計者會在這三個制約條件下找到一個平衡點,TCP屬于是通過增大延遲和傳輸成本來保證質(zhì)量的通信方式,UDP是通過犧牲質(zhì)量來保證時延和成本的通信方式,所以在一些特定場景下RUDP更容易找到這樣的平衡點。RUDP是怎么去找這個平衡點的,就要先從RUDP的可靠概念和使用場景來分析。
可靠的概念
在實時通信過程中,不同的需求場景對可靠的需求是不一樣的,我們在這里總體歸納為三類定義:
盡力可靠:通信的接收方要求發(fā)送方的數(shù)據(jù)盡量完整到達,但業(yè)務本身的數(shù)據(jù)是可以允許缺失的。例如:音視頻數(shù)據(jù)、冪等性狀態(tài)數(shù)據(jù)。
無序可靠:通信的接收方要求發(fā)送方的數(shù)據(jù)必須完整到達,但可以不管到達先后順序。例如:文件傳輸、白板書寫、圖形實時繪制數(shù)據(jù)、日志型追加數(shù)據(jù)等。
有序可靠:通信接收方要求發(fā)送方的數(shù)據(jù)必須按順序完整到達。
RUDP是根據(jù)這三類需求和圖1的三角制約關(guān)系來確定自己的通信模型和機制的,也就是找通信的平衡點。
UDP為什么要可靠
說到這里可能很多人會說:干嘛那么麻煩,直接用TCP好了!確實很多人也都是這樣做的,TCP是個基于公平性的可靠通信協(xié)議,在一些苛刻的網(wǎng)絡(luò)條件下TCP要么不能提供正常的通信質(zhì)量保證,要么成本過高。為什么要在UDP之上做可靠保證,究其原因就是在保證通信的時延和質(zhì)量的條件下盡量降低成本,RUDP主要解決以下相關(guān)問題:
端對端連通性問題:一般終端直接和終端通信都會涉及到NAT穿越,TCP在NAT穿越實現(xiàn)非常困難,相對來說UDP穿越NAT卻簡單很多,如果是端到端的可靠通信一般用RUDP方式來解決,場景有:端到端的文件傳輸、音視頻傳輸、交互指令傳輸?shù)鹊取?/p>
弱網(wǎng)環(huán)境傳輸問題:在一些WIFI或者3G/4G移動網(wǎng)下,需要做低延遲可靠通信,如果用TCP通信延遲可能會非常大,這會影響用戶體驗。例如:實時的操作類網(wǎng)游通信、語音對話、多方白板書寫等,這些場景可以采用特殊的RUDP方式來解決這類問題。
帶寬競爭問題:有時候客戶端數(shù)據(jù)上傳需要突破本身TCP公平性的限制來達到高速低延時和穩(wěn)定,也就是說要用特殊的流控算法來壓榨客戶端上傳帶寬,例如:直播音視頻推流,這類場景用RUDP來實現(xiàn)不僅能壓榨帶寬,也能更好的增加通信的穩(wěn)定性,避免類似TCP的頻繁斷開重連。
傳輸路徑優(yōu)化問題:在一些對延時要求很高的場景下,會用應用層relay的方式來做傳輸路由優(yōu)化,也就是動態(tài)智能選路,這時雙方采用RUDP方式來傳輸,中間的延遲進行relay選路優(yōu)化延時。還有一類基于傳輸吞吐量的場景,例如:服務與服務之間數(shù)據(jù)分發(fā)、數(shù)據(jù)備份等,這類場景一般會采用多點并聯(lián)relay來提高傳輸?shù)乃俣?,也是要建立在RUDP上的(這兩點在后面著重來描述)。
資源優(yōu)化問題:某些場景為了避免TCP的三次握手和四次揮手的過程,會采用RUDP來優(yōu)化資源的占用率和響應時間,提高系統(tǒng)的并發(fā)能,例如:QUIC.
不管哪類場景,都是要保證可靠性,也就是質(zhì)量,那么在UDP之上怎么實現(xiàn)可靠呢?答案就是重傳。
重傳模式
IP協(xié)議在設(shè)計的時候就不是為了數(shù)據(jù)可靠到達而設(shè)計的,所以UDP要保證可靠,就依賴于重傳,這也就是我們通常意義上的RUDP行為,在描述RUDP重傳之前先來了解下RUDP基本框架,如圖:
圖2
RUDP在分為發(fā)送端和接收端,每一種RUDP在設(shè)計的時候會做不一樣的選擇和精簡,概括起來就是圖中的單元。RUDP的重傳是發(fā)送端通過接收端ACK的丟包信息反饋來進行數(shù)據(jù)重傳,發(fā)送端會根據(jù)場景來設(shè)計自己的重傳方式,重傳方式分為三類:定時重傳,請求重傳和FEC選擇重傳。
定時重傳
定時重傳很好理解,就是發(fā)送端如果在發(fā)出數(shù)據(jù)包(T1)時刻一個RTO之后還未收到這個數(shù)據(jù)包的ACK消息,那么發(fā)送就重傳這個數(shù)據(jù)包。這種方式依賴于接收端的ACK和RTO,容易產(chǎn)生誤判,主要有兩種情況:
對方收到了數(shù)據(jù)包,但是ACK發(fā)送途中丟失。
ACK在途中,但是發(fā)送端的時間已經(jīng)超過了一個RTO。
所以超時重傳的方式主要集中在RTO的計算上,如果你的場景是一個對延遲敏感但對流量成本要求不高的場景,就可以將RTO的計算設(shè)計比較小,這樣能盡最大可能保證你的延時足夠小。例如:實時操作類網(wǎng)游、教育領(lǐng)域的書寫同步,是典型的用expense換latency和Quality的場景,適合用于小帶寬低延遲傳輸。如果是大帶寬實時傳輸,定時重傳對帶寬的消耗是很大的,極端情況會用20%的重復重傳率,所以在大帶寬模式下一般會采用請求重傳模式。
請求重傳
請求重傳就是接收端在發(fā)送ACK的時候攜帶自己丟失報文的信息反饋,發(fā)送端接收到ACK信息時根據(jù)丟包反饋進行報文重傳。如下圖:
圖3
這個反饋過程最關(guān)鍵的步驟就是回送ACK的時候應該攜帶哪些丟失報文的信息,因為UDP在網(wǎng)絡(luò)傳輸過程中會亂序會抖動,接收端在通信的過程中要評估網(wǎng)絡(luò)的jitter time,也就是rtt_var(RTT方差值),當發(fā)現(xiàn)丟包的時候記錄一個時刻t1,當t1 + rtt_var < curr_t(當前時刻),我們就認為它丟失了,這個時候后續(xù)的ACK就需要攜帶這個丟包信息并更新丟包時刻t2,后續(xù)持續(xù)掃描丟包隊列,如果他t2 + RTO<curr_t,再次在ACK攜帶這個丟包信息,以此類推,直到收到報文為止。這種方式是由丟包請求引起的重發(fā),如果網(wǎng)絡(luò)很不好,接收端會不斷發(fā)起重傳請求,造成發(fā)送端不停的重傳,引起網(wǎng)絡(luò)風暴,通信質(zhì)量會下降,所以我們在發(fā)送端設(shè)計一個擁塞控制模塊來限流,這個后面我們重點分析。除了網(wǎng)絡(luò)風暴以外,整個請求重傳機制也依賴于jitter time和RTO這個兩個時間參數(shù),評估和調(diào)整這兩個參數(shù)和對應的傳輸場景也息息相關(guān)。請求重傳這種方式比定時重傳方式的延遲會大,一般適合于帶寬較大的傳輸場景,例如:視頻、文件傳輸、數(shù)據(jù)同步等。
FEC選擇重傳
除了定時重傳和請求重傳模式以外,還有一種方式就是以FEC分組方式選擇重傳,F(xiàn)EC(Forward Error Correction)是一種前向糾錯技術(shù),一般是通過XOR類似的算法來實現(xiàn),也有多層的EC算法和raptor涌泉碼技術(shù),其實是一個解方程的過程。應用到RUDP上示意圖如下:
圖4
在發(fā)送方發(fā)送報文的時候,會根據(jù)FEC方式把幾個報文進行FEC分組,通過XOR的方式得到若干個冗余包,然后一起發(fā)往接收端,如果接收端發(fā)現(xiàn)丟包但能通過FEC分組算法還原,就不向發(fā)送端請求重傳,如果分組內(nèi)包是不能進行FEC恢復的,就請求想發(fā)送端請求原始的數(shù)據(jù)包。FEC分組方式適合解決要求延時敏感且隨機丟包的傳輸場景,在一個帶寬不是很充裕的傳輸條件下,F(xiàn)EC會增加多余的冗余包,可能會使得網(wǎng)絡(luò)更加不好。FEC方式不僅可以配合請求重傳模式,也可以配合定時重傳模式。
RTT與RTO的計算
在上面介紹重傳模式時多次提到RTT、RTO等時間度量闡述,RTT(Round Trip Time)即網(wǎng)絡(luò)環(huán)路延時,環(huán)路延遲是通過發(fā)送的數(shù)據(jù)包和接收到的ACK包計算了,示意圖如下:
圖5
RTT = T2 - T1
這個計算方式只是計算了某一個報文時刻的RTT,但網(wǎng)絡(luò)是會波動的,這難免會有噪聲現(xiàn)象,所以在計算的過程中引入了加權(quán)平均收斂的方法(具體可以參考RFC793)
SRTT = (α * SRTT) + (1-α)RTT
這樣可以求得新逼近的SRTT,在公式總一般α=0.8,確定了SRTT,下一步就是計算RTT_VAR(方差),我們設(shè)RTT_VAR = |SRTT – RTT|
那么SRTT_VAR =(α * SRTT_VAR) + (1-α) RTT_VAR
這樣可以得到RTT_VAR的值,但最終我們是需要去頂RTO,因為涉及到報文重傳,RTO就是一個報文的重傳周期,從網(wǎng)絡(luò)的通信流程我們很容易知道,重傳一個包以后,如果一個RTT+RTT_VAR之后的時間還沒收到確定,那我們就可以再次重傳,則可知:
RTO = SRTT + SRTT_VAR
但一般網(wǎng)絡(luò)在嚴重抖動的情況下還是會有較大的重復率問題,所以:
RTO = β*(SRTT + RTT_VAR)
1.2 <β<2.0,可以根據(jù)不同的傳輸場景來選擇β的值。
RUDP是通過重傳來保證可靠的,重傳在三角平衡關(guān)系中其實是用Expense和latency來換取Quality的行為,所以重傳會引來兩個問題,一個是延時,一個是重傳的帶寬,尤其是后者,如果控制不好會引來網(wǎng)絡(luò)風暴,所以在發(fā)送端會設(shè)計一個窗口擁塞機制了避免并發(fā)帶寬占用過高的問題。
窗口與擁塞控制
窗口
RUDP需要一個收發(fā)的滑動窗口系統(tǒng)來配合對應的擁塞算法來做流量控制,有些RUDP需要嚴格的發(fā)送端和接收端的窗口對應,有些RUDP是不要收發(fā)窗口嚴格對應。如果涉及到可靠有序的RUDP,接收端就要做窗口就要做排序和緩沖,如果是無序可靠或者盡力可靠的場景,接收端一般就不做窗口緩沖,只做位置滑動。先來看收發(fā)窗口關(guān)系圖:
圖6
上圖描述的是發(fā)送端從發(fā)送窗口中發(fā)了6個數(shù)據(jù)報文給接收端,接收端收到101,102,103,106時會先判斷報文的連續(xù)性并滑動窗口開始位置到103,,然后每個包都回應ACK,發(fā)送端在接收到ACK的時候,會確認報文的連續(xù)性,并滑動窗口到103,發(fā)送端會再判斷窗口的空余,然后填補新的發(fā)送數(shù)據(jù),這就是整個窗口滑動的流程。這里值的一提的是在接收端收到106時的處理,如果是有序可靠,那么106不會通知上層業(yè)務進行處理,而是等待104,105。如果是盡力可靠和無序可靠場景,會將106通知給上層業(yè)務先進行處理。在收到ACK后,發(fā)送端的窗口要滑動多少是由自己的擁塞機制定的,也就是說窗口的滑動速度受擁塞機制控制,擁塞控制實現(xiàn)要么基于丟包率來實現(xiàn),要么基于雙方的通信時延來實現(xiàn),下面來看幾種典型的擁塞控制。
經(jīng)典擁塞算法
TCP經(jīng)典擁塞算法分為四個部分:慢啟動、擁塞避免、擁塞處理和快速恢復,這四個部分都是為了決定發(fā)送窗和發(fā)送速度而設(shè)計的,其實就是為了在當前網(wǎng)絡(luò)條件下通過網(wǎng)絡(luò)丟包來判斷網(wǎng)絡(luò)擁塞狀態(tài),從而確定比較適合的發(fā)送傳輸窗口。經(jīng)典算法是建立在定時重傳的基礎(chǔ)上的,如果RUDP采用這種算法來做擁塞控制,一般的場景是為了保證有序可靠傳輸?shù)耐瑫r又兼顧網(wǎng)絡(luò)傳輸?shù)墓叫栽瓌t。先逐個來解釋下這幾部分
慢啟動(slow start)
當連接鏈路剛剛建立后,不可能一開始將cwnd設(shè)置的很大,這樣容易造成大量重傳,經(jīng)典擁塞里面會在開始將cwnd = 1,讓后根據(jù)通信過程的丟包來逐步擴大cwnd來適應當前的網(wǎng)絡(luò)狀態(tài),直到達到慢啟動的門限閾值(ssthresh),步驟如下:
1) 初始化設(shè)置cwnd = 1,并開始傳輸數(shù)據(jù)
2) 收到回饋的ACK,會將cwnd 加1
3) 當一個發(fā)送端一個RTT后且未發(fā)現(xiàn)有丟包重傳,就會將cwnd = cwnd * 2.
4) 當cwnd >= ssthresh或發(fā)生丟包重傳時慢啟動結(jié)束,進入擁塞避免狀態(tài)。
擁塞避免
當通信連接結(jié)束慢啟動后,有可能還未到網(wǎng)絡(luò)傳輸速度的上線,這個時候需要進一步通過一個緩慢的調(diào)節(jié)過程來進行適配。一般是一個RTT后如果未發(fā)現(xiàn)丟包,就是將cwnd = cwnd + 1。一但發(fā)現(xiàn)丟包和超時重傳,就進入擁塞處理狀態(tài)。
擁塞處理
擁塞處理在TCP里面實現(xiàn)很暴力,如果發(fā)生丟包重傳,直接將cwnd = cwnd / 2,然后進入快速恢復狀態(tài)。
快速恢復
快速恢復是通過確認丟包只發(fā)生在窗口一個位置的包上來確定是否進行快速恢復,如圖6中描述,如果只是104發(fā)生了丟失,而105,106是收到了的,那么ACK總是會將ack的base = 103,如果連續(xù)3次收到base為103的ACK,就進行快速恢復,也就是將并立即重傳104,而后如果收到新的ACK且base > 103,將cwnd = cwnd + 1,并進入擁塞避免狀態(tài)。
經(jīng)典擁塞控制是基于丟包檢測和定時重傳模式來設(shè)計的,在三角平衡關(guān)系中是一個典型的以Latency換取Quality的案例,但由于其公平性設(shè)計避免了過高的Expense,也就會讓這種傳輸方式很難壓榨網(wǎng)絡(luò)帶寬,很難保證網(wǎng)絡(luò)的大吞吐量和小時延。
BRR擁塞算法
對于經(jīng)典擁塞算法的延遲和帶寬壓榨問題google設(shè)計了基于發(fā)送端延遲和帶寬評估的BBR擁塞控制算法。這種擁塞算法致力于解決兩個問題:
1. 在一定丟包率網(wǎng)絡(luò)傳輸鏈路上充分利用帶寬
2. 降低網(wǎng)絡(luò)傳輸中的buffer延遲
BBR的主要策略是就是周期性通過ACK和NACK返回來評估鏈路的min_rtt和max_bandwidth。最大吞吐量(cwnd)的大小就是:
cwnd = max_bandwidth / min_rtt
傳輸模型如下:
圖7
BBR整個擁塞控制是一個探測帶寬和Pacing rate的狀態(tài),有是個狀態(tài):
Startup:啟動狀態(tài)(相當于慢啟動),增益參數(shù)為max_gain = 2.85
PROBE_BW:帶寬評估狀態(tài),通過一個較小的BBR增益參數(shù)來遞增(1.25)或者遞減(0.75).
PROBE_RTT:延遲評估狀態(tài),通過維持一個最小發(fā)送窗口(4個MSS)進行的RTT采樣。
那么這幾種狀態(tài)是怎么且來回切換的呢?以下是QUIC中BBR大致的步驟如下:
1) 初始化連接時會將設(shè)置一個初始的cwnd = 8, 并將狀態(tài)設(shè)置Startup
2) 在Startup下發(fā)送數(shù)據(jù),根據(jù)ACK數(shù)據(jù)的采樣周期性判斷是否可以增加帶寬,如果可以,將cwnd = cwnd *max_gain。如果時間周期數(shù)超過了預設(shè)的啟動周期時間或者發(fā)生了丟包,進行DRAIN狀態(tài)
3) 在DRAIN狀態(tài)下,如果flight_size(發(fā)送出去但還未確認的數(shù)據(jù)大小) >cwnd,繼續(xù)保證DRAIN狀態(tài),如果flight_size<cwd,進入PROBE_BW狀態(tài)
4) 在PROBE_BW狀態(tài)下,如果未發(fā)生丟包且flight_size<cwnd * 1.25,將維持原來的cwnd,并進入StartUp,如果發(fā)生丟包或者flight_size > cwnd,將cwnd = cwnd * 1.25,如果發(fā)生丟包,cwnd = cwnd * .075
5) 在Startup/DRAIN/PROBE_BW三個狀態(tài)中,如果持續(xù)10秒鐘的通信中沒有出現(xiàn)RTT <= min_rtt,就會進入到PROBE_RTT狀態(tài),并將cwnd = 4 *MSS
6) 在PROBE_RTT狀態(tài),會在收到ACK返回的時候持續(xù)判斷flight_size >= cwnd并且無丟包,將本次統(tǒng)計的最小RTT作為min_rtt,進入Startup狀態(tài)。
BBR是通過以上幾個步驟來周期性計算cwnd,也就是網(wǎng)絡(luò)最大吞吐量和最小延遲,然后通過pacing rate來確定這一時刻發(fā)送端的碼率,最終達到擁塞控制的目的。BBR適合在隨機丟包且網(wǎng)絡(luò)穩(wěn)定的情況下做擁塞,如果在網(wǎng)絡(luò)信號極不穩(wěn)定的WIFI或者4G上,容易出現(xiàn)網(wǎng)絡(luò)泛洪和預測不準的問題,BBR在多連接公平性上也存在小RTT的連接比大RTT的連接更吃帶寬的情況,容易造成大RTT的連接速度過慢的情況。BBR擁塞算法在三角平衡關(guān)系中是采用Expense換取latency和Quality的案例。
webRTC gcc
說到音視頻傳輸就必然會想到webRTC系統(tǒng),在webRTC中對于視頻傳輸也實現(xiàn)了一個擁塞控制算法(gcc),webRTC的gcc是一個基于發(fā)送端丟包率和接收端延遲帶寬統(tǒng)計的擁塞控制,而且是一個盡力可靠的傳輸算法,在傳輸?shù)倪^程中如果一個報文重發(fā)太多次后會直接丟棄,這符合視頻傳輸?shù)膱鼍埃栌脀eizhenwei同學一張圖來看個究竟:
圖8
gcc的發(fā)送端會根據(jù)丟包率和一個對照表來pacing rate,當loss < 2%時,會加大傳輸帶寬,當loss >=2% &&loss
gcc的接收端是根據(jù)數(shù)據(jù)到達的延遲方差和大小進行KalmanFilter進行帶寬逼近收斂,具體的細節(jié)不介紹了,請查看http://www.jianshu.com/p/bb34995c549a
這里值得一說的是gcc引入接收端對帶寬進行KalmanFilter評估是一個非常新穎的擁塞控制思路,如果實現(xiàn)一個盡力可靠的RUDP傳輸系統(tǒng)不失為是一個很好的參考。但這種算法也有個缺陷,就是在網(wǎng)絡(luò)間歇性丟包情況下,gcc可能收斂的速度比較慢,在一定程度上有可能會造成REMB很難反饋給發(fā)送端,容易出現(xiàn)發(fā)送端流控失效。gcc在三角平衡關(guān)系算一個以Quality和Expense換取latency的案例。
弱窗口擁塞機制
其實在很多場景是不用擁塞控制或者只要很弱的擁塞控制即可,例如:師生雙方書寫同步、實時游戲,因為本身的傳輸?shù)臄?shù)據(jù)量不大,只要保證足夠小的延時和可靠性就行,一般會采用固定窗口大小來進行流控,我們在系統(tǒng)中一般采用一個cwnd =32這樣的窗口來做流控,ACK確認也是通過整個接收窗口數(shù)據(jù)狀態(tài)反饋給發(fā)送方,簡單直接,也很容易適應弱網(wǎng)環(huán)境。
傳輸路徑
RUDP除了優(yōu)化連接、壓榨帶寬、適應弱網(wǎng)環(huán)境等以外,它也繼承了UDP天然的動態(tài)性,可以在中間應用層鏈路上做傳輸優(yōu)化,一般分為多點串聯(lián)優(yōu)化和多點并聯(lián)優(yōu)化。我們具體來說一說。
多點串聯(lián)relay
在實時通信中一些對業(yè)務場景對延遲非常敏感,例如:實時語音、同步書寫、實時互動、直播連麥等,如果單純的服務中轉(zhuǎn)或者P2P通信,很難無法滿足其需求,尤其是在物理距離很大的情況下。在解決這個問題上SKYPE率先提出全球RTN(實時多點傳輸網(wǎng)絡(luò)),其實就是在通信雙方之間通過幾個relay節(jié)點來動態(tài)智能選路,這種傳輸方式很適合RUDP,我們只要在通信雙方構(gòu)建一個RUDP通道,中間鏈路只是一個無狀態(tài)的relay cache集合,relay與relay之間進行路由探測和選路,以此來做到鏈路的高可用和實時性。如下圖:
圖9
通過多點relay來保證rudp進行傳輸優(yōu)化,這類場景在三角平衡關(guān)系里是典型的用expense來換取latency的案例。
多點并聯(lián)relay
在服務與服務進行媒體數(shù)據(jù)傳輸或者分發(fā)過程中,需要保證傳輸路徑高可用和提高帶寬并發(fā),這類使用場景也會使用傳輸雙方構(gòu)建一個RUDP通道,中間通過多relay節(jié)點的并聯(lián)來解決,如下圖所示:
圖10
這種模型需要在發(fā)送端設(shè)計一個多點路由表探測機制,以此來判斷各個路徑同時發(fā)送數(shù)據(jù)的比例和可以用性,這個模型除了鏈路備份和增大傳輸并發(fā)帶寬外,還有個輔助的功能,如果是流媒體分發(fā)系統(tǒng),我們一般會用BGP來做中轉(zhuǎn),如果節(jié)點與節(jié)點之間可以直連,這樣還可以減少對BGP帶寬的占用,以此來減少成本問題。
后記
到這里RUDP的介紹也就結(jié)束了,說了些細節(jié)和場景相關(guān)的事,也算是個入門級的科普文章。RUDP的概念從提出到現(xiàn)在也差不多有20年了,很多從業(yè)人員這希望通過一套完善的方案來設(shè)計一個通用的RUDP,我個人覺得這不太可能,就算設(shè)計出來了,估計和現(xiàn)在TCP差不多,這樣做的意義不大。RUDP的價值在于根據(jù)不同的傳輸場景進行不同的技術(shù)選型,可能選擇寬松的擁塞方式、也可能選擇特定的重傳模式,但不管怎么選,都是基于Expense(成本)、Latency(時延)、Quality(質(zhì)量)三者之間來權(quán)衡,通過結(jié)合場景和權(quán)衡三角平衡關(guān)系RUDP或許能幫助開發(fā)者找到一個比較好的方案。
袁榮喜:學霸君資深架構(gòu)師,16年C程序員,Golang愛好者
- QQ:61149512