天天看點

rtp與rtcp協定詳解 1 RTP概述 2 RTP詳解 3 相關的協定 4 常見的疑問 5 實作方案 6 參考資料

原文轉自 http://www.mikewootc.com/wiki/net/protocol/rtp.html

1 RTP概述

1.1 是什麼RTP

RTP全名是Real-time Transport Protocol(實時傳輸協定). 它是IETF提出的一個标準, 對應的RFC文檔為RFC3550(RFC1889為其過期版本). RFC3550不僅定義了RTP, 而且定義了配套的相關協定RTCP(Real-time Transport Control Protocol, 即實時傳輸控制協定). RTP用來為IP網上的語音, 圖像, 傳真等多種需要實時傳輸的多媒體資料提供端到端的實時傳輸服務. RTP為Internet上端到端的實時傳輸提供時間資訊和流同步, 但并不保證服務品質, 服務品質由RTCP來提供.

1.2 RTP的應用環境

RTP用于在單點傳播或多點傳播網絡中傳送實時資料. 們典型的應用場合有如下幾個.

  • 簡單的多點傳播音頻會議 語音通信通過一個多點傳播位址和一對端口來實作. 一個用于音頻資料(RTP), 另一個用于控制包(RTCP).
  • 音頻和視訊會議 如果在一次會議中同時使用了音頻和視訊會議, 這兩種媒體将分别在不同的RTP會話中傳送, 每一個會話使用不同的傳輸位址(IP位址+端口). 如果一個使用者同時使用了兩個會話, 則每個會話對應的RTCP包都使用規範化名字CNAME(Canonical Name). 與會者可以根據RTCP包中的CNAME來擷取相關聯的音頻和視訊, 然後根據RTCP包中的計時資訊(Network time protocol)來實作音頻和視訊的同步.
  • 翻譯器和混合器 翻譯器和混合器都是RTP級的中繼系統. 翻譯器用在通過IP多點傳播不能直接到達的使用者區, 例如發送者和接收者之間存在防火牆. 當與會者能接收的音頻編碼格式不一樣, 比如有一個與會者通過一條低速鍊路接入到高速會議, 這時就要使用混合器. 在進入音頻資料格式需要變化的網絡前, 混合器将來自一個源或多個源的音頻包進行重構, 并把重構後的多個音頻合并, 采用另一種音頻編碼進行編碼後, 再轉發這個新的RTP包. 從一個混合器出來的所有資料包要用混合器作為它們的同步源(SSRC, 見RTP的封裝)來識别, 可以通過貢獻源清單(CSRC表, 見RTP的封裝)可以确認談話者.

2 RTP詳解

2.1 RTP的協定層次

2.1.1 傳輸層的子層

RTP(實時傳輸協定), 顧名思義它是用來提供實時傳輸的, 因而可以看成是傳輸層的一個子層. 圖 1給出了流媒體應用中的一個典型的協定體系結構.

rtp與rtcp協定詳解 1 RTP概述 2 RTP詳解 3 相關的協定 4 常見的疑問 5 實作方案 6 參考資料

 圖 1 流媒體體系結構

從圖中可以看出, RTP被劃分在傳輸層, 它建立在UDP上. UDP協定一樣, 為了實作其實時傳輸功能, RTP也有固定的封裝形式. TP用來為端到端的實時傳輸提供時間資訊和流同步, 但并不保證服務品質. 服務品質由RTCP來提供.

2.1.2 應用層的一部分

不少人也把RTP歸為應用層的一部分, 這是從應用開發者的角度來說的. 作業系統中的TCP/IP等協定棧所提供的是我們最常用的服務, 而RTP的實作還是要靠開發者自己. 是以從開發的角度來說, RTP的實作和應用層協定的實作沒不同, 是以可将RTP看成應用層協定.

RTP實作者在發送RTP資料時, 需先将資料封裝成RTP包, 而在接收到RTP資料包, 需要将資料從RTP包中提取出來.

2.2 RTP的封裝

一個協定的封裝是為了滿足協定的功能需求的. 前面提出的功能需求, 可以推測出RTP封裝中應該有

同步源

時戳等

字段, 但更為完整的封裝是什麼樣子呢?請看圖2.

rtp與rtcp協定詳解 1 RTP概述 2 RTP詳解 3 相關的協定 4 常見的疑問 5 實作方案 6 參考資料

 圖 2 RTP的頭部格式

