天天看點

談談網絡通信中的流量整形

前面的兩篇文章《談談網絡通信中的 ACK、NACK 和 REX》和《談談網絡通信中的 FEC 基礎》介紹了網絡通信中的丢包重傳和 FEC 的相關理論和方法,他們都是在網絡發生丢包的情況下的補救措施,本文則往前進一步,介紹下如何通過流量整形技術,盡可能地避免網絡發生丢包。

從堵車說起

談談網絡通信中的流量整形

堵車的原因有很多種,我們先聊聊圖中的這種:假設某公路是 3 股道,也就是說,每時刻能同時進入該公路的車輛并行是 3 輛,那麼,如果某一時間段,同時試圖進入該公路的車輛超過 3 輛,則必然會出現由于公路的承載能力不夠帶來的 “堵車”。

談談網絡通信中的流量整形

網絡傳輸也類似,假設網絡帶寬是 2Mbps,如果在每秒硬塞給網絡的資料包 > 2Mbps,網絡通道也會受不了。不過它的表現形式與公路不一樣的地方在于:超出網絡承載能力的資料包,可能會被網卡/路由器/交換機給丢掉,即我們常說的丢包(loss)。

對于網絡傳輸而言,丢包帶來的成本是很高的,因為一些重要的資料包丢失後,是需要 “重傳” 的,而 “重傳” 太多,來回反複會增加了資料傳輸的延時,也會進一步惡化網絡負荷,最終極大地降低了傳輸的效率。

是以,我們需要從根本上盡可能地減少 “丢包” 的産生,簡單來說,就是控制機關時間内送入網絡傳輸的資料量,盡量平滑且不要超過網絡帶寬承載能力。

控制對象

既然要控制送入網絡傳輸的資料量,就得先找到資料是怎麼産生的,又是在通過哪個環節送入到網絡的。

談談網絡通信中的流量整形

如圖,音視訊傳輸的資料 “源頭” ,無外乎就是本地的音視訊檔案、麥克風采集的音頻流、攝像頭采集的視訊流、桌面采集到的螢幕流等,它們經過編碼壓縮和封包處理,然後經過 “發送子產品” 送入到網絡中。

設定和修改采集的配置(如:分辨率、幀率)、編碼器的配置(如:GOP 間隔、碼率)等,是可以減少實時産生的總資料量的,但是資料的産生并不是 “平滑” 的,特别是視訊流/螢幕流,畫面的突變,會帶來資料量的突變,是以,送入到 “發送子產品” 的資料量,也并不會總是 “平滑” 的。

從上面的 “堵車” 理論,為了避免丢包,我們需要盡可能地将資料 “平滑” 地送入網絡中,是以,“流量整形” 在此派上了用場,它作用于 “發送子產品”,目标是調整資料傳輸的平均速率,防止突發性的流量暴增導緻網絡擁塞和丢包。

流量整形

如何平輸入和輸出,一個最容易想到方法,就是增加 “緩沖”,讓輸入的資料先進入 “緩沖區” ,然後用恒定的 “速率” 從緩沖區取資料輸出。這種方法稱之為 “漏桶算法”。

漏桶算法(Leaky Bucket)

談談網絡通信中的流量整形

如圖,使用一個 packet buffer(漏桶),把所有輸入的 packet 緩存起來。

設定一個目标的輸出碼率(比如:3Mbps),固定的時間間隔(比如:10ms),讀取 packet buffer(漏桶)中固定數量的 packet(如:3Mbit * 10ms / 1000 = 0.03Mbit)進行網絡發送。注:如果某時刻緩沖區沒有資料,則不用發送了。

漏桶算法的缺點

漏桶算法有一個明顯的缺點,因為非常精準的網絡帶寬無法預判,那麼假設你設定了一個比較小的目标碼率(如 3Mbps),可能小于真實的網絡帶寬(如 10Mbps),這時,如果業務上産生了一些突發的流量,真實的網絡帶寬本可以允許更快地完成發送,但經過了漏桶算法後,依然會以恒定的目标碼率慢慢地發送。是以說,漏桶算法無法充分用滿網絡資源來降低傳輸延時。

解決方案有 2 個:

  1. 先慢啟動,然後将漏桶的目标碼率持續上探,直到出現網絡惡化(如:丢包增多)後再降下來,如此反複,維持一個動态平衡,使得漏桶算法的目标碼率持續無限逼近網絡的承載能力
  2. 改進漏桶算法,允許其在執行過程中,偶爾出現一些超過預設平均值的突發傳輸能力,用于應對業務上的流量突發,即:令牌桶算法

令牌桶算法(Token Bucket)

談談網絡通信中的流量整形

令牌桶算法在漏桶算法基礎上,提出一個改進,就是新增了 “令牌” 和 “令牌桶”。

“令牌” 代表着允許傳輸的位元組數量,我們以固定的時間間隔(比如:10ms)産生并送入 “令牌” 到  “令牌桶”,“令牌桶” 設定一個  “令牌” 數量上限(滿了沒有消耗就丢掉新增的令牌),是以,一次傳輸最大的允許突增的位元組數 = M x B

發送子產品,以固定 t ms 的時間間隔去讀取 packet buffer,讀取的位元組數 X 必須接近但小于等于目前 “令牌桶” 中允許傳輸的位元組數(即:“令牌桶” 裡剩餘的  “令牌個數” x B)。并且,傳輸完了多少位元組,則删除掉 “令牌桶” 裡對應個數的 “令牌”。

這種方法解決突發流量的關鍵點在哪呢 ?

在于 “令牌” 是可以積累的,可能緩沖區在前 N ms 都沒有突發的資料,這時,“令牌” 依然在産生,并且被積累在了 “令牌桶”,一旦緩沖區突增了大量的資料,則可以在短時間内快速消費掉。當然,為了防止突破網絡承載能力導緻丢包,“令牌桶” 的最大 “令牌數量” 也相應做了一些限制。

繼續閱讀