对等名称解析协议(Peer Name Resolution Protocol, PNRP),完成对等名称的注册和解析。
1)对等节点名称和 PNRP ID
要实现 P2P 网络内的资源发现,必须能够准确地区分各个不同的资源,在 PRNP 协议中,将每个网络资源抽象为对等节点,并给每个对等节点取个名字,即对等节点名称。该名称由用户自定义的用于标识对等节点的字符串组成。
对等节点名称简称对等名,有安全的和不安全的两种形式。
对等名的格式为 Authority.Classifier。即每个对等名字符串都有一个 Authority 节,后面跟一个点号,然后是一个 Classifier 节。
Authrity 的值取决于该名称的安全类型。对于不安全的名称,Authority 为单字符 “0” 而对于安全的名称,Authority 由 40 个十六进制字符构成。
Classifier 节用于用户自定义的标志对等节点的字符串,最大长度可以是 150 个 Unicode 字符。
为了解析方便,当向群中注册 P2P 对等名时,PNRP 根据对等名生成长度为 256 位的数字,即 PNRP ID。PNRP ID 由 P2P ID 和服务器地址信息两部分构成,格式规定如图 5-4 所示。
P2P ID:转换自对等名的 128 位数字标识符。
位置服务:由于任何节点都可以注册一个名称相同的不安全名称,因此 PNRP 规定每个 PNRP ID 中都生成一个由128位数字来区分相同群中相同 P2P ID 的不同实例。
2)云(Cloud)
安装了相同 P2P 软件的计算机必须加人一个共同的 P2P 网络中,才能相互识别各自拥有的资源并顺利进行 P2P 通信。PNRP 协议将这个 P2P 网络称为“云”。云是指一组可以通过 P2P 网络相互识别的对等节点及其上资源的集合。
PNRP 目前使用两种云:连接一本地云和全局云。全局云基于 IPv6 协议,并不支持 IPv4,整个 IPv6 互联网仅有一个全局云,代表 IPv6 互联网上的所有对等节点及其资源。
云有常见的 4 种状态。
(1)活动状态:当云处于活动状态时,对等节点处于连接状态并且有其他对等节点注册到该云中。如果云处于活动状态,则可以随时注册和解析名称。
(2)单独状态:当云处于单独状态时,云中除了自身之外没有其他 PNRP 对等节点。如果链接一本地云中仅有自身一个对等节点,则云处于单独状态。如果全局云处于单独状态,则表示没有连接上种子服务器,这时需要检查是否有防火墙阻止了上行请求数据包。
(3)虚拟状态:如果云创建之后,长时间没有使用或者从未使用,则云将从活动或单独状态转为虚拟状态。
(4)正在同步:当准备启动但是尚未启动成功时,云会暂时处于正在同步状态。这种状态属于暂态。
任何资源若要被网络上的其他主机识别到,首先必须注册到 P2P 网络。名称注册就是将包含对等节点信息的对等名发布到云中,以便其他对等节点解析。
名称解析是指利用对等名称获取注册到云中的资源所在对等节点的 IP 地址和端口号。
PNRP 中没有使用索引服务器,为了完成解析,云中的每个对等节点都存储一些 PNRP ID 的缓存条目。PNRP 缓存中的每个条目都含有 PNRP ID 及应用程序的 IP 地址和端口号。名称解析时,首先在本地计算机对等节点的缓存中查找目标节点,如果没有则在缓存中的邻近节点查找,依此类推,直到找到目标节点。PNRP 名称解析过程如图 5-5 所示。
System.Net.PeerToPeer 命名空间中提供了支持 PNRP 的基本类,通过这些类,编程人员可以方便地实现对等名称的注册,还可以将对等名称解析为IP地址和端口号。.NET Framework 3.5 中还增加了能够方便实现 PNRP 的类,所以要确保使用 3.5 及其以上版本。表 5-1 列出了 System.Net.PeerToPeer 命名空间中的常用类。
| System.Net.PeerToPeer 命名空间中的常用类 | |
| 类名 | 说明 |
| Peer 类 | 表示远程对等节点 |
| Cloud 类 | 用来定义云对象的值,利用该类可以查看本机参与的所有云信息 |
| PeerName 类 | 指定用来定义对等节点的相关值 |
| PeerNameRecord 类 | PeerNameRecord 包含在解析过程查询的 Cloud 或多个云中注册的 PeerName 的所有信息 |
| PeerNameRecordCollaboration 类 | 表示 PeerNameRecord 元素的容器 |
| PeerNameRegisteration 类 | 在一个 Cloud 或一组云中注册 PeerName |
| PeerNameResolver 类 | 指定使用 PNRP 命名空间提供的 API 将 PeerName 解析为 PeerNameRecord 的值 |
| Cloud 类的部分方法及属性 | |
| 名称 | 说明 |
| Global 属性 | 静态属性,获取一个Cloud实例,其中包含全局(Internet)范围的对等节点 |
| Name 属性 | 获取对等 Cloud 的名称 |
| Scope 属性 | 获取对等 Cloud 的网络范围 |
| ScopeId 属性 | 获取此对等 Cloud 的特定 IP 地址的标识符 |
| Available 字段 | 返回对 Cloud (表示客户端当前参与的所有可用的云)的静态引用 |
| AllLinkLocal 字段 | 返回对 Cloud (表示对等节点当前参与的所有链接--本地云)的引用 |
| GetAvailableClouds 方法 | 获取调用对等节点已知的对等云的集合 |
| PeerName 类的常用方法及属性 | |
| 名称 | 说明 |
| PeerName(String) | 使用提供的完全限定对等名称 String 值初始化 PeerName 类型的新对象 |
| PeerName(String, PeerNameType) | 初始化 PeerName 类的新实例 |
| Authority | 返回一个字符串,该字符串指定此 PeerName 对象使用的 Authority |
| Classifier | 返回一个字符串,其中包含对等 PeerName 的分类器 |
| lsSecured | 获取一个布尔值,该值指定这是否为一个安全的对等名称 |
| PeerHostName | 获取对等主机的名称。这是 DNS 编码版本的 PeerName,它相当于 PeerHostName,因为它们都是标识符。二者之间的不同之处在于可视化表示形式 |
| PeerNameRegisteration 类的常用属性和方法 | |
| 名称 | 说明 |
| Cloud 属性 | 获取或设置要在其中注册 PeerName 对象的 Cloud 信息 |
| Comment 属性 | 获取或设置将要在 Cloud 中注册的 PeerName 对象的其他信息 |
| Data 属性 | 获取或设置 PeerNameRegistration 对象的应用程序定义的二进制数据 |
| EndPointCollection 属性 | 获取为其注册关联对等名称的网络终结点的集合 |
| PeerName 属性 | 获取或设置要向对等群注册的对等名称 |
| Port 属性 | 获取或设置正在 PeerNameRegistration 对象中注册的对等节点使用的 TCP/IP 端口号 |
| UseAutoEndPointSelection 属性 | 获取或设置一个值,该值指定当遍历对等网络或 Cloud 时是否使用自动终结点选择 |
| Start 方法 | 启动注册 |
| Stop 方法 | 停止注册 |
| PeerNameRecord 类的部分常用属性 | |
| 名称 | 说明 |
| Comment 属性 | 获取或设置有关 PeerNameRecord 对象的其他信息 |
| Data 属性 | 获取或设置 PeerNameRecord 对象的应用程序的二进制数据 |
| EndPointCollection 属性 | 获取 PeerEndPointCollection 对象,该对象包含可供与此 PeerNameRecord 对象关联的对等节点使用的所有终结点 |
| PeerName 属性 | 获取或设置此 PeerNameRecord 对象中的 PeerName。对等名称是用于标识对等资源的字符串 |
PeerNameResolver 类
PeerNameResolver 类提供了将 PeerName 解析成一组 PeerNameRecord 对象的方法,还提供了同步及基于事件的异步解析方法。
调用 PeerNameResover 对象的同步 Resolve 方法将返回包含端点信息的 PeerNameResover 集合对象。方法原型如下:
PublicPeerNameResoverCollection Resolve(PeerName peerName)
其中,参数 peerName 为待解析的 PeerName 对象,返回值为 PeerNameRecord 集合。