視頻流和文件傳輸相關協議


視頻編碼的兩大流派

  1. ITU(International Telecommunications Union)的VECG(Video Coding Experts Group),這個稱為國際電聯下的 VECG。
  2. ISO(International Standards Organization)的 MPEG(Moving Picture Experts Group),這個是ISO 旗下的 MPEG.

網絡直播

網絡協議將編碼好的視頻流,從主播端推送到服務器,在服務器上有個運行了同樣協議的服務端來接收這些網絡包,從而得到里面的視頻流,這個過程稱為接流。

服務端接到視頻流之后,可以對視頻流進行一定的處理,例如轉碼,也即從一個編碼格式,轉成 另一種格式。因為觀眾使用的客戶端千差萬別,要保證他們都能看到直播。

流處理完畢之后,就可以等待觀眾的客戶端來請求這些視頻流。觀眾的客戶端請求的過程稱為拉流。

當觀眾的客戶端將視頻流拉下來之后,就需要進行解碼,也即通過上述過程的逆過程,將一串串看不懂的二進制,再轉變成一幀幀生動的圖片,在客戶端播放出來

將這個二進制的流打包成網絡包進行發送,這里我們使用RTMP 協議。RTMP 是基於 TCP 的,因而肯定需要雙方建立一個 TCP 的連接。在有 TCP 的連接的基礎上, 還需要建立一個 RTMP 的連接,也即在程序里面,你需要調用 RTMP 類庫的 Connect 函數,顯示創建一個連接。

RTMP作用是主要確認兩個事情:,一個是版本號, 如果客戶端、服務器的版本號不一致,則不能工作。另一個就是時間戳,視頻播放中,時間是很重要的,后面的數據流互通的時候,經常要帶上時間戳的差值,因而一開始雙方就要知道對方的時間戳。

分發網絡分為中心和邊緣兩層。邊緣層服務器部署在全國各地及橫跨各大運營商里,和用戶距離很近。中心層是流媒體服務集群,負責內容的轉發。智能負載均衡系統,根據用戶的地理位置信息,就近選擇邊緣服務器,為用戶提供推 / 拉流服務。中心層也負責轉碼服務,例如,把RTMP 協議的碼流轉換為 HLS 碼流。

文件傳輸

FTP:文件傳輸協議,采用兩個TCP鏈接來傳輸一個文件。

服務器以被動的方式,打開眾所周知用於 FTP 的端口 21,客戶端則主動發起連接。該連接將命令從客戶端傳給服務器,並傳回服務器的應答。

P2P: P2P就是peer-to-peer。資源開始並不集中地存儲在某些設備上,而是分散地存儲在多台設備上。想要下載一個文件的時候,你只要得到那些已經存在了文件的 peer,並和這些 peer 之間,建立點對點的連接,而不需要到中心服務器上,就可以就近下載文件。一旦下載了文件,你也就成 為 peer 中的一員,你旁邊的那些機器,也可能會選擇從你這里下載文件,所以當你使用 P2P軟件的時候,例如 BitTorrent,往往能夠看到,既有下載流量,也有上傳的流量,也即你自己也加入了這個 P2P 的網絡,自己從別人那里下載,同時也提供給其他人下載。

種子(torrent)文件:由announce(tracker URL)和文件信息組成。

  1. 文件信息:
    • info區:該種子有幾個文件,文件有多長,目錄結構以及目錄和文件的名字
    • name字段:頂層目錄的名字
    • 每個段的大小:BitTorrent協議把一個文件分成很多小段,然后分段下載。
    • 段哈希值:將整個種子中,每個段的SHA-1哈希值拼在一起

下載時,BT 客戶端首先解析.torrent 文件,得到 tracker 地址,然后連接 tracker 服務器。 tracker 服務器回應下載者的請求,將其他下載者(包括發布者)的 IP 提供給下載者。下載者 再連接其他下載者,根據.torrent 文件,兩者分別對方告知自己已經有的塊,然后交換對方沒有 的數據。此時不需要其他服務器參與,並分散了單個線路上的數據流量,因此減輕了服務器的負 擔。

從這個過程也可以看出,這種方式特別依賴 tracker。tracker 需要收集下載者信息的服務器, 並將此信息提供給其他下載者,使下載者們相互連接起來,傳輸數據。雖然下載的過程是非中心 化的,但是加入這個 P2P 網絡的時候,都需要借助 tracker 中心服務器,這個服務器是用來登記有哪些用戶在請求哪些資源。所以,這種工作方式有一個弊端,一旦 tracker 服務器出現故障或者線路遭到屏蔽,BT 工具就無法正常工作了。

DHT(Distributed Hash Table)去中心化網絡:任何一個 BitTorrent 啟動之后,它都有兩個角色。一個是peer,監聽一個 TCP 端口,用來上傳 和下載文件,這個角色表明,我這里有某個文件。另一個角色DHT node,監聽一個 UDP 的端口,通過這個角色,這個節點加入了一個 DHT 的網絡。

在 DHT 網絡里面,每一個 DHT node 都有一個 ID。這個 ID 是一個很長的串。每個 DHT node 都有責任掌握一些知識,也就是文件索引,也即它應該知道某些文件是保存在哪些節點 上。它只需要有這些知識就可以了,而它自己本身不一定就是保存這個文件的節點。

每個文件可以算出一個哈希值,而DHT node的ID是和哈希值相同長度的串,DHT算法規定:如果一個文件計算出一個哈希值,澤合這個哈希值一樣的DHT node,就有責任知道從哪里下載這個文件,即便他自己沒保存。另外,除了一摸一樣的DHT node應該知道,ID和這個哈希值非常接近的N個DHT node也應該知道。

接下來一個新的節點 node new 上線了。如果想下載文件 1,它首先要加入 DHT 網絡,如何加入呢?

在這種模式下,種子.torrent 文件里面就不再是 tracker 的地址了,而是一個 list 的 node 的地址,而所有這些 node 都是已經在 DHT 網絡里面的。當然隨着時間的推移,很可能有退出的,有下線的,但是我們假設,不會所有的都聯系不上,總有一個能聯系上。 node new 只要在種子里面找到一個 DHT node,就加入了網絡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM