現在的P2P流媒體主要有兩種架構:
1.基於樹的架構。這是由流媒體的多播演化而來的,也就是播放同一頻道的節點群組成一棵樹,提供廣播的源節點為這棵樹的根。每個節點可以為下層幾個節點提供資料。但這種架構仍然會對上層的結點造成太大的負擔,而且在節點動態加入和退出的情況下樹不易維護。另外還存在傳輸延遲問題,所以樹的高度不能太大。
baidu
2.基於圖(MESH)的架構。通過鄰居發現尋找相關的節點。這種架構可以實現完全非中心化。
Peercast採用的是基於圖的架構。所有Peercast節點都在同一網路中,而且一個Peercast可以同時轉播多個頻道。由於Peercast集合了用戶端和伺服器功能,所以一個Peercast可以同時是廣播者、轉播者和收聽者。
Peercast網路架構可分為三層:
第一層是YP。
YP(yp.peercast.org)從廣播者中收集頻道資訊,是整個網路的根。
第二層是廣播者。
廣播者向YP發送頻道資訊,這樣YP就能有一個完整的廣播者的列表。
第三層是轉播者
轉播者收聽頻道,每個廣播者維護一份轉播者的列表。
P2P流媒體的運行模式
視頻/音頻輸入+編碼器+Peercast+播放器
視/音頻輸入:這是頻道的來源,可以是即時事件(電視),也可以是檔案(MP3/WMV)
編碼器:用於將檔案編碼成更易於傳輸的流格式,可以是SHOUTcast DSP和windows media encoder等
播放器:播放編碼後傳輸的檔案
Peercast:根據其完成的功能可分為下列幾個模組:
1.擷取媒體資料:作為廣播者讀取編碼器發送過來的流資料
2.使用者介面:以GUI和網頁方式提供控制
3.資料傳送:在節點間傳遞控制資訊和頻道流具體資料
4.節點選擇:選擇要進行傳輸的最佳節點
5.緩衝管理:管理流緩衝以實現流媒體下載和播放
6.HTTP伺服器。將流資料用HTTP方式送往播放器
節點的加入與退出:
當一個Peercast節點第一次加入Peercast網路時(點擊yp.peercast.org中特定頻道的PLAY按鈕),例如訪問地址是peercast://pls/EF49346D72FD05F234D3DA2C33FF3A9C?ip=61.213.94.129:2010 。它會先與廣播這個電台的IP(61.213.94.129:2010)建立串連。由於這個廣播者是不變的,所以至少會有一個特定的串連。如果廣播者是滿負荷的,那麼這個節點可以通過這個廣播者同其他轉播同一電台的節點建立串連。
通常會建立8個串連。
在這點上是與Gnutella網路不同的,由於必定存在一個廣播者,所以不必實現Gnutella中關於節點第一次加入網路的機制(GWebCache),而此時廣播者相當於BT軟體的一個原始種子。
與本節點轉播同一頻道的節點(也就是鄰居)的資訊儲存在ChanHitList中,其中ChanHitList是一份ChanHit的鏈表,每個ChanHit儲存一個相關結點的資訊。Hit的意思是你想收聽的頻道的廣播者或轉播者。
擁塞控制:
當output隊列超過50%時進入擁塞控制模式。系統丟棄一些incoming包,並根據包類型和跳樹來給outgoing包區分優先值。當output隊列降到25%時,系統會關閉擁塞控制模式。
轉播時間更久的節點比剛開始轉播的節點擁有更高的優先權,這體現在TTL上。剛開始轉播的節點廣播的包的TTL值為1,而這個TTL值每5分鐘會遞增1。這樣轉播時間超過35分鐘的結點會有著最高的TTL值7。
節點間的通訊:
節點間的通訊通過發送和接收控制資訊包來實現。Peercast專用協議PCP規定了控制資訊包的類型和格式。
ServMgr負責分配、刪除和使用servent對象,每個servent對象負責一個具體的串連,而其中包的發送、接收和解析工作由PCP Stream來實現。
傳輸者的選擇:
在建立初始串連之後,節點需要選擇一個最佳的節點來傳輸頻道資料。選擇的順序依次如下:
1.本地轉播者
2.鄰居轉播者
3.本地廣播者
4.鄰居轉播者
比如說如果找到鄰居轉播者就不用繼續往下找,然後從其中選取出最佳的節點作為傳輸對象,其他作為備用傳輸者。這個最佳可從以下三個方面來衡量:
如果這個傳輸者退出網路,那麼必須重新按上次方法選擇下一個傳輸者。由於備用傳輸者較多,所以當節點動態退出網路時不會造成太大的影響。
緩衝機制:
流(stream):流在Peercast中是一個非常重要的概念。所謂流,就是字串的集合。所以無論是包、視/音頻資料都可以看做是一個流。Peercast的緩衝機制是通過ChanPacketBuffer實現的,裡麵包含有多個ChanPacket,每個ChanPacket封裝了實際的資料。
播放器的讀取:
Peercast會自動調用預設播放器,而播放器讀取由Peercast建立的HTTP內容,如播放URL為http://localhost:7144/stream/65051E037A7A2A3433090065051E037A.ogg