- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
利用Vista和WCF中强大P2P通信功能
命令行参数0.justinsmith即是P2P名。当此命令执行时,PNRP基础结构会生成一个PNRPID,将该PNRPID与P2P名相关联,并为该PNRPID分配一个IPv6和IPv4地址。如果您访问另一台已安装PNRP并已将其启动的计算机,则可以用以下netsh命令解析网格名0.justinsmith:
netshp2ppnrppeer>resolve0.justinsmith
Resolvestarted...
Found:Comment:gonzo
Addresses:[0000:0000:0000:0000:0000:0000:0000:0001]:8350udp
192.168.42.100:8350tcp
现在需要解释一下该解析命令的输出。首先,Comment字段代表注册了0.justinsmith的计算机名称(我在Muppets的基础上为我的计算机命名)。
该字段从netsh自动填充,并且不能用作解析进程的一部分。其次,注意一下分配给该节点的IPv6和IPv4地址。这是netsh和允许通过IPv4网络传送IPv6通信量的Teredo转移技术共同具备的一个功能。诚然,我只是浅显地阐述了PNRP,但我已经表明了PNRP使我可以用P2P名来解析IP地址。
PeerChannel
WindowsCommunicationFoundation的主要优点之一就是,它为许多不同类型的分布式应用程序提供了一个通用的编程模型。例如,编写一个基于TCP/IP通过二进制编码消息进行通信的分布式应用程序所需的代码与编写一个基于HTTP通过符合WS-*的可互操作的消息进行通信的分布式应用程序所需的代码惊人地相似。WindowsCommunicationFoundation的一个鲜为人知的功能就是它支持使用这同一个通用编程模型来构建P2P应用程序。由于WindowsCommunicationFoundation对P2P应用程序的支持,可能会有人将其视为一种网格技术,但实际上,只有PeerChannelWindowsCommunicationFoundation模块才专用于构建P2P应用程序。因此,PeerChannel这个术语通常用于指代WindowsCommunicationFoundation的P2P功能。无论WindowsCommunicationFoundation中的PeerChannel指代的是什么,它实际上消除了通常与P2P应用程序开发相伴的所有复杂性,并且在我看来,它是P2P应用程序开发领域的一个创新性突破。
PeerChannel网格PeerChannel网格是专为消息扩散而设计。但PeerChannel包含了可将消息传播到网格的一部分而不是整个网格的机制。因此,更准确地说,PeerChannel网格是专为多方消息传送而设计。
PeerChannel网格的结构由每个节点所连接的邻居数量所控制。为此,PeerChannel网格会主动维护网格的结构。这种维护的作用就是使网格性能稳健并且分布均匀。更具体点说,网格中的节点会设法将连接的邻居数保持在两到七个之间。这些阈值可使对本地节点的资源需求与保持网格稳健性之间取得平衡。
如果某节点在进入网格时带有三个邻居,然后其中两个邻居离开网格,则该节点将开始一个维护周期以试图获取新的邻居连接。同样,如果一个节点连接的邻居少于七个,则它将接受新连接,直到它具有七个邻居连接时为止。当一个PeerChannel节点连有三个邻居时,则认为它处于理想的连接状态,但一个节点将接受多达七个邻居,以便低于邻居数最低阈值的节点可以迅速获得新的邻居。应注意的是,您的应用程序代码不能更改这些阈值或对网格的维护实施任何控制,这一点很重要。这些细节问题完全由PeerChannel基础结构逐个节点地处理。
PeerChannel提供了PNRP解析程序和自定义解析程序,以供用作预期节点发现网格中已有节点地址的方法。无论选择哪个解析方法,主旨都是一样的:将网格名传递到解析程序并接收网格中其他节点的IP地址列表。一旦解析进程生成地址列表,预期PeerChannel节点就并发连接到每个地址。当PeerChannel网格中已有的某节点收到其中一个连接请求时,它可以接受或拒绝该连接。如果接受该连接,则现有节点会向新连接的节点发送一条欢迎消息,消息中除了其他内容之外,还包含网格中其他节点的地址列表。如果拒绝该连接,则现有节点会向预期节点发送一条拒绝消息,消息中包含拒绝理由以及网格中其他节点的地址列表。
这里的重要一点是,网格名解析(通过PNRP解析程序或自定义解析程序执行)不是向PeerChannel中预期节点返回地址列表的唯一方式。与将网格名解析作为预期节点获取地址的唯一方法相比,此特性可使节点更快速地进入理想的连接状态。此外,这一特性使网格中的节点可对节点拥有的邻居数(这一因素会进而影响网格的稳健性)进行控制。
PeerChannel网格内的通信被调整为尽量减少重复性的消息传递。当网格中的某节点向该网格发送消息时,实际上是在向其邻居发送消息。当收到消息后,每个邻居都会检验该消息,然后将其转发给自己的邻居。如果一个PeerChannel节点从某邻居收到消息,它不会将此消息转发回该邻居。此外,如果一个PeerChannel节点经常从某邻居那里收到先前已收到并处理过的消息,则与该邻居的连接可能会在下一个维护周期中终止。这些功能将通过每个节点上的本地高速缓存来实现。在内部,PeerChannel网格中的每个节点都会对WS-Addressing消息ID的值和传送消息的邻居的标识符进行缓存处理。节点在决定向哪些邻居传送该消息时会检查这个高速缓存。将这些功能相结合后,会将网格调整为以最低的重复率和网络带宽消耗来向网格中的各节点传送消息。
如前所述,PeerChannel节点还可以将消息发送给网格中节点的子集。这可以通过向消息分配一个跳跃计数来实现,这实际上是跟踪转发消息所经由的节点数的方式。不要将这种机制与定向消息传送相混淆,定向消息传送是将消息传送目标锁定在某个特定节点。更确切地说,跳跃计数是模糊界定接收消息的节点数的方式。例如,如果一个PeerChannel节点(节点A)有三个邻居且在跳跃计数为1的情况下向网格发送一个消息,则该消息将被传送到三个节点。同样,如果节点A的每个邻居也都有三个唯一邻居且节点A在跳跃计数为2的情况下向网格发送一个消息,则该消息将被传送到九个节点。但如果节点A的任一邻居有共用的邻居,则此数字将相应减少。
从物理上说,跳跃计数在消息中被表示为标头块中的一个整数。当某节点收到带有跳跃计数的消息时,它会检查跳跃计数的值。如果该值大于零,节点会单调递减此跳跃计数,然后将带有递减后的跳跃计数值的消息转发给相应邻居。如果所接收消息中包含的跳跃计数为0,则不转发该消息。另需注意的重要一点是,跳跃计数标头块被排除在消息签名之外,因此更改这个值不会影响到应用于消息的数字签名的完整性,而且会防止产生与重复生成数字签名并将其序列化到消息相应部分中所关联的开销。
PeerChannel示例让我们用PeerChannel和Windows窗体来构建一个简单的P2P应用程序,称之为PictureViewer。顾名思义,该应用程序的用途是允许网格中的所有节点可以查看同一张图片。从高层次来说,构建此应用程序所需的步骤如下所示:
1.定义基本的Windows窗体样板代码。
2.向窗体添加控件。
3.定义必需的WindowsCommunicationFoundation服务合约。
4.编写连接到网格和从网格接收消息所需的WindowsCommunicationFoundation代码。
5.编写向网格中其他节点发送消息所需的代码。
完成后的应用程序。步骤1和2是开发任何Windows窗体应用程序时所必需的步骤,因此我将不在这里对其说明。对于任何WindowsCommunicationFoundation应用程序,开发过程的第一步是定义服务合约。PeerChannel要使用的服务合约类似于其他WindowsCommunicationFoundation合约,只不过PeerChannel需要所有的OperationContractAttribute批注都将IsOneWay实例属性设置为true。此属性规定消息的接收方不应发送回复。如果想要接收方发送回复,可以将服务合约定义为双向合约,但每个OperationContractAttribute批注仍必须将IsOneWay实例属性设置为true。就此例而言,我不会创建一个双向合约(WindowsSDK中有几个双向合约的示例)。我要使用的合约如下所示:
[ServiceContract]
interfaceIPictureViewer{
[OperationContract(IsOneWay=true)]
voidSharePicture(Streamstream);
}
请注意,SharePicture接口方法用OperationContractAttribute属性加以批注,并且IsOneWay实例属性被设置为true。SharePicture操作将System.IO.Stream视为一个参数,因为此操作将被用于向网格中其他节点传送图片的字节。
在定义了我们的服务合约后,现在就该添加WindowsCommunicationFoundation代码,该代码会将我们的应用程序连接到PeerChannel网格并且被动等待来自网格的消息。首先,在窗体中实现新定义的服务合约。然后,定义类型ServiceHost的字段。所接收的消息将被发送到frmPictureViewer类型的单个实例。要表明此功能,我必须将正确的ServiceBehavior分配给frmPictureViewer类型。这两个步骤如下所示。
来源:微软
上一篇:Goonie互联网舆情研究与监管模式解析
下一篇:测试VoIP呼叫质量