轉自:https://blog.csdn.net/momo0853/article/details/88051312#RTPFBTransport_layer_FB_messagesNACKTransportFeedback_245
文章目錄
RTCP
SR(Sender Report RTCP Packet)
RR(Receiver Report RTCP Packet)
SDES(Source Description RTCP Packet)
BYE(Goodbye RTCP Packet)
APP(Application-Defined RTCP Packet)
RTPFB(Transport layer FB messages)[NACK/TransportFeedback]
NACK
TransportFeedback
PSFB(Payload-specific FB messages)[PLI/FIR/REMB]
PLI
FIR
REMB
RTCP
涉及到的相關RFC文檔
1、RFC3550,SR/RR/BYE/APP/SDES
2、RFC4585,RTPFB/PSFB
3、draft-holmer-rmcat-transport-wide-cc-extensions-01,RTPFB擴展TransportFeedback
RTCP通用頭部如下
V,RTCP的版本號,一定等於2
P,是否存在填充信息,包的最后一個byte用於存儲填充數據的長度,也就是padding_size_ = payload_[payload_size_ - 1]
RC,ReportBlock的個數
PT,RTCP的負載類型
lenght,頭部的長度,不包括通用頭部,長度等於4*lenght
SR(Sender Report RTCP Packet)
發送端通過發送SR包告訴接收端發送端的信息,SR包分為三部分:頭部header,發送者信息senderInfo和反饋塊ReportBlock。如果發送端也作為接收端,那么才會存在ReportBlock,當存在多個碼流的時候就會反饋多個ReportBlock。SR包的負載類型是200。
- 發送端信息SenderInfo
SSRC 同步源
64位的NTP,NTP timestamp, most significant word前面32位是秒, least significant word后面32位是分
RTP timestamp
sender’s packet count 到發送此SR包時已經發送包的個數
sender’s octet count 到發送此SR包時已經發送包的大小(Byte)
- 反饋塊ReportBlock
fraction lost丟包率,到發送此ReportBlock時丟包率計算
cumulative number of packets lost總共丟失的包個數
extended highest sequence number received 收到的包序號,前16位表示第幾圈,后16位表示當前的序號
interarrival jitter包之間的平均間隔
Last SR上一個SR包的時間戳
Delay since last SR距離上一個LSR的時間間隔
RR(Receiver Report RTCP Packet)
接收端通過RR包反饋接收端的接收情況,RR包分為兩個部分:頭部header和反饋塊ReportBlock。參考SR包,RR包的負載類型是201。
SDES(Source Description RTCP Packet)
發送源信息描述,可以用於描述發送端的名字,郵箱,電話等信息,SDES的負載類型是202。SDES分為兩部分:頭部header和描述信息chunk。chunk內需要包含一個SSRC和至少一個SEDS item,每個item用於描述不同的信息。item中的lenght字段是用於表示后面描述信息的長度(byte)
- CNAME(Canonical End-Point Identifier SDES Item)
負載類型1,用於描述規范點標識符,長度lenght(指后面的長度),具體信息user and domain name
- NAME(User Name SDES Item)
負載類型等於2,用於描述用戶名字
- EMAIL: Electronic Mail Address SDES Item
負載類型等於3,用於描述郵箱信息
- PHONE: Phone Number SDES Item
負載類型等於4,用於描述電話號碼
- LOC: Geographic User Location SDES Item
負載類型等於5,用於描述用戶位置信息
- TOOL: Application or Tool Name SDES Item
負載類型等於6,用於描述應用程序或者工具名字
- NOTE: Notice/Status SDES Item
負載類型等於7,用於描述用戶狀態的信息
- PRIV: Private Extensions SDES Item
負載類型等於8,用於定義用戶私有的擴展信息
BYE(Goodbye RTCP Packet)
發送端主動停止發送,最后會發送一個BYE包,有可能會說明離開信息(reason for leaving)
APP(Application-Defined RTCP Packet)
用於描述用戶信息的,這個包在WebRTC中並沒有看到發送。
RTPFB(Transport layer FB messages)[NACK/TransportFeedback]
負載類型是205,WebRTC對應的代碼是rtpfb.cc。傳輸層反饋信息目前只有NACK,用於反饋接接收端未收到什么包。
通用頭部信息,前面四個Byte的信息和普通的RTCP頭是一樣的,看前面就好了,這里FMT用於區分FCI的類型,它會加上SSRC of packet sender發送者的SSRC和SSRC of media source反饋者的SSRC。
NACK
FMT是1,WebRTC對應的代碼是nack.cc。
NACK的FCI個數如下,其中PID(Packet ID)是第一個丟失的序號,BLP(bitmask of following lost packets)是繼第一個序號之后的16個包的丟失情況,當丟失之后,此二進制位就會被mark為1。例如PID等於666,如果668和692也丟失了,那么BLP等於100010。當后續丟失的包序號大於第一個丟失的包序號16以上就需要重新使用一個新的FCI反饋包表示。NACK包可以存在多個FCI。
TransportFeedback
FMT是15,WebRTC對應的代碼是transport_feedback.cc。
這個是WebRTC自頂的一個FB,用於反饋接收端收到的包和間隔。這些信息是給發送端用於擁塞檢測。
PSFB(Payload-specific FB messages)[PLI/FIR/REMB]
負載類型是205,WebRTC對應的代碼是psfb.cc。
PLI
FMT是1,WebRTC對應的代碼是pli.cc。
向發送方請求關鍵幀。
FIR
FMT是4,WebRTC對應的代碼是fir.cc。
向發送方請求關鍵幀。和PLI不同的地方是,它會指明向那個SSRC請求關鍵幀,並且是第幾次請求。當發送端存在多個視頻發送源的時候,接收端就需要指明向那個源請求關鍵幀。
REMB
FMT是15,WebRTC對應的代碼是remb.cc。
向發送方發送接收端估算的最大帶寬。這個是WebRTC自定義的一個FB類型。
Num SSRC指明SSRC的個數,帶寬用一個uint64_t類型表示,但是傳輸的時候需要把64位封裝到24位里面。WebRTC的做法是當碼率大於18位能表示最大數0x3FFF時,只能用指數表示帶寬了。