版本号(V) : 2比特, 用來标志使用的RTP版本.

填充位(P) : 1比特, 如果該位置位, 則該RTP包的尾部就包含附加的填充位元組.

擴充位(X) : 1比特, 如果該位置位的話, RTP固定頭部後面就跟有一個擴充頭部.

CSRC計數器(CC) : 4比特, 含有固定頭部後面跟着的CSRC的數目.

标記位(M) : 1比特,該位的解釋由配置文檔(Profile)來承擔.

載荷類型(PT) : 7比特, 辨別了RTP載荷的類型.

序列号(SN) : 16比特, 發送方在每發送完一個RTP包後就将該域的值增加1, 接收方可以由該域檢測包的丢失及恢複包序列. 列号的初始值是随機的.

時間戳 : 32比特, 記錄了該包中資料的第一個位元組的采樣時刻. 一次會話開始時, 時間戳初始化成一個初始值. 使在沒有信号發送時, 時間戳的數值也要随時間而不斷地增加(時間在流逝嘛). 間戳是去除抖動和實作同步不可缺少的.

同步源辨別符(SSRC) : 32比特, 同步源就是指RTP包流的來源. 同一個RTP會話中不能有兩個相同的SSRC值. 辨別符是随機選取的 RFC1889推薦了MD5随機算法.

貢獻源清單(CSRC List) : 0~15項, 每項32比特, 用來标志對一個RTP混合器産生的新包有貢獻的所有RTP包的源. 混合器将這些有貢獻的SSRC辨別符插入表中. SRC辨別符都被列出來, 以便接收端能正确指出交談雙方的身份.

2.3 RTCP的封裝

RTP需要RTCP為其服務品質提供保證, 是以下面介紹一下RTCP的相關知識.

RTCP的主要功能是: * 服務品質的監視與回報 * 媒體間的同步 * 多點傳播組中成員的辨別. RTP會話期間, 各參與者周期性地傳送RTCP包. TCP包中含有已發送的資料包的數量, 丢失的資料包的數量等統計資料, 是以, 各參與者可以利用這些資訊動态地改變傳輸速率, 甚至改變有效載荷類型. RTP和RTCP配合使用, 它們能

以有效的回報和最小的開銷使傳輸效率最佳化, 因而特别适合傳送網上的實時資料

.

RTCP也是用UDP來傳送的, 但RTCP封裝的僅僅是一些控制資訊, 因而分組很短, 是以可以将多個RTCP分組封裝在一個UDP包中.

TCP有如下五種分組類型.

| 類型| 縮寫表示                       | 用途    |
|-----|--------------------------------|-------|
| 200 | SR(Sender Report)              | 發送端報告 |
| 201 | RR(Receiver Report)            | 接收端報告 |
| 202 | SDES(Source Description Items) | 源點描述  |
| 203 | BYE                            | 結束傳輸  |
| 204 | APP                            | 特定應用  |

表1 RTCP的5鐘分組類型
           

上述五種分組的封裝大同小異, 下面隻講述SR類型, 而其它類型請參考RFC3550.

發送端報告分組SR(Sender Report) 用來使發送端以多點傳播方式向

所有接收端

報告發送情況. SR分組的主要内容有: 相應的RTP流的SSRC, RTP流中最新産生的RTP分組的時間戳和NTP, RTP流包含的分組數, RTP流包含的位元組數. SR包的封裝如圖3所示.

rtp與rtcp協定詳解 1 RTP概述 2 RTP詳解 3 相關的協定 4 常見的疑問 5 實作方案 6 參考資料

 圖3 RTCP頭部的格式

版本(V) : 同RTP標頭域.

填充(P) : 同RTP標頭域.

接收報告計數器(RC) : 5比特, 該SR包中的接收報告塊的數目, 可以為零.

包類型(PT) : 8比特, SR包是200.

長度域(Length) : 16比特, 其中存放的是該SR包以32比特為機關的總長度減一.

同步源(SSRC) : SR包發送者的同步源辨別符. 對應RTP包中的SSRC一樣.

NTP Timestamp(Network time protocol) SR包發送時的絕對時間值. NTP的作用是同步不同的RTP媒體流.

RTP Timestamp : 與NTP時間戳對應, 與RTP資料包中的RTP時間戳具有相同的機關和随機初始值.

Sender's packet count : 從開始發送包到産生這個SR包這段時間裡, 發送者發送的RTP資料包的總數. SRC改變時, 這個域清零.

