Connections(鏈接)
一個(gè)p2p的鏈接實(shí)際上由兩個(gè)通道組成。
● session negotiation channel(也稱作signaling channel),會(huì)話協(xié)商通道。是為數(shù)據(jù)鏈接服務(wù)的溝通通道。這個(gè)通道被用來回應(yīng)取得一個(gè)鏈接的請求,交換候選,和協(xié)商會(huì)話的細(xì)節(jié)(比如:套接字地址,需要的編碼方案,交換的文件,鏈接改變請求,終止請求)。這個(gè)通道是兩個(gè)計(jì)算機(jī)之間建立的第一個(gè)鏈接,也只有這個(gè)鏈接成功之后,兩個(gè)計(jì)算機(jī)之間的數(shù)據(jù)鏈接才能被建立。libjingle通過發(fā)送一個(gè)指定的前導(dǎo)協(xié)議節(jié)發(fā)出一次響鈴并收到一個(gè)回應(yīng),數(shù)據(jù)鏈接則被建立(see Jingle and libjingle)。這個(gè)通道發(fā)送協(xié)議節(jié)是通過XMPP 服務(wù)器這一中間機(jī)構(gòu)進(jìn)行的,例子中的代碼是把Google Talk服務(wù)器當(dāng)作中間機(jī)構(gòu)用的。
● data channel (婁據(jù)通道,數(shù)據(jù)鏈接)這個(gè)通道傳送的是p2p兩端真正交換的數(shù)據(jù)(語音,視頻,文件等),數(shù)據(jù)通道里的數(shù)據(jù)被TCP或UDP包封裝,到底是TCP還是UDP這要視協(xié)商的傳送方式,這些包并沒有經(jīng)過XMPP服務(wù)器。
會(huì)話協(xié)商通道首先被建立,它作為計(jì)算機(jī)間協(xié)商建立數(shù)據(jù)通道細(xì)節(jié)的通道。數(shù)據(jù)通道被成功建立之后,在這個(gè)通道上將發(fā)生許多數(shù)據(jù)活動(dòng),除非碰到改變編碼請求,新文件請求,重傳請求,或終止請求。
下面的圖演示了這兩種數(shù)據(jù)路徑。盡管只有一個(gè)路徑處于活動(dòng)態(tài),圖中還列出了兩個(gè)路徑的交替使用態(tài)。因?yàn)槁窂娇梢允侵苯渔溄樱?/span>92%的鏈接嘗試都可以轉(zhuǎn)換成直聯(lián))或服務(wù)器中轉(zhuǎn)(8%的鏈接嘗試需要中間服務(wù)器的中轉(zhuǎn))。第三種數(shù)據(jù)路徑?jīng)]有列出,它是沒有防火墻的網(wǎng)絡(luò)中從一臺(tái)計(jì)算機(jī)直接鏈接另一臺(tái)計(jì)算機(jī)。

注意:
1、libjingle不時(shí)地發(fā)送出心跳包(STUN),來維持一個(gè)鏈接可寫入,保持防火墻和NAT地址綁定處于活動(dòng)態(tài),并且還可用來檢查潛在的鏈接。
2、linjingle向鏈接端口分配用戶名和密碼。此舉用來確定當(dāng)前鏈接的數(shù)據(jù)通道就是在會(huì)話協(xié)商通道上協(xié)商好的數(shù)據(jù)通道。因?yàn)橛脩裘兔艽a是被XMPP發(fā)出的,也許沒有經(jīng)過TLS的加密,心跳包中的用戶名和密碼只是身份的標(biāo)識(shí),并沒有加密驗(yàn)證。
運(yùn)行 file share 例子程序,可以看到發(fā)出的真實(shí)協(xié)議節(jié)。