webrtc中基于時(shí)延的擁塞控制TCC

傳輸協(xié)議

  1. 擴(kuò)展頭
    在原audio, video screen等流stream的sequnce number的基層上, 增加傳輸層的sequence number, 即所有的流都會(huì)有統(tǒng)一的transportSeq.
uint16_t transportSeq;
  1. 反饋報(bào)文
  • 反饋報(bào)文定義
struct ControlPacket_TransportFeedback {
    uint16_t baseSeq;
    uint16_t packetStatusCount;
    uint24_t baseTime;
    uint8_t feedbackCount;
    uint16_t packetStatus[n];
    uint16_t recvDeltas[n];
};
字段名 含義 長(zhǎng)度(bit)
baseSeq 這次反饋的頭一個(gè)包的transportSeq 16 0 - 65535
packetStatusCount 總共反饋多少個(gè)包的狀態(tài) 16 0 - 65535
baseTime 收端的時(shí)間,可用baseSeq收到的時(shí)間 24 絕對(duì)時(shí)間的后24位,單位ms, 做64ms的倍數(shù)
feedbackCount feedback序號(hào),便于知道丟失transportfeedback 8 0 - 255
packetStatus[n] 每個(gè)包的狀態(tài),具體每一位含義見(jiàn)下表 16 * n
recvDeltas[n ]收到包的時(shí)間差值,具體每一位含義見(jiàn)下表 16 * n
  • packetStatus定義
    共兩種, 其一:
struct PacketStatus_Repeat {
    uint8_t type : 1;
    uint8_t status : 2;
    uint13_t count ;
};
字段名 含義 長(zhǎng)度(bit)
type 兩種packetStatus中哪一種 1 0
status 包的狀態(tài) 2 0x00 -- 未收到 ; 0x01 -- 收到,且recv delta較小; 0x02 --收到,且recv delta 較大; 0x03保留
count 有多個(gè)連續(xù)的包處于這種狀態(tài) 13 1 - 8095

其二:

struct PacketStatus_Continue {
    uint8_t type : 1;
    uint8_t symbol : 1;
    uint14_t symbolVector;
};
字段名 含義 長(zhǎng)度(bit)
type 兩種packetStatus中哪一種 1 1
symbol 包的狀態(tài)的分類 1 0 -- 只有“收到”, “未收到”兩種狀態(tài); 1 -- 有以上三種狀態(tài)
symbolVector 如果symbol = 0, 則可包含14個(gè)包的狀態(tài); 如果symbol = 1, 則包含7個(gè)包的狀態(tài)。 14
  • recvDeltas定義
    Recv delta 較小 : [-128, 127] ms
    Recv delta 較大 : [-2048, 2047] ms, 并去掉較小部分
    注:這個(gè)定義同參考draft不同。
struct RecvDeltas_Small {
    uint8_t delta1;
    uint8_t delta2;
};
字段名 含義 長(zhǎng)度(bit)
delta1 接收到的包的時(shí)間差 8 如果recvDeltas的第一個(gè)包,則是recvtime - baseTime (ms),否則是,recvtime - lastRecvTime, 即跟前一個(gè)包的時(shí)間差;
delta2 接收到的包的時(shí)間差 8 如果recvDeltas的第一個(gè)包,則是recvtime - baseTime (ms);否則是,recvtime - lastRecvTime, 即跟前一個(gè)包的時(shí)間差;
struct RecvDeltas_Large {
    uint8_t delta;
};
字段名 含義 長(zhǎng)度(bit)
delta 接收到的包的時(shí)間差 16 如果recvDeltas的第一個(gè)包,則是recvtime - baseTime (ms);否則是,recvtime - lastRecvTime, 即跟前一個(gè)包的時(shí)間差;
  • 反饋報(bào)文頻率
    draft建議: 一個(gè)rtt或是30 - 50ms。

實(shí)踐: 先定為400ms, 基于多次實(shí)驗(yàn)測(cè)試數(shù)據(jù)調(diào)節(jié)。

基于傳輸反饋的擁塞控制

  1. TCC算法
  • trendline計(jì)算:

根據(jù)反饋的recv delta計(jì)算delay(同rtcp jitter):


然將delay做累加和平滑:

smoothingCoef是個(gè)經(jīng)驗(yàn)值, 在webrtc trendline_estimator.cc中取0.9。

另外還有一個(gè)recvTime = recvTime(i) - firstRecvTime;
接著將recvTime, accumulatedDelay和smoothedDelay保存到一個(gè)固定窗口大小的隊(duì)列HistoryQueue中,

然后按以下公式計(jì)算線性斜率:


得到的slope即是我們需要的帶寬變化趨勢(shì)。

為了限制slope不讓它跑偏了,
在HistoryQueue中取前80%的包中最小的accumlatedDelay(k), 以及這個(gè)包對(duì)應(yīng)的recvTime(k),
在HistoryQueue中取后80%的包中最大的accumlatedDelay(m), 以及這個(gè)包對(duì)應(yīng)的recvTime(k)


slope不能大于slope(max)。

基于slope判斷出網(wǎng)絡(luò)帶寬的使用狀態(tài): overuse, underuse, normal。

最后,基于新的網(wǎng)絡(luò)帶寬狀態(tài), 通過(guò)AIMD調(diào)整帶寬。

  • trendline計(jì)算帶來(lái)的優(yōu)勢(shì):
    • 算法簡(jiǎn)潔,易于實(shí)現(xiàn)和改進(jìn)
    • 平滑jitter

參考

  1. https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
  2. Webrtc source code
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,299評(píng)論 0 15
  • 星期六,我跟媽媽去姥姥家玩。姥爺給我買了好多好吃的。當(dāng)我吃到烤餅的時(shí)候,我覺(jué)得我的牙齒咬到了竹簽上。結(jié)...
    承一諾閱讀 249評(píng)論 0 0
  • 周日在家,澆花剪草,整理打掃,陽(yáng)光以火辣辣的身姿,肆意進(jìn)入房間,涼爽的屋內(nèi),溫度驟升幾度,一向怕冷的我,竟然也隱隱...
    疏林紅葉閱讀 533評(píng)論 28 25
  • 十年飲冰,難涼熱血。千載暗室,一燈即明。 為眾人抱火者,不可使其凍斃于風(fēng)雪;為世界開(kāi)路者,不可使其困頓于荊棘。 安...
    嗚嗚哇哇伊咿呀閱讀 1,086評(píng)論 0 0
  • 今天去了傣族寨子,了解到了很多傣族民俗,因?yàn)槭悄赶瞪鐣?huì),男性的地位非常低,要先在女方家干苦力三年,讓女孩父母考察過(guò)...
    嫣陽(yáng)媽媽閱讀 1,103評(píng)論 0 0

友情鏈接更多精彩內(nèi)容