Sender's octet count : 從開始發送包到産生這個SR包這段時間裡, 發送者發送的淨荷資料的總位元組數(不包括頭部和填充). 發送者改變其SSRC時, 這個域要清零.

同步源n的SSRC辨別符 : 該報告塊中包含的是從該源接收到的包的統計資訊.

丢失率(Fraction Lost) : 表明從上一個SR或RR包發出以來從同步源n(

SSRC_n

)來的RTP資料包的丢失率.

累計的包丢失數目 : 從開始接收到

SSRC_n

的包到發送SR,從

SSRC_n

傳過來的RTP資料包的丢失總數.

收到的擴充最大序列号 : 從

SSRC_n

收到的RTP資料包中最大的序列号,

接收抖動(Interarrival jitter) : RTP資料包接受時間的統計方差估計

上次SR時間戳(Last SR,LSR) : 取最近從

SSRC_n

收到的SR包中的NTP時間戳的中間32比特. 如果目前還沒收到SR包, 則該域清零.

上次SR以來的延時(Delay since last SR,DLSR) : 上次從

SSRC_n

收到SR包到發送本報告的延時.

2.4 RTP的會話過程

當應用程式建立一個RTP會話時, 應用程式将确定一對目的傳輸位址. 目的傳輸位址由一個網絡位址和一對端口組成, 有兩個端口: 一個給RTP包, 一個給RTCP包, 使得RTP/RTCP資料能夠正确發送. RTP資料發向偶數的UDP端口, 而對應的控制信号RTCP資料發向相鄰的奇數UDP端口(偶數的UDP端口+1), 這樣就構成一個UDP端口對. RTP的發送過程如下, 接收過程則相反.

  1. RTP協定從上層接收流媒體資訊碼流(如H.263), 封裝成RTP資料包; RTCP從上層接收控制資訊, 封裝成RTCP控制包.
  2. RTP将RTP 資料包發往UDP端口對中偶數端口; RTCP将RTCP控制包發往UDP端口對中的接收端口.

3 相關的協定

3.1 實時流協定RTSP

實時流協定RTSP(Real-Time Streaming Protocol)是IETF提出的協定, 對應的RFC文檔為RFC2362.

從圖1可以看出, RTSP是一個應用層協定(TCP/IP網絡體系中). 以C/S模式工作, 它是一個多媒體播放控制協定, 主要用來使使用者在播放流媒體時可以像操作本地的播放器一樣進行控制, 即可以對流媒體進行

播放

暫停/繼續

後退

前進

等控制.

3.2 資源預定協定RSVP

資源預定協定RSVP(Resource Reservation Protocol)是IETF提出的協定, 對應的RFC文檔為RFC2208.

從圖1可以看出, RSVP工作在IP層之上傳輸層之下, 是一個網絡控制協定. RSVP通過在路由器上預留一定的帶寬, 能在一定程度上為流媒體的傳輸提供服務品質. 某些試驗性的系統如網絡視訊會議工具vic中就內建了RSVP.

4 常見的疑問

怎樣重組亂序的資料包

可以根據RTP包的序列号來排序.

怎樣獲得資料包的時序

可以根據RTP包的時間戳來獲得資料包的時序.

聲音和圖像怎麼同步

根據聲音流和圖像流的相對時間(即RTP包的時間戳), 以及它們的絕對時間(即對應的RTCP包中的RTCP), 可以實作聲音和圖像的同步.

接收緩沖和播放緩沖的作用

接收緩沖用來排序亂序了的資料包; 播放緩沖用來消除播放的抖動, 實作等時播放.

5 實作方案

rtp與rtcp協定詳解 1 RTP概述 2 RTP詳解 3 相關的協定 4 常見的疑問 5 實作方案 6 參考資料

 表2 協定分析要求

表2給出了協定分析要求. 容易看出要擷取RTP音頻包中的音頻資訊很容易, 直接将RTP包的標頭去掉即可. 當然, 要成功地播放解碼擷取到的音頻流, 需要知道其編碼, 這可從RTP包標頭的有效載荷類型字段(PT)獲得.

6 參考資料

  • RFC文檔: RFC3550對應RTP/RTCP, RFC2362對應RTSP, RFC2208對應RSVP
  • http://www.faqs.org/rfcs/, 上面有全面的英文RFC文檔
  • http://www.cnpaf.net/, 有不少協定分析文檔, 也有中文RFC文檔, 但品質不是特别高.