WebRTC中的padding數據包主要用于以下幾個方面:
-
網絡探測和帶寬調整:在啟動網絡探測或網絡狀態突變時,WebRTC會發送padding數據包以啟動網絡探測。這有助于評估網絡的實際編碼帶寬,從而調整發送策略。
-
填充預算(Budget):PacedSender模塊在執行發送時,如果檢測到實際編碼帶寬低于預測帶寬,會發送padding數據包以補足基于帶寬預估分配的數據量。
-
心跳包:WebRTC每500ms發送一個心跳包,其padding大小為1字節,以保持連接活躍。
-
防止突發數據包:Pacer模塊的目的之一是防止突發數據包發送到網絡,造成丟包。通過發送padding數據包,可以均勻地分布在各個時間片里發送數據,避免瞬時對網絡的沖擊。
-
調整發送數據包的優先級:Pacer模塊還會調整發送數據包的優先級,確保音頻、重傳、視頻和FEC數據包的發送優先于padding數據包。
-
生成Padding數據包:在RTPSender::GeneratePadding()中,有兩種模式生成padding數據包:RTX模式和普通模式。在RTX模式下,會從歷史發送的packet中取一包數據,把類型改為padding;在普通模式下,生成新的RTP Padding包,長度范圍為50-224字節。
-
解析Padding包:RTP頭中的padding標志表示本RTP包中包含了Padding數據,同時也可能包含了真實的負載數據。RTP音視頻負載長度payload_size = 總長度 - RTP頭及擴展長度 - Padding長度。如果payload_size > 0為有效數據包,payload_size == 0為純padding包。
-
RTP擴展和填充數據:RTP使用的端口號為偶數,每個關聯的RTCP端口為下一個較高的奇數。RTP頭中的P(Padding)位表示RTP數據包是否有填充值。最后一個字節記錄填充字節個數(Padding Size),包含它自己。填充數據不屬于RTP Payload的部分。
通過這些機制,WebRTC能夠有效地管理網絡帶寬,優化數據傳輸,提高通信質量。