网易云信直播sdk的整体传输优化
現(xiàn)有市場(chǎng)上的主流直播在傳輸方面,大部分使用TCP傳輸,也有部分使用UDP傳輸(類似上行使用rtc,然后在源站或者媒體服務(wù)器轉(zhuǎn)換為rtmp協(xié)議再進(jìn)行推流)。通常來(lái)說(shuō),udp效率更高一些,但由于自身無(wú)連接缺少確認(rèn)機(jī)制,缺少丟包重傳,所以通常開發(fā)者會(huì)增加冗余來(lái)對(duì)抗網(wǎng)絡(luò)的不穩(wěn)定性,這也造成了流量費(fèi)用的增加;TCP自身做了重傳,確??煽亢晚樞蛐?#xff0c;所以在對(duì)實(shí)時(shí)性要求并不高的直播,使用TCP是個(gè)很好的選擇。
網(wǎng)易云信直播sdk目前使用了TCP進(jìn)行傳輸,而且基于此從編碼動(dòng)態(tài)適配,發(fā)送隊(duì)列調(diào)整,協(xié)議優(yōu)化,socket等做了全流程的優(yōu)化,確保我們?cè)谙迬?#xff0c;丟包,時(shí)延,抖動(dòng),無(wú)論單項(xiàng),還是復(fù)雜網(wǎng)絡(luò),都有不輸于競(jìng)品的體驗(yàn)。
?
●●●
優(yōu)化的細(xì)節(jié)指標(biāo)
在不犧牲卡頓率的情況下,提升帶寬利用率8成以上,碼流更平穩(wěn)。
?
●●●
優(yōu)化的理論基礎(chǔ)
為了防止網(wǎng)絡(luò)的擁塞現(xiàn)象,TCP提出了一系列的擁塞控制機(jī)制。最初由V. Jacobson在1988年的論文中提出的TCP的擁塞控制由“慢啟動(dòng)(Slow start)”和“擁塞避免(Congestion avoidance)”組成,后來(lái)TCP Reno版本中又針對(duì)性的加入了“快速重傳(Fast retransmit)”、“快速恢復(fù)(Fast Recovery)”算法,再后來(lái)在TCP NewReno中又對(duì)“快速恢復(fù)”算法進(jìn)行了改進(jìn),近些年又出現(xiàn)了選擇性應(yīng)答( selective acknowledgement,SACK)算法,還有其他方面的大大小小的改進(jìn),包括google優(yōu)化后的BBR算法(目前移動(dòng)端無(wú)法使用),成為大家研究的一個(gè)熱點(diǎn)。
? ? ??
? ? ? ? ? ? ? ? ? ? ?
快速重傳:
快速重傳算法要求首先接收方收到一個(gè)失序的報(bào)文段后就立刻發(fā)出重復(fù)確認(rèn),而不要等待自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn)。接收方成功的接受了發(fā)送方發(fā)送來(lái)的M1、M2并且分別給發(fā)送了ACK,現(xiàn)在接收方?jīng)]有收到M3,而接收到了M4,顯然接收方不能確認(rèn)M4,因?yàn)镸4是失序的報(bào)文段。如果根據(jù)可靠性傳輸原理接收方什么都不做,但是按照快速重傳算法,在收到M4、M5等報(bào)文段的時(shí)候,不斷重復(fù)的向發(fā)送方發(fā)送M2的ACK,如果接收方一連收到三個(gè)重復(fù)的ACK,那么發(fā)送方不必等待重傳計(jì)時(shí)器到期,由于發(fā)送方盡早重傳未被確認(rèn)的報(bào)文段。
快速恢復(fù):
當(dāng)發(fā)送發(fā)連續(xù)接收到三個(gè)確認(rèn)時(shí),就執(zhí)行乘法減小算法,把慢啟動(dòng)開始門限(ssthresh)減半,但是接下來(lái)并不執(zhí)行慢開始算法。
此時(shí)不執(zhí)行慢啟動(dòng)算法,而是把cwnd設(shè)置為ssthresh的一半, 然后執(zhí)行擁塞避免算法,使擁塞窗口緩慢增大。
TCP的擁塞控制主要原理依賴于一個(gè)擁塞窗口(cwnd)來(lái)控制,TCP還有一個(gè)對(duì)端用的接收窗口(rwnd)用于流量控制。窗口值的大小就代表能夠發(fā)送出去的但還沒(méi)有收到ACK的最大數(shù)據(jù)報(bào)文段,顯然窗口越大那么數(shù)據(jù)發(fā)送的速度也就越快,但是也有越可能使得網(wǎng)絡(luò)出現(xiàn)擁塞,如果窗口值為1,那么就簡(jiǎn)化為一個(gè)停等協(xié)議,每發(fā)送一個(gè)數(shù)據(jù),都要等到對(duì)方的確認(rèn)才能發(fā)送第二個(gè)數(shù)據(jù)包,顯然數(shù)據(jù)傳輸效率低下。TCP的擁塞控制算法就是要在這兩者之間權(quán)衡,選取最好的cwnd值,從而使得網(wǎng)絡(luò)吞吐量最大化且不產(chǎn)生擁塞。
由于需要考慮擁塞控制和流量控制兩個(gè)方面的內(nèi)容,因此TCP的真正的發(fā)送窗口=min(rwnd, cwnd)。但是rwnd是由對(duì)端確定的,網(wǎng)絡(luò)環(huán)境對(duì)其沒(méi)有影響,所以在考慮擁塞的時(shí)候我們一般不考慮rwnd的值,我們暫時(shí)只討論如何確定cwnd值的大小。關(guān)于cwnd的單位,在TCP中是以字節(jié)來(lái)做單位的,我們假設(shè)TCP每次傳輸都是按照MSS大小來(lái)發(fā)送數(shù)據(jù)的,因此你可以認(rèn)為cwnd按照數(shù)據(jù)包個(gè)數(shù)來(lái)做單位也可以理解,所以有時(shí)我們說(shuō)cwnd增加1也就是相當(dāng)于字節(jié)數(shù)增加1個(gè)MSS大小。
●●●
優(yōu)化的具體內(nèi)容
TCP的慢啟動(dòng),擁塞避免,快速重傳機(jī)制告訴我們,在應(yīng)用層擁堵之前,會(huì)快速降低擁塞窗口大小,導(dǎo)致tcp通道可發(fā)送帶寬會(huì)快速降低,這個(gè)時(shí)候如果不快速降低數(shù)據(jù)流量, 會(huì)大量丟包重傳, 應(yīng)用層會(huì)進(jìn)入擁堵狀態(tài),導(dǎo)致惡化。
我們通過(guò)觀測(cè)若干系統(tǒng)反饋的socket 健康指標(biāo),一旦發(fā)現(xiàn)該socket進(jìn)入快速重傳,我們會(huì)提前降低視頻的編碼參數(shù);同時(shí)如果周期一直健康狀況良好,我們測(cè)算的可發(fā)送帶寬也大于實(shí)際發(fā)送大小,我們會(huì)緩慢提升視頻的編碼參數(shù);整個(gè)調(diào)優(yōu)會(huì)基于快降慢升,音頻優(yōu)先的原則來(lái)實(shí)施。
? ??
【推薦閱讀】Android短視頻中如何實(shí)現(xiàn)720P磨皮美顏錄制
總結(jié)
以上是生活随笔為你收集整理的网易云信直播sdk的整体传输优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 视频智能去水印:从数学建模到工程实现
- 下一篇: 【看这里】网易云信 IM 红包上线啦!最