­

騰訊視頻P2P帶寬節省率持續提升之路

  • 2020 年 3 月 27 日
  • 筆記

Photo by Brett Sayles from Pexels

要想提升P2P帶寬節省率,最直接的方式當然是壓縮CDN帶寬,但簡單粗暴的減少CDN下載勢必會帶來播放體驗問題。騰訊視頻數據傳輸研發高級工程師嚴華梁在LiveVideoStackCon 2019深圳的演講中詳細介紹了騰訊視頻針對P2P帶寬節省的最新探索與實踐。

文 / 嚴華梁

整理 / LiveVideoStack

PART1/P2P技術項目背景

P2P實際上是利用用戶之間互相分享視頻的數據,來減少從CDN下載數據的量,從而達到帶寬節省的效果。

一般情況下,在使用P2P進行帶寬節省的基礎上,服務所需帶寬的計算公式如上圖所示:帶寬 = 播放量平均碼率 *平均播放時長(1-P2P帶寬節省率)。觀看視頻的用戶除了從平台服務器上調用數據,還會從其他用戶那裡來調用數據。

騰訊視頻業務在過去幾年迎來了高速的發展,用戶規模不斷提高,無論是播放量還是視頻平均碼率都有明顯的提升。此時擺在我們面前的一大挑戰就是:如何持續提升P2P帶寬節省率,並做到CDN帶寬成本保持較少增長?

上圖展現了我們提升P2P帶寬節省率的思路。結合之前的帶寬計算公式我們可知,如果需要降低CDN的帶寬成本,最簡單粗暴的方式就是減少CDN的下載,但這樣會帶來諸如卡頓的音視頻體驗問題。我們的思路是首先系統性地優化P2P網絡的傳輸效率。由於P2P網絡是一個對端網絡,因此需要從下載端與上傳端兩個方面綜合看待該項命題。那麼在完成對P2P的系統優化之後,在此基礎上我們還需要考慮更少的CDN下載,接下來我們就分階段思考如何實現這一目標。

PART2/如何提升P2P帶寬節省率?

若想實現更快的P2P下載,需要做的第一件事情便是傳輸協議的優化。眾所周知,在TCP中存在一個慢啟動閾值,為了優化擁塞控制算法我們需要對慢啟動閾值進行動態設定,算法策略其實就是經典的ssthresh=max(BDP, cwndα/10)。在此基礎之上我們又引入兩個策略:丟包避免與丟包過濾。丟包避免從降低丟包率入手,也就是最近RTT大於rttMin+(rttMax-rttMin) β/100,cwnd不增加;丟包過濾從提高吞吐率入手,也就是最近RTT小於rttMin+(rttMax-rttMin)* γ/100, cwnd不退避。上圖展示了我們自研的P2P擁塞控制算法與TCP Cubic的對比結果,紅線代表TCP Cubic而藍色則代表我們自研的P2P CC。從數據中可以看到當出現網絡抖動時,TCP Cubic對丟包和時延比較敏感,滑動窗口抖動非常劇烈,而P2P CC則相對平穩許多。

TCP的擁塞控制儘管已經演化多年,但仍舊存在較多問題。這告訴我們一個道理:沒有一種擁塞控制算法能夠適應所有的業務場景或者說網絡場景。因此我們希望通過結合應用場景來實現個性化的擁塞控制。

所謂的個性化擁塞控制其實就是依據播放時間線進行差異化傳輸。如上圖所示,播放時間線從播放點開始梳理,播放點往後開始讀取數據。那麼離播放點越近的數據則會被優先讀取到,即優先級較高。於是在這一區間段內我們採用比較激進的擁塞控制參數,儘可能保證傳輸的效率而損失一部分丟包重傳的優化;在距離播放點較遠的區段內,採用另外一種策略—— 優先考慮丟包率和重傳率並降低吞吐率。上圖展示的是新舊算法P2P下載速度的對比,我們可以看到相對於固定閾值的舊算法,新算法尤其是在FAST與MEDIUM檔有明顯提升。在網絡下載效率方面,優化後的整體重複下載率較之前有非常明顯的提升。

解決完擁塞控制的相關命題,接下來面對的是如何進行有效選種並高效利用。最關鍵的一點便是如何評估種子的質量。

這裡我們引入一套完整的基於QoS的選種淘汰機制:第一項考察的指標是數據完整度,例如在PC客戶端的磁盤內存在一些緩存,PC客戶端上的數據相對更加完整,這樣便可在整個視頻播放的過程中提供更高質量的上傳數據;第二項考察的指標為是否斷連;第三項是數據接收成功率,其中包括丟包率;最後一項指標是被凍結次數,也就是當連接上一個比較好的種子之後,對上傳效率的影響是積極的。但如果進行一次數據交互之後對端提供的反饋信令結果是忙碌,那麼可能是因為種子質量出色而連接的對象有些多。在這種情況下,該時間段內負載已經達到較為滿負荷的狀態,有可能超過了硬件可承載的水平。當有新的請求過來時,會反饋忙碌的狀態,從而控制下載請求。但由於該種子質量出色,因此服務器會選擇對該鏈路進行凍結處理,暫時不向該端請求數據傳輸,並保留對接的端口,待該端不再忙碌之後繼續請求下載數據。

隨着智能路由器的普及,NAT類型被限制得越來越嚴格,P2P想找到一個質量出色的種子並成功連接的概率越來越低、難度越來越大,因此設計這樣的保護機制可以確保種子物盡其用。

選種之後面臨的問題是選片。在P2P傳輸中,一個流媒體文件會被做切片處理,從而更充分地利用UDP進行傳輸。UDP本身發送一個數據包會受MTU的影響,例如以64K為一片,切片一段文件,並以不同顏色表示若干個文件片段的下載狀態。每一片應當分配給哪一個種子來實現P2P下載?這是我們在選片算法當中需要考慮的問題。

結合時間線,我們提出了一個被稱為集中式協同選片算法的策略。按照時間軸進行梳理,離播放點近的數據是即將被播放的,下載優先級最高。這裡的「集中式」就是指集中下載優先級高的數據,從而保證整體播放的流暢。「協同」則是指多個種子對優先級高的某一區域數據進行協同下載,例如前面幾片分配給一個種子,後面幾片分配給另外一個種子。如果簡單粗暴地讓64K數據直接向某一個種子提出下載請求,那麼一旦該種子下線或對應的網絡中斷,那麼64K的數據相當於被整體丟包,假如丟包的數據處於距離播放點較近的位置,短時間內又無法高效地下載,就會出現播放的中斷。

為了做到集中式協同下載,我們引入了兩個隊列:可下載塊隊列與正在下載塊隊列。在P2P中,通過種子之間的位圖交換,我們可以獲知應當下載哪些塊,這便是可下載塊隊列。正在下載塊隊列的大小是相對固定的,也就是說對於任何一個種子,如果在選片時發現正在下載的塊沒有完整下載完畢,那麼就會優先下載這一部分。例如一個種子開始下載,此時系統發現其他種子超時,那麼系統不會重新下載別的分片而是繼續下載該種子後面的分片,從而利用這種集中式協同的思路,儘可能完整地下載某一塊數據。我們知道UDP的數據傳輸沒有TCP那樣嚴格依賴順序,而集中式協同的設計主要是為了按順序儘可能快地將距離播放點比較近的數據下載下來,從而實現P2P下載效率與播放體驗的精準平衡。

全平台的視頻介質統一至關重要,大家知道廣播電視行業需要牌照,這樣影視作品才能在TV端合法上線。但騰訊沒有這方面的牌照資質,因此我們需要尋求外部牌照方合作。而第三方合作就存在一個問題:對方會要求在TV端播放時必須顯示牌照方的水印,而不能顯示騰訊視頻自己的水印。

一般情況下,水印會被直接編碼在原視頻數據當中,稱為「硬水印」。為了做到全平台統一,我們則使用了軟水印技術,也就是將視頻內容與水印分開。同一個視頻內容在不同的平台上,介質完全一樣而水印顯示則根據場景改變,從而滿足不同場景的水印需求。

我們構建了一套系統性的種子質量提升方案:在第一層,系統會對一些無效的種子做過濾處理,這裡的「無效種子」更多的是指在一些限制條件下對種子的篩選擇優,如ISP過濾(以避免對運營商網絡不友好的跨運營商傳輸)、NAT類型過濾(常規手段實現NAT穿透較為困難,我們會儘可能選用對稱型以減少在穿透方面的損耗)、平台過濾(更多考慮移動端,因為移動端存在運營商網絡的限制)、連接數過濾。

結束第一層過濾之後,我們會根據一些屬性,使用多屬性權重打分決策算法對其進行處理。這裡的屬性主要有在線時長(能否提供穩定的在線上傳)、上傳能力(如100M、200M帶寬等)、NAT類型與地域就近。完成加權打分之後,我們會對種子進行一個質量等級的劃分。隨後優先返回評分較高的種子,這樣可充分改善客戶端的種子建連與下載效率。

為實現更多的P2P上傳,我們還需優化上傳控制。在P2P網絡傳輸的早期,例如大家在大學時可能用過BT下載,如果宿舍裏面有一個人正在進行BT下載,那麼其他人可能連常規的互聯網訪問都無法正常進行。也就是說如果控制不好P2P的上傳過程,實際上會對TCP的ACK等普通網絡傳輸過程帶來不利影響,因此我們希望實現更加出色的上傳控制。這裡的優化借鑒了類BBR的思路,也就是通過周期性地動態測速,對每個P2P信道實時計算上行帶寬累加,並作為限速值進行上傳動態限速控制,限速機制採用TCP中勻速發送的機制,從而降低瞬時大數據包對網絡傳輸鏈路的衝擊。

對於客戶端來說,通過信道連接不同種子,我們這裡測量的是不同信道的帶寬情況,並累加作為整體上傳的限速值。上圖右側可視化圖表展示了動態測速方案的效果,我們可以看出其整體波動均勻集中。用戶在使用客戶端訪問服務時可能會同時進行一些其他的上網行為,例如看視頻時點擊某個網頁。測速圖表中的「PC空閑時間」就是指用戶未使用鼠標、鍵盤的時間,如果偵測到鼠標、鍵盤使用,那麼我們則認為用戶在訪問互聯網其他服務。根據測速結果我們可以看到,隨着空閑時間不斷增加,動態測速呈現一個緩慢上升的趨勢,也就是說動態測速可以感知並自適應用戶其他訪問互聯網的行為,並確保視頻服務的可用。

在完成對P2P下載與上傳的優化之後,我們還需實現更少的CDN下載。我們所做的第一件事就是優化http下載,對此我們並未採用過於高深莫測的算法,而更多採用的是策略優化+擁塞控制優化(QUIC、BBR)。

策略上的優化,總體思想其實是多元——第一項是MSS也就是IP直出和域名兜底。IP直出是為了減少DNS解析所帶來的耗時,域名兜底則主要是為了適應運營商的切換,如用戶從中國電信的Wi-Fi網絡切換到中國聯通的4G移動網絡,此時原電信服務器的IP需要切換至聯通服務器下的IP之上,我們會對域名進行解析並實現兜底。

第二項是多IP競速連接,之前IP直出決定了有多個IP待選,這裡我們使用了多IP競速連接以提高速度。

第三項是多鏈接加速,現在大家提到比較多的一個是MP TCP,也就是實現WiFi網卡與運營商網卡的組合加速。

在策略優化的基礎上,我們進行了擁塞控制優化,如使用QUIC、BBR等。

若想實現更少的CDN下載,除了優化http,必不可少的一項舉措是合理利用CDN資源。

結合業務特性,我們進行了系統調度的優化:首先嘗試深度整合業務,例如用戶訪問騰訊視頻,如果是非會員那麼會在正片開始之前看到一段時間較長的廣告。在廣告播放期間系統就可利用P2P網絡預先下載正片數據,在此期間CDN並未被使用。除此之外在播放專輯畫面時,如果專輯中上一集即將播放結束,那麼下一集即可開始預加載。當然還有一種情況是用戶退出當前正片之後,可能需要重新點擊打開重複觀看,此時系統會對播放點數據做緩存處理,從而實現當用戶想要再次打開觀看時,系統可快速從本地加載數據並快速開始播放。

當然,如果是會員無廣告的情況,為了保證播放體驗我們還是會優先選擇CDN下載數據,從而保證快速啟動播放。在這裡我們構建了一套網絡預測模型,結合歷史下載速度、實時下載速度與當前視頻碼率綜合做出決策,判斷啟動播放究竟需要多長時間,並儘可能降低CDN的下載時長。例如當用戶使用光纖網絡時,由於網絡帶寬資源充裕,下載速度較高,即便沒有P2P,CDN也可快速下載所需數據並實現快速啟動播放。

除以上兩點之外,我們還會從用戶行為入手。上圖右側圖線是我們與香港中文大學進行的聯合研究的結果:不同的媒體類型如電影、電視劇、綜藝等,其視頻用戶中斷播放的位置也不盡相同。對於不同類型的視頻用戶在某一個時間段離開的概率不同,且存在一定規律。通過數據分析我們可以基於此在下載的時長控制方面進行一些針對性處理。

實現更少CDN下載的最後一點是多源體系建設。由於CDN價格高昂,因此我們應當科學調配內容與承載網絡類型之間的關係,從而實現產品服務與成本控制的精準平衡。

上圖左側展示了CDN的大概拓撲結構,從上到下依次是距離用戶比較遠的服務器、城市或社區的機房、家用路由器與用戶終端,與用戶之間的距離由遠及近。隨着5G時代的到來,大家經常提到的一個詞是移動邊緣計算也就是MEC,未來5G基站即可承擔一部分機房的角色。大家總是強調5G技術的高帶寬低延時,如果未來我們的視頻內容直接下沉到基站,藉助5G網絡訪問就可達到類似於局域網的效果,其所能達到的速度是驚人的。如果CDN距離用戶較遠,那麼本身就存在一個傳輸鏈路上的損耗;我們嘗試儘可能縮短用戶與內容之間的距離,進一步突破互聯網傳輸技術對用戶體驗的桎梏。

PART3/總結

P2P節省率=P2P帶寬/ (P2P帶寬 + CDN帶寬), 要想提升P2P帶寬節省率,最直接的方式當然是直接壓縮CDN帶寬,如減少CDN下載;但是簡單粗暴的減少CDN下載勢必會帶來播放體驗問題,所以我們的思路是先優化P2P網絡, 在P2P網絡優化下載的效率和穩定性提升之後,再來合理的減少CDN下載。