這些阻礙將隨著 Windows Vista? 和附帶的 .NET Framework 3.0 版本的發(fā)布而明顯改善。在將 Windows Vista 的增強(qiáng)功能與“對(duì)等名稱解析協(xié)議”(PNRP)、People Near Me (PNM) 和 Windows? Communication Foundation 中引進(jìn)的 PeerChannel 功能相結(jié)合的情況下,我們又向 P2P 應(yīng)用程序跨進(jìn)了一大步。我個(gè)人期望在發(fā)布 Windows Vista 之后,P2P 的舞臺(tái)會(huì)更加絢麗多彩。
Windows Vista 中的 P2P 開發(fā)是一個(gè)極其廣泛的主題,沒有任何一篇文章可以將其闡述完整。因此,我不會(huì)去嘗試完成這樣一個(gè)不可能的任務(wù),而是會(huì)介紹 Windows Vista 中一些不同的 P2P 技術(shù),并為您對(duì) P2P 開發(fā)工作提供背景資料。
除了假定您已基本了解 Windows 窗體之外,我還假設(shè)您已略微熟悉 Windows Communication Foundation 應(yīng)用程序的編寫。假如情況并非如此,您可能希望通過閱讀 Windows SDK 或 wcf.netfx3.com/content/resources.aspx 中的部分內(nèi)容開始起步。
P2P 基本原理:網(wǎng)格網(wǎng)絡(luò)
在深入探討具體的 P2P 技術(shù)之前,研究 P2P 應(yīng)用程序的一些基本原理很重要。對(duì)初學(xué)者而言,P2P 應(yīng)用程序是一個(gè)與該應(yīng)用程序的其他實(shí)例直接相連的應(yīng)用程序。在 P2P 語言中,該應(yīng)用程序的每個(gè)實(shí)例都叫做一個(gè)節(jié)點(diǎn)。通常將這些節(jié)點(diǎn)連接和命名后的組合稱為網(wǎng)格。因此,推動(dòng) P2P 應(yīng)用程序開發(fā)的技術(shù)經(jīng)常被稱作網(wǎng)格技術(shù)。PNRP、PeerChannel(在 Windows Communication Foundation 中)和 PNM 都是 Windows Vista 中網(wǎng)格技術(shù)的例子。
網(wǎng)格技術(shù) 所有 Windows Vista 網(wǎng)格技術(shù)所生成的網(wǎng)格在拓?fù)浣Y(jié)構(gòu)上都大致相同。通常來講,網(wǎng)格拓?fù)涫蔷W(wǎng)格中各節(jié)點(diǎn)間連接模式的抽象體現(xiàn)。為了解釋清楚,請(qǐng)?jiān)谀X海中設(shè)想一個(gè)網(wǎng)格。我敢斷定,您所設(shè)想的網(wǎng)格在某種程度上與圖 1 中所示的網(wǎng)格相似。
圖 1 全連接網(wǎng)格
圖 1 所示網(wǎng)格中四個(gè)節(jié)點(diǎn)中的每個(gè)節(jié)點(diǎn)都與網(wǎng)格中的其他所有節(jié)點(diǎn)相連。換言之,假如網(wǎng)格中有 N 個(gè)節(jié)點(diǎn),則每個(gè)節(jié)點(diǎn)都保持 N-1 個(gè)連接。我們將達(dá)到此標(biāo)準(zhǔn)的網(wǎng)格視為全連接網(wǎng)格。全連接網(wǎng)格很少被用作適合的方法;要了解原因,讓我們注重一下各節(jié)點(diǎn)間的連接。
網(wǎng)格中的節(jié)點(diǎn)基本上都使用現(xiàn)有的常用傳輸方式進(jìn)行通信。與所有的現(xiàn)代操作系統(tǒng)一樣,Windows Vista 利用 TCP/ip 和 UDP 進(jìn)行網(wǎng)絡(luò)通信。假如 TCP/IP 是全連接網(wǎng)格所選的傳輸方式,那么由 N 個(gè)節(jié)點(diǎn)組成的全連接網(wǎng)格中的每個(gè)節(jié)點(diǎn)都必須創(chuàng)建或接收 N-1 個(gè)套接字。隨著 N 值的增加,此模型顯然變得不可行。例如,假如假定一個(gè) N=1000 的情況,那么每個(gè)節(jié)點(diǎn)都將需要保持 999 個(gè)套接字,這簡(jiǎn)直就行不通。
要解決可伸縮性和 WAN 連接性的問題,您必須訴諸于部分連接的網(wǎng)格,如圖 2 中所示。顧名思義,部分連接網(wǎng)格中的節(jié)點(diǎn)只與網(wǎng)格中的其他少量節(jié)點(diǎn)相連。就 P2P 來說,這些相鄰的節(jié)點(diǎn)被稱作鄰居。通常來說,部分連接網(wǎng)格對(duì)每個(gè)節(jié)點(diǎn)的資源需求更少,從而大幅提高了網(wǎng)格的可伸縮性。從理論上講,部分連接網(wǎng)格的規(guī)??梢詳U(kuò)大到包括全球所有計(jì)算機(jī)上的所有應(yīng)用程序。
顧名思義,PNRP 旨在基于網(wǎng)格名等要素來解析物理地址。PNRP 可供帶有 Advanced Networking Pack 的 Windows xp Service Pack 1 (SP1) 以及 Windows XP SP2 和 Windows XP PRofessional x64 Edition 使用。Windows Vista 也將附帶 PNRP 版本 2。從最簡(jiǎn)單的層次看,PNRP 本身就是一個(gè)采用 Windows 服務(wù)形式的 P2P 應(yīng)用程序,并且 PNRP 節(jié)點(diǎn)的網(wǎng)格專用于發(fā)現(xiàn)加入到其他網(wǎng)格中的節(jié)點(diǎn)的物理地址。(有關(guān)此方面的具體信息,請(qǐng)參見提要欄中的“在 Windows XP 上安裝 PNRP”。)
Windows Communication Foundation 的主要優(yōu)點(diǎn)之一就是,它為許多不同類型的分布式應(yīng)用程序提供了一個(gè)通用的編程模型。例如,編寫一個(gè)基于 TCP/IP 通過二進(jìn)制編碼消息進(jìn)行通信的分布式應(yīng)用程序所需的代碼與編寫一個(gè)基于 HTTP 通過符合 WS-* 的可互操作的消息進(jìn)行通信的分布式應(yīng)用程序所需的代碼驚人地相似。Windows Communication Foundation 的一個(gè)鮮為人知的功能就是它支持使用這同一個(gè)通用編程模型來構(gòu)建 P2P 應(yīng)用程序。由于 Windows Communication Foundation 對(duì) P2P 應(yīng)用程序的支持,可能會(huì)有人將其視為一種網(wǎng)格技術(shù),但實(shí)際上,只有 PeerChannel Windows Communication Foundation 模塊才專用于構(gòu)建 P2P 應(yīng)用程序。因此,PeerChannel 這個(gè)術(shù)語通常用于指代 Windows Communication Foundation 的 P2P 功能。無論 Windows Communication Foundation 中的 PeerChannel 指代的是什么,它實(shí)際上消除了通常與 P2P 應(yīng)用程序開發(fā)相伴的所有復(fù)雜性,并且在我看來,它是 P2P 應(yīng)用程序開發(fā)領(lǐng)域的一個(gè)創(chuàng)新性突破。
如前所述,PeerChannel 節(jié)點(diǎn)還可以將消息發(fā)送給網(wǎng)格中節(jié)點(diǎn)的子集。這可以通過向消息分配一個(gè)跳躍計(jì)數(shù)來實(shí)現(xiàn),這實(shí)際上是跟蹤轉(zhuǎn)發(fā)消息所經(jīng)由的節(jié)點(diǎn)數(shù)的方式。不要將這種機(jī)制與定向消息傳送相混淆,定向消息傳送是將消息傳送目標(biāo)鎖定在某個(gè)特定節(jié)點(diǎn)。更確切地說,跳躍計(jì)數(shù)是模糊界定接收消息的節(jié)點(diǎn)數(shù)的方式。例如,假如一個(gè) PeerChannel 節(jié)點(diǎn)(節(jié)點(diǎn) A)有三個(gè)鄰居且在跳躍計(jì)數(shù)為 1 的情況下向網(wǎng)格發(fā)送一個(gè)消息,則該消息將被傳送到三個(gè)節(jié)點(diǎn)。同樣,假如節(jié)點(diǎn) A 的每個(gè)鄰居也都有三個(gè)唯一鄰居且節(jié)點(diǎn) A 在跳躍計(jì)數(shù)為 2 的情況下向網(wǎng)格發(fā)送一個(gè)消息,則該消息將被傳送到九個(gè)節(jié)點(diǎn)。但假如節(jié)點(diǎn) A 的任一鄰居有共用的鄰居,則此數(shù)字將相應(yīng)減少。 QQread.com 推出各大專業(yè)服務(wù)器評(píng)測(cè) Linux服務(wù)器的安全性能 SUN服務(wù)器 HP服務(wù)器 DELL服務(wù)器 IBM服務(wù)器 聯(lián)想服務(wù)器 浪潮服務(wù)器 曙光服務(wù)器 同方服務(wù)器 華碩服務(wù)器 寶德服務(wù)器 從物理上說,跳躍計(jì)數(shù)在消息中被表示為標(biāo)頭塊中的一個(gè)整數(shù)。當(dāng)某節(jié)點(diǎn)收到帶有跳躍計(jì)數(shù)的消息時(shí),它會(huì)檢查跳躍計(jì)數(shù)的值。假如該值大于零,節(jié)點(diǎn)會(huì)單調(diào)遞減此跳躍計(jì)數(shù),然后將帶有遞減后的跳躍計(jì)數(shù)值的消息轉(zhuǎn)發(fā)給相應(yīng)鄰居。假如所接收消息中包含的跳躍計(jì)數(shù)為 0,則不轉(zhuǎn)發(fā)該消息。另需注重的重要一點(diǎn)是,跳躍計(jì)數(shù)標(biāo)頭塊被排除在消息簽名之外,因此更改這個(gè)值不會(huì)影響到應(yīng)用于消息的數(shù)字簽名的完整性,而且會(huì)防止產(chǎn)生與重復(fù)生成數(shù)字簽名并將其序列化到消息相應(yīng)部分中所關(guān)聯(lián)的開銷。
PeerChannel 示例 讓我們用 PeerChannel 和 Windows 窗體來構(gòu)建一個(gè)簡(jiǎn)單的 P2P 應(yīng)用程序,稱之為 PictureViewer。顧名思義,該應(yīng)用程序的用途是答應(yīng)網(wǎng)格中的所有節(jié)點(diǎn)可以查看同一張圖片。從高層次來說,構(gòu)建此應(yīng)用程序所需的步驟如下所示:
1.定義基本的 Windows 窗體樣板代碼。
2.向窗體添加控件。
3.定義必需的 Windows Communication Foundation 服務(wù)合約。
4.編寫連接到網(wǎng)格和從網(wǎng)格接收消息所需的 Windows Communication Foundation 代碼。
5.編寫向網(wǎng)格中其他節(jié)點(diǎn)發(fā)送消息所需的代碼。
圖 3 顯示了完成后的應(yīng)用程序。步驟 1 和 2 是開發(fā)任何 Windows 窗體應(yīng)用程序時(shí)所必需的步驟,因此我將不在這里對(duì)其說明。對(duì)于任何 Windows Communication Foundation 應(yīng)用程序,開發(fā)過程的第一步是定義服務(wù)合約。PeerChannel 要使用的服務(wù)合約類似于其他 Windows Communication Foundation 合約,只不過 PeerChannel 需要所有的 OperationContractAttribute 批注都將 IsOneWay 實(shí)例屬性設(shè)置為 true。此屬性規(guī)定消息的接收方不應(yīng)發(fā)送回復(fù)。假如想要接收方發(fā)送回復(fù),可以將服務(wù)合約定義為雙向合約,但每個(gè) OperationContractAttribute 批注仍必須將 IsOneWay 實(shí)例屬性設(shè)置為 true。就此例而言,我不會(huì)創(chuàng)建一個(gè)雙向合約(Windows SDK 中有幾個(gè)雙向合約的示例)。我要使用的合約如下所示:
在定義了我們的服務(wù)合約后,現(xiàn)在就該添加 Windows Communication Foundation 代碼,該代碼會(huì)將我們的應(yīng)用程序連接到 PeerChannel 網(wǎng)格并且被動(dòng)等待來自網(wǎng)格的消息。首先,在窗體中實(shí)現(xiàn)新定義的服務(wù)合約。然后,定義類型 ServiceHost 的字段。所接收的消息將被發(fā)送到 frmPictureViewer 類型的單個(gè)實(shí)例。要表明此功能,我必須將正確的 ServiceBehavior 分配給 frmPictureViewer 類型。這兩個(gè)步驟如圖 4所示。
接下來,我必須對(duì) ServiceHost 進(jìn)行實(shí)例化,添加端點(diǎn)并開始偵聽外來的消息。由于我正在構(gòu)建 Windows 窗體應(yīng)用程序,因此實(shí)現(xiàn)此操作的邏輯位置就是窗體的構(gòu)造函數(shù),如圖 5 所示。
此時(shí),我已經(jīng)完成了要連接到網(wǎng)格并偵聽消息所需的所有步驟。與標(biāo)準(zhǔn)的 Windows Communication Foundation 代碼相比,不同之處只在于 Uri 的方案 (net.p2p)、所使用的綁定 (NetPeerTcpBinding) 以及所增添的基于密碼的安全性。請(qǐng)注重,我已選擇將網(wǎng)格密碼直接置于代碼中,這一點(diǎn)很重要。假如想要使網(wǎng)格密碼保密,請(qǐng)不要在您當(dāng)前所使用的應(yīng)用程序中如此操作。
要將包含圖片的消息發(fā)送到網(wǎng)格中的其他節(jié)點(diǎn),我必須編寫幾行代碼,但是此代碼與您在其他任何 Windows Communication Foundation 應(yīng)用程序中編寫的代碼幾乎相同。起初,我需要在類型 ChannelFactory 和 IPictureViewer 的窗體中定義一些字段。接下來,我需要在窗體的構(gòu)造函數(shù)中將這些變量實(shí)例化。這些步驟如圖 6 所示。
請(qǐng)注重,所使用的網(wǎng)格密碼和證書(用于創(chuàng)建消息的數(shù)字簽名)與設(shè)置 ServiceHost 時(shí)所用的必須是同一個(gè)。除此之外,此代碼要與非 PeerChannel Windows Communication Foundation 應(yīng)用程序中所需的代碼相同。
PNM 是集成在 Windows Vista 之中的一種網(wǎng)格技術(shù),它答應(yīng)鄰近的設(shè)備組和人員組相互發(fā)現(xiàn)、連接、邀請(qǐng)并進(jìn)行協(xié)作。PNM 非凡適用于這樣一些任務(wù):在咖啡店與鄰座其他幾個(gè)人一起玩游戲;與同事共享您的桌面;甚至連接到會(huì)議室中的投影儀,等等。PNM 提供的這些功能如此強(qiáng)大,我們有理由假設(shè),一旦它被發(fā)布,開發(fā)人員社區(qū)就將會(huì)找到新的、具有獨(dú)創(chuàng)性的方式來利用此技術(shù)。重要的是,要注重 PNM 是一項(xiàng)完全自選的網(wǎng)格技術(shù),在默認(rèn)情況下是關(guān)閉狀態(tài)。
除其他應(yīng)用程序之外,PNM 體系結(jié)構(gòu)包含了一個(gè)稱為 p2phost.exe 的 P2P 應(yīng)用程序。此進(jìn)程運(yùn)行時(shí),將通過連接到其他計(jì)算機(jī)上 p2phost.exe 的實(shí)例來創(chuàng)建網(wǎng)格。通常而言,此網(wǎng)格的用途是定向消息傳送。更確切地說,PNM 用于解析本地節(jié)點(diǎn)并與這些本地節(jié)點(diǎn)的子集進(jìn)行通信。PNM API 作為 Windows API 的一部分提供,并且多半程度上側(cè)重于配置 p2phost.exe 的行為。
總的來說,PNM API 的主要類別包括函數(shù)、結(jié)構(gòu)、事件和錯(cuò)誤代碼,通過這些類別可以向 PNM 注冊(cè)應(yīng)用程序、邀請(qǐng)其他人加入?yún)f(xié)作會(huì)話、啟動(dòng)已注冊(cè)的應(yīng)用程序、創(chuàng)建持久性合約并邀請(qǐng)不再屬于本地的聯(lián)系人。提要欄中的“真實(shí)環(huán)境中 People Near Me 的示例”將例示此過程。請(qǐng)注重,不支持應(yīng)用程序使用 PNM 進(jìn)行通信。就 PictureViewer 而言,這表示在提要欄中說明的 Tom 和 Harry 的 PictureViewer 實(shí)例之間傳遞的消息仍由 PeerChannel 來處理。
結(jié)束語
P2P 應(yīng)用程序開發(fā)是一個(gè)涉及范圍非常廣泛的主題,并且對(duì)于多數(shù)開發(fā)人員而言還相當(dāng)生疏。隨著 Windows Vista 和 .NET Framework 3.0 的發(fā)布,P2P 應(yīng)用程序的傳統(tǒng)開發(fā)門檻將明顯降低。我相信,技術(shù)的進(jìn)步(如 PNRP、IPv6)加上更具生產(chǎn)力的新型平臺(tái)的問世(如 PeerChannel 和 PNM)將在 P2P 應(yīng)用程序開發(fā)領(lǐng)域開創(chuàng)一個(gè)新時(shí)代。最終,應(yīng)用程序?qū)⒏邊f(xié)作性,并提供我們起初只能想像的一些功能。