代码改变世界

WCF 第十二章 对等网 使用PNRP解决对等网络问题

2011-04-23 16:37  DanielWise  阅读(11324)  评论(0编辑  收藏  举报

PNRP是一个允许发布以及发现P2P资源信息的分布式名字解决协议。WCF使用PNRP来在一个网状网络中解析对等节点。这允许在一个对等网状网络中的参与者发现其他参与者以便于它们可以互相通信。这个协议在部分时候已经作为Windows XP一个可选的下载或者作为Windows XP SP2 的一部分。目前当你在Windows Vista中开启对IPv6的支持时会包含PNRP v2.0.PNRP在WCF中对对等通信是重要的,因为它是在一个网状网络中的邻居节点发现彼此的默认方式。

注意 为Windows XP SP2 获取PNRP 2.0
PNRP 2.0 与Windows Vista 一起发布。这是一个新的版本PNRP,它不予旧版本的诸如Windows XP SP2 上的PRNP 客户端兼容。微软在它的支持站点上提供了一份拷贝供下载。这允许运行在Windows XP SP2上的对等应用程序与Windows Vista客户端对话。

  PNRP 基于IPv6创建因此需要先安装IPv6.通过实现一个自定义对等网络处理器你仍然可以在WCF中使用对等网络能力,即便你的网络不支持IPv6。自定一个对等网络处理器允许使用一个自定义解决协议而不是使用默认的PNRP。本章的”实现一个自定义对等网络处理器”将详细介绍如何实现。

  PNRP通过暴露P2P资源信息并让一个对等网状网络中的其他参与者发现自己来工作。资源信息一般包括一个客户端列表以及它们绑定到一个网状网络名字的IP地址终结点。PNRP可以用来存储所有种类的信息;然而,我们将只关注对等传输信道以及它如何使用PNRP;对等传输信道使用PNRP发布消息以使在同样的网状网络上与其他P2P应用通信。发布到PNRP上的信息包括网状网络的名字以及每个节点关联的服务终结点。当另外一个P2P应用启动,它使用PNRP来发现在同样网状网络上的应用程序。

PNRP 引导过程

PNRP使用多个步骤来将自己引导到一个网状网络中(又名 PNRP 云)。这个方法允许一个网状网络中的参与者向网络中注册自己并顺序地发现下一个节点。这个多步骤方法也帮助PNRP在隔离网络(比如相互合作的局域网或者互联网)上的扩展因为它试着减小需要加入一个网状网络所需要的网络传输数量。

1. 检查先前的缓存入口。PNRP为每个宿主维护一个资源终结点的本地缓存。如果一个客户端之前把自己注册到一个特定的网状网络,PNRP将使用那些之前的缓存入口来试着重连网状网络。

2. 简单服务发现协议(Simple Service Discovery Protocol, SSSP). SSDP是允许符合UPnP标准的设备在一个本地网络发现彼此的通用即插即用(Universal Plug-n-Play)规范的一部分。同样的技术可以用来允许对等节点在局域网中发现其他节点。

3. PNRP 种子节点。PNRP客户端可以配置为寻找另外的可以用来作为一个PNRP云引导的PNRP节点。这些类型的节点通常以种子节点引用。微软在因特网pnrpv2.ipv6.microsoft.com上对公共提供了一个种子节点。用来也可以选择在他们自己的网络中选择寄宿他们自己的种子节点。

Windows互联网计算机名称

Windows Vista 允许一个与你计算机关联的名字使用PNRP发布出去。这满足了管理一个域名并向域名服务器(DNS)添加记录的需求。这些名字称为Windows互联网计算机名字(WICN).你可能发现WICN以PNRP对等名字被引用。有两种类型的名字:安全的和非安全的。非安全的名字通常使用一个用户友好的格式比如richshomecomputer.pnrp.net.这些名字很容易记住但是不能保证是安全的。图片12.6描述了使用netsh命令来查询一个计算机的WICN名字。命令行是netsh p2p pnrp peer show machine name.

 

图片12.6 Windows 互联网计算机名称(WICN)

  安全的名字,从另一方面说,就是使用一个私钥加密的名字,它需要提供私钥来证明所有权。安全名字使用公钥的哈希值生成。为了发布一个安全名字你必须有名字中包含的公钥对应的私钥。安全名字的例子如下:

关于WICN名字一个有趣的事实是它们可以使用DNS APIs查询。下面代码显示同样的可以使用DNS查询到的WICN名字。

PnrpPeerResolver

netPeerTcpBinding内建特性有解析一个网状网络内部其他参与者的对等解析器。默认情况,如果没有其他对等解析器被选中netPeerTcpBinding就会选择PnrpPeerResolver类。PnrpPeerResolver类是抽象类PeerResolver类的实现类。这些类可以在System.ServiceModel.Channels命名空间中找到。

网状网络认证

网状网络可以通过设置一个密码或者使用一个与网状网络关联的X.509证书保护。对一个参与到网状网络中的应用程序来说,它必须为网状网络确定正确的密码。网状网络密码允许应用程序注册到一个网状网络并发现网络中的其他参与者。它们不知道一个参与者是否是一个认证了的用户。网状网络密码需要在服务端和客户端同时确定。列白哦12.3显示了一个在ServiceHost上配置的网状网络密码。

列表12.3 在ServiceHost上设置网状网络密码

  设置网状网络密码的相关客户端嗲吗在列表12.4中显示。这个例子使用第三章”信道”中ChannelFactory方法。

列表12.4 在ServiceHost上设置网状网络密码的客户端代码