RTP基礎之RTP流預判代碼實戰

RTP基礎介紹

實時傳送協議(Real-time Transport Protocol或簡寫

RTP)是一個網絡傳輸協議,其主要用於在互聯網上傳遞音頻和視頻的標準數據包。

RTP基礎之RTP流預判代碼實戰

rtp頭部結構

RTP報文由兩部分組成:報頭和有效載荷。RTP報頭格式如上圖所示,其中:

  1. V:RTP協議的版本號,佔2位,當前協議版本號為2。

  2. P:填充標誌,佔1位,如果P=1,則在該報文的尾部填充一個或多個額外的八位組,它們不是有效載荷的一部分。

  3. X:擴展標誌,佔1位,如果X=1,則在RTP報頭後跟有一個擴展報頭。

  4. CC:CSRC計數器,佔4位,指示CSRC 標識符的個數。

  5. M: 標記,佔1位,不同的有效載荷有不同的含義,對於視頻,標記一幀的結束;對於音頻,標記會話的開始。

  6. PT: 有效載荷類型,佔7位,用於說明RTP報文中有效載荷的類型,如GSM音頻、JPEM圖像等,在流媒體中大部分是用來區分音頻流和視頻流的,這樣便於客戶端進行解析。

  7. 序列號:佔16位,用於標識發送者所發送的RTP報文的序列號,每發送一個報文,序列號增1。這個字段當下層的承載協議用UDP的時候,網絡狀況不好的時候可以用來檢查丟包。同時出現網絡抖動的情況可以用來對數據進行重新排序,在helix服務器中這個字段是從0開始的,同時音頻包和視頻包的sequence是分別記數的。

  8. 時戳(Timestamp):佔32位,時戳反映了該RTP報文的第一個八位組的採樣時刻。接收者使用時戳來計算延遲和延遲抖動,並進行同步控制。

  9. 同步信源(SSRC)標識符:佔32位,用於標識同步信源。該標識符是隨機選擇的,參加同一視頻會議的兩個同步信源不能有相同的SSRC。

  10. 特約信源(CSRC)標識符:每個CSRC標識符佔32位,可以有0~15個。每個CSRC標識了包含在該RTP報文有效載荷中的所有特約信源。

RTP協議棧結構:

如圖從Wireshark抓取到的數據包,我們可以清楚的看到RTP協議棧結構從上到下依次為

RTP/UDP/IP/MAC

RTP基礎之RTP流預判代碼實戰

rtp.pcap

對於MAC層數據,從Type字段,我們可知上層為IP協議還是ARP協議等。

MAC層Type字段表示含義:

RTP基礎之RTP流預判代碼實戰

對於IP層數據,從Protocol字段,我們可知上層協議為UDP還是TCP。

IP層Protocol字段表示含義:

RTP基礎之RTP流預判代碼實戰

但是對於RTP協議層來說,由於UDP協議中沒有攜帶固定的上層數據類型,因此判斷RTP數據只能根據RTP協議的固有特徵來判斷。具體流程如下圖所示。

RTP基礎之RTP流預判代碼實戰

rtp流判別流程

RTP流識別:

話不多說,直接上代碼,基本也就是對上圖的代碼邏輯實現,注意這裡收到的原始數據包為MAC層數據。

RTP基礎之RTP流預判代碼實戰

packet_define.h

RTP基礎之RTP流預判代碼實戰

rtp_identify.c

至此,我們已經完成對原始數據包初步的RTP流預判,當然這樣存在一定的誤判,如果你有更好的方法,記得聯繫我。


分享到:


相關文章: