Transports, Channels, and Connections(傳輸、通道、鏈接)
每個p2pTransportChannel代表了本地機與遠程機的數據通道。這個通道實際上包含著(隱藏著)一個設計復雜而健壯的體系。P2PTransportChannel管理著大量的不同的Connection對象,每個對象代表了一個不同種類的鏈接(UDP,TCP等)。一個Connection對象實際上封裝了一對對象:一個Port子類,代表了本地鏈接,和一個代表遠程機的地址。如果一個鏈接無效,P2pTransportChannel會立即切換到下個最佳的鏈接上(即從候選鏈接中選一個最佳的)。
下面的圖是數據路徑在p2p組件內部的高層抽象。
當libjingle和遠程機協商一個鏈接時,libjingle就會在本地創建一個鏈表,用來儲存所有潛在鏈接點,這潛在的鏈接點稱作“candidates”(候選),本地的每個候選被一個Port對象封裝,此Port對象被PortAllocator子類分配。本地的Port對象是在發起方在發送鏈接請求之前被創建,或接收方收到一個鏈接請求后被創建(如果Port對象鏈表己經被生成,不論這個鏈表是怎么創建的,只要有就行)。當P2PTransportChannel收到另外一個計算機的鏈接請求,它就會創建一個Connection對象來封裝每個“遠程候選/本地Port對象”對。
libjingle還定義了一個RawTransport類,此類支持UDP兩端的直接鏈接(在不使用ICE的情況下)。這樣的傳輸方式(鏈接方式)也許在能夠創建UDP直連條件下或UDP的任何一方不支持ICE機制下被使用。
P2PTtransportChannel 創建和管理多個Connection對象。P2PtransportChannel根據可寫入性和優先級(比如:UDP的優級先比中轉鏈接的高)來選擇最佳的Connection對象使用。
當鏈接異常中斷或性能低下時,上述情況就會隨之發生,P2PTransportChannel立刻會切換到下一個Connection對象上,并且這種切換對上層是透明的。
P2PTransport(圖中未顯示)是p2p數據體系上的抽象度較高的創建者和管理者。它創建和管理P2PTransportChannel,并且監視它的性能,但是實際上P2PTransport不處理數據;數據的真正進入點是P2PTransportChannel。VoiceChannel和PseudoTcpChannel都關聯到了P2PTransportChannel并進行數據的讀取和寫入。
Session對象掌管著P2PTransport對象,所以可以要求P2PTransport創建數據通道。盡管Session對象有掌管多個Transport和Transport子類實例的潛力,但是當前版本的代碼只定義和使用了一個P2PTransport子類的實例。