RTP/RTCP协议详解
一、RTP協議概述
RTP 為交互式音頻、視頻等具有實時特性的數據提供端到端的傳送服務。在
IP 網絡上,一般是在 UDP 之上運行 RTP 協議。如果支持它的網絡能提供組播功
能,則 RTP 也可用組播將數據送給多個目的用戶。
RTP 包括兩個關系十分密切的子協議:
實時傳輸協議(RTP):用于傳輸實時數據。
實時控制協議(RTCP):用于監視網絡的服務質量,并傳遞與會者會話中的信息。
下面首先給出有關 RTP 的一些定義。
? RTP會話(RTP session):RTP傳輸服務使用者之間的連接被稱為RTP會話,就每一個會話參加者而言,會話由一對傳輸層地址(即一個網絡層地址加上
兩個端口地址,一個端口為 RTP 報文的發送/接收所占用,另一個端口為 RTCP
報文的發送/接收所占用)標識。在 IP 多播方式中,每個參與者的目的地運輸層
地址對可以都相同;在單播方式中,每個參與者的地址對均不相同,因為每個人
的網絡層地址都不相同。在多媒體會話中,每個媒體信號由不同的 RTP 會話傳
送,有其自己的 RTCP 分組。各 RTP 會話由不同的端口對和/或不同的多播地址
區分。
? RTP媒體類型:由一個RTP會話傳送的所有凈荷類型的集合。RTP應用
文檔指定 RTP 媒體類型和 RTP 凈荷類型的關系。
? RTP 凈荷:由 RTP 傳送的數據,如音頻抽樣信號,壓縮視頻數據等。凈荷
格式及其解釋由應用層規定。
? RTP分組:由RTP頭部和凈荷數據組成。通常下層傳送協議的一個數據
包(如一個 UDP 包)只含一個 RTP 分組;如果采用一定的封裝方法,也可以包
含多個 RTP 分組。
? 同步源 SSRC(Synchronization source ):RTP 包的信源流,在 RTP 頭中用
32 比特長的同步源標識符表示,與網絡地址無關。該字段用以標識信號的同步
源,其值應隨機選擇,以保證 RTP 會話中任意兩個同步源的 SSRC 標識都不相
同。
? 提供源 CSRC(Contributing source):分信源標識,32 比特。RTP 分組頭部 最多可包含 15CSRC 標識,其數目由 CC 字段指明。如果分
信源的個數大于 15,只能標識其中 5 個源。CSRC 標識由混合器插入,其值就是
組成復合信號的各個分信號的 SSRC 標識,用以標識各個組成分信號的信源。
? 混合器(Mixer)和翻譯器(Translator):這是 RTP 在接收方和發送方之間
引入的兩類功能模塊。混合器接收來自一個或多個發送方的 RTP 組塊,并把它
們組合成一個新的RTP分組繼續轉發。這種組合組塊將有一個新的SSRC ID。
因為這些來自不同信源的組塊可以非同步到達,所以混合器改變了該數據流的臨時結構。與混合器相反,轉換器只改變組塊內容而并不把數據流組合在一起。 混合器和翻譯器保證具有不同通信條件的用戶可以順暢地完成數據交換。混 合器的重要應用是在高帶寬網絡與低帶寬網絡之間,改變從高帶寬網絡接收數據 的壓縮編碼,把音、視頻碼流轉換成低碼流數據發送到低帶寬網絡;翻譯器用在不同協議的網絡之間和在防火墻之間,因為 UDP 通過防火墻會發生阻塞現象。
二、RTP(實時傳輸協議)
RTP 協議(Real Time Protocol)提供具有實時特征的、端到端的數據傳送服
務,可用來傳送聲音和運動圖像數據。在這項數據傳送服務中包含了裝載數據的
標識符、序列計數、時戳和傳送監視。通常 RTP 的協議元是用 UDP 協議元來裝
載的,并利用 UDP 的復用和校驗和來實現 RTP 的復用。
必須注意的是,RTP 沒有提供任何確保按時傳送數據的機制,也沒有提供任何質量保證的機制,因而要實現服務質量必須由下層網絡來提供保證。同樣必須
注意的是,RTP 不保證數據包按序號傳送,即使在下層網絡能使保證可靠傳送的
條件下,也不保證數據包按序號傳送。包含在 RTP 中的序號可供接收方用于重
構數據包序列,也可用于包的定位。
在 RTP 會話中,復用是由目的傳送地址(網絡地址和端口號)來提供的,
一個傳送地址定義了一個 RTP 會話。例如,在一個會議中,音頻碼流和視頻碼流是分別用不同的 RTP 會話(一般是同一個目的網絡地址和不同的端口號)來傳送,而不是用 PT(載荷類別)或 SSRC 作區分來實現單個 RTP 會話中的復用傳送。
固定報頭的 RTP 報文結構如下圖所示:
RTP 報頭中各字段的含義如下:
版本(V):2個比特,表示RTP的版本號。
填充(P):1 個比特,置“1”表示用戶數據最后加有填充位,用戶數據中
最后一個字節是填充位計數,它表示一共加了多少個填充位。在兩種情況下可能
需要填充,一是某些加密算法要求數據塊大小固定;二是在一個低層協議數據包
中裝載多個 RTP 分組。
擴展(X):1個比特,置“1”表示RTP報頭后緊隨一個擴展報頭。
CSRC計數(CC):4個比特,表示在定長的RTP報頭后的CSRC標識符的
數量。
標記(M):1 個比特,其具體解釋由應用文檔來定義。例如,對于視頻流,
它表示一幀的結束,而對于音頻,則表示一次談話的開始。
載荷類別(PT):7 個比特,它指示在用戶數據字段中承載數據的載荷類別。
序號(SN):2 個字節,每發送一個 RTP 數據包該序號增加 1。該序號在接
收方可用來發現丟失的數據包和對到來的數據包進行排序。
時間戳(TS):4個字節,它用來表示RTP包中用戶數據段的第一個字節的
采樣時刻。時間戳的時間表示應為線性單調遞增的,以便完成同步實現和抖動的
計算。
同步源標識符(SSRC):4 個字節,用來標識一個同步源。此標識符是隨機
選擇的,但要保證同一 RTP 會話中的任意兩個 SSRC 各不相同,RTP 必須檢測
并解決沖突。
提供源標識符(CSRC):它可有 0~15 項標識符,每一項長度為 32 比特,其
項數由 CC 字段來確定。如果提供源多于 15 個,則只有 15 個被標識。
為了能滿足各種應用的需要,RTP 報頭可進一步擴充,其時 X 比特將置“1”,
擴充的 RTP 報頭部分則緊隨在 SCRC 清單之內。
如果擴展位被置為 1,意味著 RTP 固定頭后緊跟著一個頭擴展,其格式如圖
3-2 所示。前 16 位的內容由輪廓文件決定,主要用來標識不同的頭擴展類型。這
種擴展方式主要用來傳遞獨立于具體格式的載荷(payload-format-independent)
的應用信息。
三、RTCP(實時傳輸控制協議)
3.1 RTCP的功能
RTCP 是 RTP 的控制協議,它用于監視網絡的服務質量和在正在進行的與會
者會話中傳遞信息。RTCP 的基本做法是周期性地向會話的所有參加者進行通信,
采用和數據包分配傳送的相同機制來發送控制包。RTP 有四個功能:
(1) RTCP 的基本功能是提供關于數據傳輸質量的反饋,這是 RTP協議的重要組成部分,它大致和其它傳輸協議的流量控制及擁塞控制相對應。
RTP 向會話的所有參加者發送反饋報文,其目的是允許那些發現數據傳輸過程中
出現問題的用戶進一步判斷問題僅和其自身相關還是和全體參加者有關,并采取相應的措施。此外,在 IP 組播機制的支持下,RTCP的這一功能允許監視者并不具體參加某一 RTP 會話的功能實體,而是通過接受反饋報文來推斷網絡的服務
質量,扮演第三方監測者(third-party monitor)的角色。該功能由RTCP 的發送者報告(SR)和接收者報告(RR)來具體完成。
(2) 就每個 RTP 源而言,RTCP 為其分配一個永久的傳輸層標識,該標識被稱為 CNAME。雖然 SSRC 標識符可以區分一個會話中的不同碼流,當 RTP 發現
不同碼流的 SSRC 標識發生沖突或應用重新啟動時,SSRC 值會被更改,因而接
收者需要利用 CNAME 而非 SSRC 來跟蹤每一個會話參加者;另外,借助于CNAME,接收者可以關聯來自于同一用戶、經由不同 RTP 會話傳來的碼流以完
成特定的任務,如音頻流和視頻流的同步。CNAME 由 RTCP 的 SDES 報文(源
描述 source description)所攜帶。
(3) 由于上述兩項功能要求所有的會話參加者發送 RTCP 報文,因此為了能夠在一個 RTP 會話中接納更多的用戶,RTCP 給出另外關于調整控制報文發送速
率的方法。一個 RTP 用戶能夠通過接收來自于其他用戶的 RTCP 報文,獨立地
了解會話參加者的數目,RTCP 利用該數值參數為每個會話參加者計算控制報文
的發送間隔,以達到 RTCP 所占用的通信帶寬不超過會話帶寬 5%的目的。
(4) RTCP 提供了基本的會話控制功能,如在不同的會話參加者之間互換身份
(identification)信息等。該項功能為可選項,主要用于控制較為松散的會話,
這樣的會話對用戶的加入和離開沒有嚴格的管理。由此可以看出,盡管 RTCP 為
訪問每一個會話參加者提供了便捷的手段,但它并未滿足應用程序所需的全部通
信控制要求,所以 RTP 允許應用在 RTCP 的基礎上選用其它高層控制協議以滿
足其特定的應用需求。
其中(1)~(3)項功能是 RTCP 必備功能,而第四項為可選功能。
RTCP 報文的類型有下述多種:
SR(sender report):發送者報告。
RR(receiver report):接收者報告。
SDES(source description items):源描述條款,包括 CNAME。
BYE:指示與會者退出。
APP:應用的特定功能。
每一個 RTCP 包都以和 RTP 數據報的固定部分類似的結構開始,后隨的結
構單元和 RTCP 包的類型相似,其長度隨類型不同而不同,但都是 32 比特的整
數倍。
3.2 SR和RR
RTP 報文的接收者可以利用兩種類型的 RTCP 報告報文(SR 或 RR)來提供有關數據接收質量的統計信息,具體選用 SR 報文還是 RR 報文要看該接收者是
否同時是一個 RTP 報文的發送者,明確地講,如果一個會話參加者自最后一次
發送 RTCP 報文后,發送了新的 RTP 數據報文,那么該參加者需要傳送 SR 報文,
否則傳送 RR 報文。SR 報文和 RR 報文的主要區別在于前者包含了 20 字節有關
發送者的信息。
SR 報文包括三部分,第一部分是 RTCP 報文頭,長度為 8 個字節;第二部
分是發送者信息,長度為 20 字節;第三部分為接收報告塊,接收報告塊攜帶了
有關連續碼流接收情況的統計信息,其中SSRC值表明了統計信息所針對的具體
碼流,在一個 RTP 會話中,參加者有可能收到多個具有相同媒體類型的碼流,
因而在一個 SR 或 RR 報文中可能會包含多個接收報告塊。
SR 報文中的字段含義如下。
版本(V),填充(P)與RTP報頭中的V,P字段含義相同。
RC:5 個比特,表示包中包含的接收報告塊的數目。
載荷類型(PT):8 個比特,其值反映了該報文的類型(如對于 SR,PT 為
200;對于 RR,PT 為 201 等)。
長度(length):16 個比特,表示 RTCP 包的長度,包括頭和填充字節。
SSRC:32 個比特,該標識值一方面表明了該控制報文的產生者,另一方面
反映了該報文攜帶的發送者信息塊內的統計數據所針對的具體碼流。
NTP 時間戳:64 個比特,它記錄了 SR 報文的發送時刻,該值可被用來估
測 RTP 報文或連續數據的平均發送速率。該時間戳為絕對時間戳,64 位的前 32
位是從 1900 年 1 月 1 日 0 時開始到現在的以秒為單位的整數部分,后 32 位是此
時間的小數部分。
RTP 時間戳:32 個比特,同 NTP 時間戳相同,不過它的計時單位和計時原
點與 RTP 數據報文的時間戳相同,該值可為碼流內部或碼流間的同步控制機制
所選用。
發送報文計數:32 個比特,它記錄了到該 SR 報文發送時所發的 RTP 數據報
文的總數。
發送字節計數:32 個比特,它記錄了到該 SR 報文發送時所發的連續數據的
字節總數。
SSRC-n:同步源標識符,SR 中的信息是關于這些同步源的。
丟失百分比(fraction lost):8個比特,它表示自上一個SR或RR報文發送
后,在數據接收過程中丟失的RTP報文數同所應收到的RTP報文總數的百分比。
包丟失累計數(cumulative number of packet lost):24 個比特,它記錄了到該
RTCP 報文發送時,在接收過程中所丟失的 RTP 數據報文的總數。
被擴展的最大次序號(extended highest sequence number):32 個比特,由于
RTP 報文中的次序號只有 16 位,因而數據傳輸過程經過一段時間后,次序號將
被回置為 0,RTP 協議稱這段時間為一個次序號周期(sequence number cycle),
相應于此,被擴展的最大次序號由兩部分構成,低 16 位記錄了到發送該 RTCP
報文時,收到的 RTP 報文的最大次序號值,高 16 位包含了所經歷的次序號周期
數,兩者聯合反映了應收到的 RTP 數據報文的總數。
包間抖動(IJ:interarrival jitter):32 個比特,其所含內容是對數據傳輸過程
中 RTP 報文所經歷的延時抖動的一種估測,由下述兩式確定。其中 S 為 RTP 報
文的時間戳值,R 為 RTP 報文的到達時刻。IJ 值可以大致反映 RTCP 報文發送時
網絡的擁塞狀況。
D(i-1,i)=(Ri-Si)-(Ri-1 - Si-1)
J=IJ+(|d(i-1,i)|-IJ)/16
上一個 SR(LSR:last SR timestamp):32 個比特,其值為 NTP 時間戳的中
間 32 位,表示最近收到 SR 報文的時間。
自從上一個 SR 的延時(DLSR):32 個比特,其值為最近收到的 SR 報文到發
送該 RTCP 報文的延時。
由此,該 RTCP 報文的接收者則可以通過 LSR 域和 DLSR 域來估算兩點之
間的往返傳播延時,具體地說,若令 A 表示該 RTCP 報文的到達時刻,則連續
數據流收/發兩端之間的往返傳播延時為 A-LSR-DLSR。
RR 報文格式如圖 3-4 所示,它與 SR 大致相同,只不過不包含發送者信息塊,
因而不再贅述。
總結
以上是生活随笔為你收集整理的RTP/RTCP协议详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DecimalFormat 类
- 下一篇: js之事件冒泡和事件捕获介绍