跳转到内容

点对点 (P2P) 世界/构建 P2P 系统

来自 Wikibooks,开放世界中的开放书籍

构建 P2P 系统

[编辑 | 编辑源代码]

开发者

[编辑 | 编辑源代码]

许多原因促使人们投入时间和精力创建 P2P 应用程序。正如我们在第一章中所述,P2P 技术已触及并开始影响人类活动的许多领域。除了任何类型的编程任务背后的正常原因(金钱、名声和乐趣)之外,它还可以表达一种政治立场,或成为在网络甚至经济学中实施新概念的工具。归根结底,P2P 本身就是人与人之间的互动,人们为了特定目标而共同努力。作为程序员,您有责任创建必要的基础设施来实现这一点。

任何 P2P 项目的目标都是成为广泛使用、值得信赖和可靠的。很少有项目是开放的、安全的、免费的、无歧视的、平等主义的、不受约束的和抗审查的。

选择编程语言

[编辑 | 编辑源代码]
Programming Languages
编程语言
Clipboard

待办事项
RAD(原型)与资源利用优化


选择许可证

[编辑 | 编辑源代码]

为任何公开发布的软件选择合适的许可证是至关重要的步骤。它将决定项目的执行方式,甚至限制为实现解决方案而选择的编程语言,以及获得最终产品所需的时间,并且对于与用户的关系也越来越重要。

您可以随时使用现成的许可证列表,作为实施者,您甚至可以创建自己的许可证。在最后一步要格外小心,如果您不了解所有含义,则不应冒险。

开源计划 (OSI) 提供了对开源含义的出色注释定义,请访问此处 ( http://www.opensource.org/docs/osd )。

开源与闭源

[编辑 | 编辑源代码]

P2P 如何产生收入

[编辑 | 编辑源代码]


Clipboard

待办事项

推送内容
营销(广告等)
监控和控制(了解客户正在搜索的内容,控制他们看到的内容)
高级用户列表


共享软件/付费软件

[编辑 | 编辑源代码]

由于可能导致法律纠纷以及需要遵守的繁文缛节和义务,这是一种最麻烦的设置。

此外,限制网络参与度将有意降低其实用性,这就是为什么大多数P2P服务是免费的或至少支持一定程度的免费访问。

有几种模式是简单捐赠/付费模式的变体,它们根据收集到的价值为用户或项目设定具体目标。

赎金
将应用程序的功能或代码作为赎金支付,如果人们确实捐款并达到该目标,您同意遵守您的提议(例如:公开源代码,修复或实现功能)。
赎金已被证明在实践中有效,它被用于多个开源项目,甚至作家也测试了这种方案,后者的一个例子是作家劳伦斯·沃特-埃文斯在多个作品上进行的测试,所有这些都成功地实现了他的金钱和生产目标。
付费功能
在这种赎金模式的变体中,在这种特殊情况下,您应该格外小心地告知用户他们正在为哪些内容付费,以及您为该付款提供的服务的合法性。额外的功能可能是更好的服务,甚至现有服务的更高质量。
付费支持
付费支持包括向用户提供付费优先的技术支持服务,这在开源项目中非常常见。您应该避免过度复杂化软件,以便从中获利,因为用户将是网络。一种解决方案是为公众消费提供默认的简化版本,并启用对软件、协议或网络进行高度调整,然后尝试从中获利。

许可新技术

[编辑 | 编辑源代码]

如果您想出了新的技术或一种互连现有技术的新方法,则可以将其转化为收入来源。


Clipboard

待办事项
完整内容和示例


风险投资

[编辑 | 编辑源代码]
Clipboard

待办事项
添加支持P2P开发的风投公司的已知列表


控制级别
[编辑 | 编辑源代码]
Clipboard

待办事项
完整内容

节点及其运行它的用户是所有P2P系统的基石,没有节点,您将无法创建网络,这似乎很明显,但通常会忽视用户的需求,而专注于最终目标,即网络本身,有点像看着森林而没有看到树木。


Clipboard

待办事项
…个人电脑…


构建社区

[编辑 | 编辑源代码]

将社交元素融入软件中是有益的。让人们能够走到一起,不仅是为了共享内容或服务,而且是为了围绕共同的目标而合作,其中合作以实现最佳状态应始终是最终目标。

P2P应用程序是一种社交软件

社交软件定义为任何促进和支持社交协作的软件。这当然也是现代P2P系统定义的一部分,在该系统中,守门人不再存在,参与者可以根据自己的条件自由互动。P2P应用程序在这种现实中成为一种支持工具。

世界可以越来越多地被定义为网络的网络,所有事物在某种程度上都是相互关联的。随着互联网的普及成为现实,它不仅使通信速度加快,而且还增加了来源的数量,这造成了质量保证问题。

围绕功能性点对点网络的共同目标构建的在线协作,不仅有助于改进系统,还有助于建立信任关系,并随之出现声誉阶梯。在参与者之间以及网络和软件本身,这种个性化最终将能够将这种信任和声誉扩展到点对点网络中可能存在的众多关系。


Clipboard

待办事项
链接到安全性和盗链行为


社交网络(人与人之间)

[编辑 | 编辑源代码]

随着社区的出现和聚集,它们不仅增加了内容的可寻址性,而且增加了生产者和消费者之间可寻址性,这些生产者和消费者将自行组织,以便根据个人喜好建立超级和子组(多对多)。

支持有意义的信息交换和促进协作的增加,也增加了稀有或模糊内容的可用性和微内容的重要性,因为去除了无关信息,因为内容可以持续地传递到合适的受众(拉取,而不是推送)。

使用社交软件或任何类型的集中式社交网络可以轻松提取用户行为的指标,这已被公司深入探索,这些公司在一段时间以来一直在发动战争,不仅是为了获得这些交互产生的数据的一部分,而且是为了控制此类信息(例如:谷歌和微软)。微软有一个专门针对此主题的研究项目(企业社会计算)。


Clipboard

待办事项
带有公共API的示例



打开围墙花园


Clipboard

待办事项
扩展


面向用户的GUI

[编辑 | 编辑源代码]

当您开始设计您的P2P应用程序时,GUI是用户必须与其交互以使用您的创作的内容,您应该尝试定义不仅要支持哪个OS,而且在什么框架内可以设计应用程序以便从WEB浏览器使用或选择一个可移植的框架,以便您可以将其移植到其他系统。

成为用户

用选项压倒用户始终是一个糟糕的解决方案,并且只会吸引经验丰富的用户,即使它是基于您自己的喜好完成的,您也应该记住,您不是为了自己使用而创建它。


Clipboard

待办事项
完整内容


简单是终极的复杂性

除了技术决策之外,您提供的功能也应该被考虑在内,最佳方法是一致并提供与现有实现、其他应用程序甚至您正在使用的环境/OS上的正常操作方式类似的选项。您可以选择遵循一些准则,例如Apple提供了OSX的准则(http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/)。


Clipboard

待办事项
完整内容


内容为王
Clipboard

待办事项
完整内容


差异在于细节
Clipboard

待办事项
完整内容


引导用户
Clipboard

待办事项
完整内容


P2P网络拓扑

[编辑 | 编辑源代码]

P2P网络的拓扑结构可以非常多样化,它取决于运行它的介质(硬件)、网络的大小(LAN、WAN)甚至软件/协议,这些软件/协议可以强加或使特定的网络组织出现。

下面我们可以看到最常用的拓扑结构(可以是混合拓扑结构,甚至可以在同一网络上分层),大多数如果不是全部的点对点网络都被归类为覆盖网络,因为它们是在已经存在的网络及其自己的拓扑结构上创建的。

环形拓扑 - 网状拓扑 - 星形拓扑 - 全网状完全网状 - 线形拓扑 - 树形拓扑 - 总线拓扑 - 混合拓扑

当有大量节点参与时,完全连接的P2P网络是不可行的。

  • 在数千或数百万参与者的网络中(n = 参与者)

  • 如果一个对等节点需要处理 O(n2) 数量的连接,那么它将无法扩展。

由于大多数 P2P 网络也属于覆盖网络的一种,因此 P2P 系统的最终拓扑结构也取决于协议、基础设施(介质/基础网络)或对等节点之间的交互。这些“变量”增加了普通网络复杂性的更多层次,而普通网络的基本特征是带宽、延迟和鲁棒性,这使得大多数 P2P 网络成为自组织覆盖网络。

在对 P2P 网络进行研究时,最终的拓扑结构(结构特性)至关重要,有很多论文涉及 P2P 网络的优化或特性。

Gonzalo Travieso 和 Luciano da Fontoura Costa 的论文《用于实时分布式处理的有效网络》(http://arxiv.org/abs/physics/0612134)似乎表明,均匀随机互连方案,即具有固定边数的特定Erdős-Rényi (ER) 随机网络模型,比无标度对应模型,即Barabási-Albert(BA) 无标度模型,效率高得多。

系统测试/调试

[编辑 | 编辑源代码]
Clipboard

待办事项
添加缺失信息


虚拟机

[编辑 | 编辑源代码]
Clipboard

待办事项
添加缺失信息


软件工具

[编辑 | 编辑源代码]
Clipboard

待办事项
添加缺失信息


自组织系统 (SOS)

[编辑 | 编辑源代码]

P2P 系统默认属于此类,考虑到大多数 P2P 系统试图消除大多数集中式系统/网络中存在的集中控制或指挥 (C&C) 结构。

自组织系统研究相对较新,它适用于从组织到自然发生的事件的各种系统或结构。主要使用数学方法,并依赖于模型和模拟,其准确性取决于结构的复杂性、干预因素的数量和初始选项。

本书不会详细介绍 P2P 系统的这一方面,但一些参考和结构特征确实与 SOS 概念并行。有关 SOS 的更多信息,请查看 USENET 新闻组 comp.theory.self-org-sys 的自组织系统 (SOS) 常见问题解答 (http://www.calresco.org/sos/sosfaq.htm)。

协同作用
SOS 的一个新兴特征是协同作用,其中成员围绕共同目标聚集,每个人都为所有人的利益而努力。这在大多数 P2P 系统中也存在,在这些系统中,对等节点协同工作以最佳地共享资源并改进网络。

群体
SOS 中参与者产生的效应,即聚集并进行互补工作,从而以一种改进协调的方式共享知识和行为。这在鸟群或社会昆虫等自然界中可见。我们稍后会介绍 P2P 的这一方面,但请记住它与 SOS 相关。

大多数 P2P 系统没有(或不需要)中央服务器,但需要知道网络中的一个入口点。这就是所谓的引导 P2P 应用程序。它处理对等节点的连接,以便即使没有确切地知道谁在哪里以及是什么,也能找到并连接其他 P2P 对等节点(网络)。

这不是一个新问题;它在几种网络技术中共享,这些技术避免了需要中央服务器来索引所有参与者(门户)的中央故障点。

一种解决方案,零配置网络 (zeroconf)(参见 http://www.zeroconf.org/),包含一系列技术,这些技术可以自动(无需手动操作员干预或特殊配置服务器)创建可用的互联网协议 (IP) 网络。这些技术通常用于帮助引导、配置或跨路由器和防火墙打开路径。


Clipboard

待办事项
完整… Avahihttp://avahi.org/


混合式与真正的对等系统

[编辑 | 编辑源代码]

P2P 系统的主要目标之一是确保其任何单个部分都不对集体目标至关重要。通过向对等网络引入任何类型的集中化,就会产生故障点,因为某些对等节点将比其他对等节点更重要,这甚至会导致安全或稳定性问题,就像旧的客户端-服务器模型一样,其中单个用户可能会使服务器崩溃并拒绝其他网络用户使用它。


Clipboard

待办事项
完整内容


可用性

[编辑 | 编辑源代码]

由于 P2P 网络的不稳定性,节点始终加入和离开,因此必须做出一些努力来保证网络不仅可用并允许新节点加入,而且共享的资源在暂时不可用时继续被识别或至少被索引。


Clipboard

待办事项
完整内容


完整性

[编辑 | 编辑源代码]
Clipboard

待办事项
完整内容


由于对等网络的开放性,大多数网络都受到具有各种动机的人员的持续攻击。大多数攻击可以通过仔细设计对等网络并使用加密来防御或控制。实际上,P2P 网络防御与“拜占庭将军问题”密切相关。但是,当大多数对等节点试图破坏网络时,几乎任何网络都会发生故障,并且许多协议可能会因更少数量的对等节点而失效。

计算机科学通常将计算机集群定义为一组紧密耦合的计算机,它们紧密协作,因此在许多方面可以将它们视为一台计算机。

集群的组件通常通过高速网络相互连接,并且通常用于提高性能和/或可用性,而这些性能和/或可用性是单台计算机无法提供的,同时通常比具有可比速度或可用性的单台计算机更具成本效益。

正如我们之前所见,如果将此概念应用于分布式网络或 WAN(代替 LAN),则会生成分布式计算、网格和其他系统。所有这些应用程序都是 P2P 概念的一部分。

我们松散地将集群定义为物理的、社会的甚至经济的/统计的事件。也就是说,它是由实体由于共享共同属性而聚集定义的,该属性可能是共享的目的或特征,或任何其他共性。

当我们查看 P2P 网络生成的拓扑结构时,我们可以观察到大多数协议会在网络结构和资源周围生成某种类型的集群,它们甚至可能作为网络状况的结果而出现。因此,集群是一个无监督的学习问题,一个自动出现的事件,导致创建了临时未标记对象的集合(数据/项目或事件)。有关集群的更多信息,您可以查看《聚类算法教程》(http://home.dei.polimi.it//matteucc/Clustering/tutorial_html/)。

因此,集群是对象的集合,这些对象在它们之间是“相似”的,并且对于使用相同特征集属于其他集群的对象是“不同”的。

这个概念不仅对 P2P 网络的形式非常重要,而且对可以基于使用 P2P 应用程序构建的社会结构/关系也有影响。


Clipboard

待办事项
用于 K 均值聚类的有效算法 Tapas Kanungo、David M. Mount、Nathan S. Netanyahu、Christine D. Piatko、Ruth Silverman 和 Angela Y. Wu


突发人群

[编辑 | 编辑源代码]

突发人群是一种行为模型,参与者倾向于围绕某个事件聚集/拥挤,用 P2P 术语来说,这可能是一种稀缺资源,例如,正如我们稍后将看到的,BitTorrent 优先考虑大文件而不是小文件,新文件而不是旧文件,这是基于单个项目的网络连接的结果,BitTorrent 的速度主要取决于围绕文件生成突发人群(更多的对等节点,更高的速度,这将导致更多的种子节点)。

这也会导致拒绝服务 (DoS) 或洪泛攻击。例如,如果 P2P 系统设计不当,尝试将大量对等节点连接到网络可能会干扰使用的引导方法。

您应该教育用户,更多的连接并不等于更高的速度,最多会导致查询得到更多响应,但这可能取决于协议的结构,但启用它们会消耗带宽。另一方面,更多的对等节点将导致更多资源被共享,这也会导致共享重叠,从而获得更好的速度,随着 P2P 网络规模的扩大,它可以更好地为用户提供服务。

在任何 P2P 协议中都应该进行一些简单的优化,这可以为对等节点和整个网络带来好处。这些优化基于系统指标或配置文件,例如 IP(ISP 或范围)、内容、物理位置、共享历史记录、比率、搜索以及许多其他变量。

大多数 P2P 网络和拓扑结构(在广域网环境中)的逻辑/特性会导致对等节点的聚合,因此这些集群将共享分布式行为模型的相同属性,例如群体、兽群和鱼群,这导致了一个更容易研究的环境,并可以建立对等节点关系的相关性,并推导出提高效率的方法。

  • 对齐
获取本地系统/环境的信息/特性,以便通过选择和优化分离和凝聚函数来优化网络上的对等节点“位置”,从而改进本地邻域。
  • 分离
实现一种基于不需要的对齐来避免与其他对等节点拥挤的方法。
  • 凝聚
根据对等节点自身的对齐选择对等节点。

P2P 网络流量

[编辑 | 编辑源代码]

由于所使用的协议和拓扑结构的性质,在互联网上检测到的 P2P 流量有时只能通过基于感知使用(在线用户、给定实现的下载次数)的估计来完成,或者通过对网络本身进行点检查来完成。如果协议或应用程序的实现是为了这个目标而进行的,甚至可以访问信息,例如,Gnutella 的几个实现具有该选项,而 Bearshare 甚至报告了一些用户系统参数,例如防火墙类型等。

例如,提供此类 P2P 网络流量信息的服務包括 Cachelogic(http://www.cachelogic.com/research/2005_slide16.php#)。

通信

您最重要的考虑因素之一是如何预测对等节点的通信方式,即使我们放弃使用像超级节点这样的中央服务器以及多个分布式客户端作为对等节点/节点,也需要考虑几个问题

  • 通信是否需要跨越防火墙和代理服务器?
  • 网络传输速度是否重要?用户可以配置它吗?
  • 通信是同步的还是异步的?
  • 它是否只需要/使用单个端口?我们应该使用哪个端口?
  • 您需要支持哪些资源?是否有大小限制?是否应该使用压缩?
  • 数据是否需要加密?
  • 等等...

必须仔细考虑项目的具体目标和需求,这将有助于您评估工具包和框架的使用。如果您无法提出更好的解决方案或没有时间、能力或意愿,请尽量不要重新发明轮子。您还可以使用开放标准(例如:使用 HTTP 协议),但也可以自由探索其他方法。

如今,即使是小型局域网也至少会配备防火墙,并且可能还会配备路由器,即使所有组件都在用户的控制之下,有些用户只是缺乏如何正确设置它们的知识。另一个考虑因素是应用程序的简单配置要求,大多数用户在处理技术术语和依赖项时都会遇到问题,即使是 Windows 操作系统的新版本也会默认启用防火墙,这些都可能成为用户难以逾越的障碍,值得庆幸的是,有一些工具可以使所有人的生活更轻松。

通用即插即用 (UPnP) 架构由 UPnP 论坛http://www.upnp.org/)制定的一套开放标准和技术,其目标是扩展即插即用概念以支持网络和对等节点发现(网络上的自动发现,有线或无线)、配置和控制,从而使设备、PC 和服务能够透明地连接。允许任何 UPnP 设备动态加入网络,获取其 IP 地址并同步功能(从其他设备学习和通知其他设备)。从一般意义上讲,它也可以看作是分布式 简单网络管理协议 (SNMP)

由于 UPnP 在大多数现代路由器和网络设备中提供,并且自 Windows XP 以来一直受 Microsoft 支持。虽然据称旨在解决网络程序用户接受来自 Internet 的传入连接(“端口转发”或“NAT 穿越”)的问题,因为它将删除配置路由器以接受传入连接然后将其路由到路由器后面的局域网本地机器的必要步骤,这对于普通用户来说很难解释和理解。

所有这一切都使得 Windows P2P 应用程序必须以编程方式支持此架构,以避免用户处理启用 UPnP 时必要的更改的要求(默认情况下应禁用它,因为存在安全风险)。此外,如果本地机器上的防火墙不符合 UPnP,则必须更改其配置以启用 UPnP 必要的 TCP(端口 2859)和 UDP(端口 1900)通信。

Microsoft 提供了 UPnP 控制点 API。它在 Windows Me、CE .Net、XP 及更高版本中可用,位于系统服务“SSDP 发现服务”(ssdpsrv)和“通用即插即用设备主机”(upnphost)中,或通过 COM 库。它可以在 C++ 或 Visual Basic 应用程序中使用,或在嵌入 HTML 页面中的脚本中使用。

有关 Windows 上 UPnP 技术的更多信息,可以从以下来源收集

免费可用的实现
  • CyberLink(http://sourceforge.net/projects/clinkcc)用于 C++,是面向 UPnP 程序员的开发包。使用该包,您可以轻松创建 UPnP 设备和控制点。在 BSD 许可证下发布。
  • MiniUPnP 项目(https://miniupnp.tuxfamily.org)开源 C 实现,在 BSD 兼容许可证下发布。
  • GUPnP(http://www.gupnp.org),一个面向对象的开源框架,用于创建 UPnP 设备和控制点,使用 GObject 和 libsoup 以 C 编写。它提供与 libupnp 相同的功能集,但为开发人员屏蔽了大多数 UPnP 的内部细节。在 GNU LGPL 下发布。
  • UPNPLib(http://www.sbbi.net/site/upnp)开源 Java 实现,在 Apache 软件许可证下发布。

安全注意事项

[编辑 | 编辑源代码]

通过使用 P2P 系统,用户会将其存在广播给他人,这与他们可能与他人交互但其匿名性可以得到保护的集中式服务形成对比。

违反网络安全可能构成犯罪,例如 科罗拉多大学和华盛顿大学 2008 年的研究项目案例,研究人员参与了跨 Tor 匿名代理网络的用户机动化,并且可能因窥探而面临法律风险。

这种分布式通信的漏洞可能导致身份攻击(例如,追踪网络用户并骚扰或对他们进行法律攻击)、DoS、垃圾邮件、窃听和其他威胁或滥用行为。所有这些行为通常针对单个用户,有些甚至可能是自动化的,创建者可以采取一些措施使其更难,但最终无法阻止,并且应该预期并处理,第一步是向用户提供信息,以便他们可以在本地实施硬件或软件操作,甚至是一种抵消这种滥用的社会行为。

DoS(拒绝服务)、垃圾邮件

[编辑 | 编辑源代码]

由于每个用户都是一个“服务器”,因此他们也容易受到 拒绝服务 攻击(如果优化,这些攻击可能会使网络运行非常缓慢或完全中断),结果可能取决于攻击者的资源以及 P2P 协议的去中心化程度另一方面,成为 垃圾邮件(例如,在网络上传输未经请求的信息 - 不一定作为拒绝服务攻击)的目标仅取决于您的可见性和可联系性,例如,如果其他用户可以向您发送消息。大多数 P2P 应用程序都支持某种聊天系统,并且此类滥用行为在这种系统中非常普遍,它们可以解决问题,但无法完全解决,这可能导致社会工程攻击,用户可能会被诱导执行危及自身或其系统的操作,在这一点上,只有向用户提供信息,使他们能够意识到风险才能奏效。

ARP 攻击

[编辑 | 编辑源代码]
Clipboard

待办事项
完成此节内容


硬件流量控制

[编辑 | 编辑源代码]
Clipboard

待办事项
ISP和网络中立性,过滤(网络运营商可能会尝试阻止点对点网络数据传输)


软件流量控制

[编辑 | 编辑源代码]

由于大多数网络应用程序,特别是P2P工具容易成为安全问题的来源(它们会绕过某些内部默认的安全措施),因此在使用或创建此类工具时,必须注意授予可能性或配置系统以尽可能安全。

安全工具

[编辑 | 编辑源代码]

有几种工具和选项可用于此目的,无论是配置防火墙,添加IP拦截器,还是确保在部署应用程序时默认启用某些限制。

  • PeerGuardian 2(http://phoenixlabs.org/pg2/)是Phoenix Labs开发的一款开源工具,它是一个适用于Windows操作系统的IP拦截器,支持多个列表、列表编辑、自动更新以及阻止所有IPv4(TCP、UDP、ICMP等)。
  • PeerGuardian Lite(http://phoenixlabs.org/pglite/)是PeerGuardian 2的一个版本,旨在降低系统占用。
黑名单
[编辑 | 编辑源代码]

黑名单是包含反对并积极打击文件共享(如RIAA)的组织的IP地址的文本文件,以及任何挖掘网络或试图在不参与实际文件共享的情况下使用资源的企业。它基本上类似于电子邮件系统中存在的垃圾邮件过滤器。


Clipboard

待办事项
添加示例和资源


防火墙

[编辑 | 编辑源代码]

随着计算机尝试为用户提供更安全的保障,当今的操作系统默认会提供某种形式的外部通信限制,允许用户定义不同的信任级别,这称为防火墙。防火墙可以有硬件软件实现,并配置为允许、拒绝或代理通过计算机网络数据。大多数最新的操作系统都会自带软件实现,因为互联网连接正变得越来越普遍,防火墙的缺乏甚至默认配置可能会导致P2P应用程序的使用出现一些困难。


Clipboard

待办事项
完整内容


在Windows上

[编辑 | 编辑源代码]

微软在最近的操作系统版本中,为了用户的安全,在没有用户干预的情况下,从Windows XP SP2开始默认包含并启用了简单的防火墙解决方案。这会阻止任何传入连接(80端口上的HTTP或110或25端口上的邮件),“未经请求的消息”的分类有点过度强调,因为这些消息可能是P2P(或任何其他类型的分布式)网络的一部分。这也会对阻止本地计算机上的UPnP功能产生影响。

Clipboard

待办事项
添加缺失内容(协议和应用程序级实现)


路由器

[编辑 | 编辑源代码]
Clipboard

待办事项
添加缺失内容


Clipboard

待办事项
添加缺失内容(协议和应用程序级实现)


NAT网络地址转换


Clipboard

待办事项
ICS(Internet Connection Sharing)在Windows 2000+


NAT穿越
[编辑 | 编辑源代码]

位于NAT背后的用户应该能够互相连接,有一些可用的解决方案试图启用它。

STUNSimple Traversal of UDP over NATs)是一种网络协议,它帮助许多类型的软件和硬件通过使用NAT的家用宽带路由器正确接收UDP数据。

摘自其标准文档,RFC 3489

“通过网络地址转换器(NAT)的简单用户数据报协议(UDP)遍历(STUN)是一种轻量级协议,允许应用程序发现它们与公共互联网之间NAT和防火墙的存在和类型。”
它还提供了使应用程序能够确定NAT分配给它们的公共IP地址的能力。
“STUN适用于许多现有的NAT,并且不需要它们有任何特殊行为。因此,它允许各种各样的应用程序通过现有的NAT基础设施工作。”

STUN RFC所述,此协议并非解决与NAT相关问题的灵丹妙药,但它对于使语音通信通过家用路由器工作特别有用。VoIP信令协议(如SIP)使用UDP数据包通过互联网传输声音数据,但这些UDP数据包通常难以通过家用路由器中的NAT

STUN是一种客户端-服务器协议。VoIP电话或软件包可能包含一个STUN客户端,该客户端将向STUN服务器发送请求。然后,服务器将向STUN客户端报告NAT路由器的公共IP地址是什么,以及NAT为允许传入流量返回网络而打开了哪个端口。

该响应还允许STUN客户端确定正在使用哪种类型的NAT,因为不同类型的NAT对传入UDP数据包的处理方式不同。它将适用于四种主要类型中的三种:全锥NAT受限锥NAT端口受限锥NAT。它不适用于对称NAT(也称为双向NAT),这种NAT通常存在于大型公司的网络中。

Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)) algorithm.
通过网络地址转换器(NAT)的简单用户数据报协议(UDP)遍历算法。

端口转发

[编辑 | 编辑源代码]

如果对等节点位于路由器或防火墙(使用NAT)之后,可能需要手动配置它,以允许P2P程序正常运行。对于技术能力不强的人来说,这可能是一项艰巨的任务,甚至会影响P2P应用程序的采用率。使用UPnP等一些解决方案可以自动解决此问题。


端口转发或端口映射,有时也称为端口映射,是指将网络端口从一个网络节点转发到另一个网络节点的行为,虚拟地创建一条跨网络的路径。在本例中,从连接到路由器或防火墙的Internet端到LAN内部的计算机,允许外部用户从外部访问私有IP地址(LAN内部)上的端口。否则,LAN内部的计算机将无法访问,并且P2P将无法完全工作(它可以联系外部机器,但无法从外部完全可见)。

由于最终允许相同功能的GUI实现种类繁多,因此进行必要的更改并非易事,而且一种解决方案并不适用于所有情况。

首先要注意的是,路由器或连接到Internet的计算机将具有不同的IP地址,一个由您的ISP提供,在Internet上可见,另一个仅在LAN内部可见,此地址可以由用户分配,或者默认为出厂设置或操作系统出厂设置。

要对路由器的配置进行任何更改,您需要知道可以访问其配置页面并登录的IP地址。如果使用计算机,则可以在本地或远程执行此任务(如果软件允许)。用户需要具备一些关于IP和端口甚至协议(某些配置允许区分TCP和UDP数据包)如何使用的基本知识才能执行这些任务,因此对于普通用户来说,这可能变得复杂。

注意
出于安全原因,请勿将默认密码保持不变,因为这将允许外部人员控制您的财产或窃取您的带宽。


Clipboard

待办事项
完整内容


数字控制着你的生活。随着时间的推移,任何人都可以通过大量的数字来识别。比如电话号码、信用卡号码、驾驶证号码、社会安全号码,甚至邮政编码或汽车牌照。这些唯一号码的创建、分配和验证方式都非常引人入胜。Alan De Smet 的唯一ID网站 (http://www.highprogrammer.com/alan/numbers/) 提供了关于这个主题的一般信息。对于我们特定的主题,相关的是其背后的算法。如何为用户和资源建立唯一的标识符。

通用唯一标识符 (UUID) / 全局唯一标识符 (GUID)

[编辑 | 编辑源代码]

为了使P2P协议/应用程序能够管理用户身份识别、身份验证、构建路由协议、识别资源等,需要(一组)唯一标识符。虽然真正的对等协议并不打算建立集中式服务,但它经常会利用已经建立的此类服务。例如,Usenet利用域名来为文章创建全局唯一标识符。如果协议避免使用此类服务,则唯一性只能基于随机数和数学概率。

生成唯一ID的问题可以分解为空间上的唯一性和时间上的唯一性,这两者结合起来,旨在产生一个全局唯一的序列。这导致在使用开放协议/多个供应商实现的一些P2P网络中检测到一个问题,由于在生成GUID时使用了不同的算法,导致空间上的唯一性被破坏,从而导致零星的冲突。

UUID正式且专门定义为ISO-11578标准的一部分,也存在其他规范,例如RFC 4122ITU-T建议X.667

使用示例

  1. Usenet文章ID。
  2. 在微软的组件对象模型 (COM) 混乱中,这是一种包含MFC(Microsoft Foundation Classes)、OLE(对象链接和嵌入)、ActiveX、ActiveMovie以及微软最近推出的所有其他内容的面向对象编程模型,GUID是一个16字节或128位数字,用于唯一标识对象、数据格式以及所有内容。
  3. Windows注册表中的标识符。
  4. RPC(远程过程调用)中使用的标识符。
  5. 在ActiveMovie中,存在用于视频格式的GUID,对应于Video for Windows中使用的FOURCC或四字符代码。这些在Active Movie软件开发工具包(SDK)中的uuids.h文件中指定。ActiveMovie需要传递与AVI文件中视频的FOURCC对应的GUID。

安全性版本1(基于时间和节点)的UUID存在已知的脆弱性,因为它会广播节点的ID。

软件实现

[编辑 | 编辑源代码]

需要实现UUID的程序员可以参考以下示例

  • OSSP uuid(http://www.ossp.org/pkg/lib/uuid/)是用于ISO C、ISO C++、Perl和PHP的API,以及用于生成符合DCE 1.1、ISO/IEC 11578:1996和RFC4122的通用唯一标识符(UUID)的相应CLI。它支持版本1(基于时间和节点)、版本3(基于名称,MD5)、版本4(基于随机数)和版本5(基于名称,SHA-1)的DCE 1.1变体UUID。UUID是128位数字,旨在在空间和时间上具有很高的唯一性可能性,并且在计算上难以猜测。它们是全局唯一标识符,可以在本地生成,而无需联系全局注册机构。它是根据MIT/X Consortium许可证开源的。

哈希、加密和压缩

[编辑 | 编辑源代码]

大多数P2P系统必须至少实现一种用于哈希、加密/解密和压缩/解压缩的算法,本节将尝试提供一些关于这些操作与P2P主题相关联的想法,因为我们将在后面其他章节中讨论这些问题。

有关该主题的详细信息可以在加密维基教科书中找到(https://wikibooks.cn/wiki/Cryptography)。

创建结构化P2P网络的一种方法是维护一个分布式哈希表 (DHT),它将充当网络上资源的分布式索引。

加密的另一个需求是保护分布式资源本身的完整性,为了使它们能够抵御攻击,大多数P2P实现某种哈希函数(MD5、SHA1),甚至可能实现哈希树以检测资源内容作为整体或用户获取的部分的损坏(例如使用Tiger Tree Hash)。

哈希函数

[编辑 | 编辑源代码]

哈希函数是一种可重现的方法,用于将某种数据转换为(相对)较小的数字,该数字可以用作数据的数字“指纹”。该算法替换或转置数据以创建此类指纹。指纹称为哈希值哈希值哈希码或简称为哈希。当您指的是哈希或哈希时,必须注意,因为它也可能表示哈希函数。

一组哈希(将哈希函数应用于数据的结果)有时被称为或更准确地说是哈希桶。如果由非冲突哈希函数生成,则大多数哈希桶将为给定的数据输入生成不同的哈希,在选择哈希函数时应考虑其他特征,但这超出了本书的范围,只需记住检查您正在实现的哈希函数/算法是否满足您的要求。维基教科书包含几本以某种方式涵盖哈希的书籍,您可以在算法实现加密中查看有关该主题的更多信息

A typical hash function at work
一个典型的哈希函数在工作

哈希值通常用作哈希表哈希文件的索引。密码哈希函数用于信息安全应用程序中的各种目的。

选择一个好的哈希函数

一个好的哈希函数对于哈希表的高性能至关重要。如果选择了一个糟糕的哈希函数,很可能会导致键聚集,即键映射到同一个哈希桶(即发生冲突)的概率远大于随机函数所期望的概率。在任何哈希实现中,非零的冲突概率都是不可避免的,但通常解决冲突所需的操作次数与映射到同一个桶的键的数量成线性关系,因此过多的冲突会显著降低性能。此外,一些哈希函数的计算量很大,因此计算哈希所需的时间(以及在某些情况下,内存)可能成为负担。

在点对点系统(以及一般的文件传输)中,用于验证文件完整性的早期哈希算法之一是1992年创建的MD5(参见rfc1321 **MD5消息摘要算法**)。但就像大多数哈希算法一样,经过一段时间后,一些弱点被发现了,SHA1算法也重复了这一过程,并且很可能其他算法也会如此。选择合适的工具还不够,程序员必须持续检查他所选择的算法的安全性在多大程度上满足了对所选哈希算法的要求。

简单性和速度可以很容易地进行客观衡量(例如,通过代码行数和CPU基准测试),但强度是一个更难以捉摸的概念。显然,像SHA-1这样的加密哈希函数(参见安全哈希标准FIPS 180-1)可以满足哈希表所需的相对宽松的强度要求,但它们的速度慢且复杂,因此不受欢迎。然而,当哈希表模数及其因子可以对攻击者保密时,或者通过应用一个秘密的,使用加密哈希函数可以防止冲突攻击。但是,对于这些特殊情况,可以使用通用哈希函数来代替一个静态哈希。

在没有哈希函数强度标准度量的情况下,目前的技术是采用一系列统计测试来衡量哈希函数是否可以很容易地与随机函数区分开来。可以说,最重要的测试是确定哈希函数是否显示雪崩效应,它本质上表明输入键的任何一位变化都应该平均影响输出中的一半比特。Bret Mulvey尤其主张测试严格雪崩条件,该条件指出,对于任何一位变化,每个输出比特都应该以二分之一的概率发生变化,与键中的其他比特无关。纯粹的加法哈希函数,如CRC,惨败于这个更强的条件。

注意
CRC通常用于表示函数或函数的输出。CRC可以像校验和一样,用于检测数据在传输或存储过程中意外的更改。CRC之所以受欢迎,是因为它们在二进制硬件中易于实现,易于进行数学分析,并且特别擅长检测传输通道中噪声引起的常见错误。历史上,CRC被广泛用作电信中的错误检测/纠正。

有关哈希的更多信息

避免冲突

[编辑 | 编辑源代码]
Clipboard

待办事项
完整内容


实现哈希算法

[编辑 | 编辑源代码]

大多数哈希算法都具有很高的复杂度,并且是为特定的目标(哈希函数)设计的,在其他任务中可能无法应用相同的保证级别。这些算法(或它们的原始描述)可以免费获取,您可以实现自己的版本,或者选择使用现有的经过测试的实现(并注意安全问题)。一些公开可用的实现示例可在密码学维基教科书中找到。

注意
请记住,某些哈希函数可能受出口限制。

需要一致的结果和可重复性,在选择和实现哈希算法时,请记住在测试向量批次上运行它。如果您使用的是测试框架,则应将其添加到您的测试中。

哈希树(默克尔树)

[编辑 | 编辑源代码]

密码学中,**哈希树**(也称为**默克尔树**,由Ralph Merkle于1979年发明)是对更简单的哈希列表概念的扩展,而哈希列表又是对旧的哈希概念的扩展。它是一种哈希结构,具有用于以增量或乱序方式验证文件和文件子范围完整性的理想属性。

底层哈希函数为Tiger的哈希树(http://www.cs.technion.ac.il/~biham/Reports/Tiger/)通常被称为**Tiger树**或**Tiger树哈希**。

哈希树的主要用途是确保从点对点网络中的其他节点接收到的数据块未损坏且未被更改,甚至检查其他节点是否发送了掺假的数据块。这将优化网络的使用,并允许快速排除掺假内容,而不是等待整个文件下载完成以进行单一哈希检查,可以下载部分或完整的哈希树,并且可以立即检查每个分支的完整性(因为它们由哈希块或哈希树的叶子组成),即使整个树/内容尚未可用,也使得正在下载的节点可以上传未完成文件的块成为可能。

通常,使用SHA-1、Whirlpool或Tiger等加密哈希函数进行哈希。如果哈希树只需要防止无意的损坏,可以使用CRC等安全性较低的校验和

在哈希树的顶部有一个顶部哈希(或根哈希主哈希)。在点对点网络上下载文件之前,在大多数情况下,顶部哈希是从受信任的来源(具有较高信任度的节点或中央服务器)获取的。当顶部哈希可用时,哈希树就可以从任何来源接收。然后将接收到的哈希树与受信任的顶部哈希进行检查,如果哈希树损坏或已损坏,则将尝试来自其他来源的另一个哈希树,直到程序找到一个与顶部哈希匹配的哈希树。

这需要考虑几个因素

  1. 根哈希的受信任来源是什么。
  2. 哈希算法的一致实现(例如,要传输的块的大小必须已知,并且在每个文件传输中都是恒定的)。
Tiger树哈希(TTH)
[编辑 | 编辑源代码]

Tiger树哈希是点对点网络上最有用的一种哈希树形式。它基于Eli Biham和Ross Anderson于1995年创建的加密哈希Tiger(有关创建者的信息和C源代码示例,请参见http://www.cs.technion.ac.il/~biham/Reports/Tiger/)。该哈希算法的设计考虑了现代CPU,尤其是在处理64位数据时,它是32位机器上最快、最安全的哈希之一。

TTH使用一种二叉哈希树形式,通常具有1024-字节的数据块大小,并使用加密安全的Tiger哈希。

使用Tiger哈希是因为它速度很快(并且树需要计算大量的哈希),通过最近的实现和架构,TTH与SHA1一样快,通过更多的优化和64位处理器的使用,它会变得更快,即使它生成更大的哈希值(192位对比SHA1的160位)。

Tiger Tree 哈希值(TTH)被用于 GnutellaGnutella2Direct Connect 等许多其他 P2P 文件共享协议,以及在一般的 文件共享 中。

关于 TTH 用法的逐步介绍曾作为 Tree Hash Exchange (THEX) 格式的一部分提供(请参阅网络档案中的页面)。

哈希表

[编辑 | 编辑源代码]

计算机科学 中,哈希表哈希映射 是一种 数据结构,它将 关联起来。它主要有效支持的操作是 查找:给定一个键,找到对应的值。它的工作原理是使用 哈希函数 将键转换为 哈希值,这是一个数字,用于索引数组以定位应放置值的所需位置(“桶”)。

A small phone book as a hash table.
一个小电话簿作为哈希表。


哈希表支持高效添加新条目,并且花费在搜索所需数据上的时间与存储的项目数量无关(即 O(1))。

在 P2P 系统中,哈希表在每个客户端/服务器应用程序上本地使用,以执行数据路由或文件的本地索引,当我们尝试以分布式方式使用相同的系统时,这个概念得到了进一步发展,在这种情况下,分布式哈希表用于解决问题。

分布式哈希表 (DHT)
[编辑 | 编辑源代码]

分布式哈希表 (DHT) 的概念于 2001 年公开,但公开发布稳健实现的机构很少。

  • 内容寻址网络 (CAN)
  • Chordhttp://pdos.csail.mit.edu/chord/)——旨在利用点对点思想构建可扩展、健壮的分布式系统。它是完全去中心化和对称的,并且只需使用 log(N) 条消息即可查找数据,其中 N 是系统中的节点数。Chord 的查找机制在面对频繁的节点故障和重新加入时具有可证明的鲁棒性。一个单一的 C 语言研究实现可用,但也有其他 C++、Java 和 Python 实现。
  • Tulip
  • Tapestry
  • Pastry
    • Bamboohttp://bamboo-dht.org/)——基于 Pastry,一个用 Java 编写的 Pastry 协议的重新设计,并根据 BSD 许可证授权。


Clipboard

待办事项
Tulip 似乎有一个 C++ 实现,但找不到关于它的信息……


作为任何 P2P 网络安全的一部分,加密是必要的,以确保只有“允许的”方才能访问敏感数据。例如,在服务器/客户端设置(即使在 P2P 上)上对数据进行加密,客户端可以在不担心服务器访问数据的情况下共享数据(如果网络本身支持用于传输的分布式缓存机制,则为无服务器混合),传输加密,以防止中间人攻击或数据监控(请参阅 FreeNet)以及许多其他旨在保护隐私并为网络提供扩展安全级别的应用程序。

有几种算法可用于实现加密,P2P 项目最常用的包括:BlowFish


Clipboard

待办事项
扩展并提供具体示例


Clipboard

待办事项
完整内容


资源(内容、其他)

[编辑 | 编辑源代码]

P2P 应用程序可用于以可唯一标识的打包信息形式共享任何类型的数字资产。P2P 应用程序以共享文件而闻名,这引发了若干问题和可能性。

元数据

[编辑 | 编辑源代码]

元数据(元数据或有时称为元信息)是“关于数据的数据”。元数据项可以描述单个 数据、内容项或数据集合,包括多个内容项和层次结构级别,例如数据库模式。

数据 是知识的最低抽象级别,信息是下一个级别,最后,我们拥有知识,它是三者中最高的级别。元数据由帮助定义目标项知识的直接和间接数据组成。

元数据描述的层次结构可以无限地延续,但通常上下文或语义理解会使过于详细的解释变得不必要。

任何特定 数据 所扮演的角色取决于上下文。例如,在考虑伦敦的地理位置时,“E83BJ”将是一个数据,而“邮政编码”将是元数据。但是,在考虑管理地理数据的自动化系统的​​数据管理时,“邮政编码”可能是数据,然后“数据项名称”和“5 个字符,以 A – Z 开头”将是元数据。

在任何特定上下文中,元数据表征它所描述的数据,而不是该数据所描述的实体。因此,关于“E83BJ”,数据“位于伦敦”是对具有邮政编码“E83BJ”的现实世界中的位置的进一步描述,而不是对代码本身的描述。因此,尽管它提供了与“E83BJ”相关的信息(告诉我们这是伦敦某个地方的邮政编码),但这通常不被认为是元数据,因为它描述的是“E83BJ”qua现实世界中的位置,而不是qua数据。

数据和元数据之间的区别

通常无法区分(普通)数据和元数据,因为

  • 某些东西可以同时是数据和元数据。文章的标题既是它的标题(元数据),也是其文本(数据)的一部分。
  • 数据和元数据可以改变它们的角色。一首诗本身会被视为数据,但如果有一首歌以它作为歌词,那么整首诗可以作为元数据附加到歌曲的音频文件上。因此,标签取决于观点。

无论考虑上述哪个定义,这些考虑都适用,除非使用显式标记来表示什么是数据以及什么是元数据。

元数据的层次结构

当结构化为层次结构时,元数据更恰当地称为 本体模式。这两个术语都描述了出于某种目的或为了启用某些操作而“存在的东西”。例如,图书馆目录中主题词的排列不仅用作查找书架上特定主题书籍的指南,而且还用作指导图书馆自身本体中“存在”的主题以及更专业的主题如何与更一般的主题词相关或派生自更一般的主题词的指南。

元数据通常存储在中心位置,并用于帮助组织标准化其数据。此信息通常存储在 元数据注册表 中。

模式示例

关于元数据工作以及如何使其可访问和有用的一个很好的例子,可以在W3C的旧页面元数据活动声明(http://www.w3.org/Metadata/Activity.html)以及资源描述框架(RDF)中找到,RDF通过使用声明性语言,提供了一种使用XML以语句的形式表示元数据的标准方式,这些语句描述了Web上项目的属性和关系。RDF在http://www.w3.org/RDF/ 有其自身更新的页面。

元数据注册表

[编辑 | 编辑源代码]
免费服务
  • MusicBrainz ( http://musicbrainz.org/ )是一个社区音乐元数据库(非营利性服务),旨在创建一个全面的音乐信息网站。您可以通过浏览该网站使用MusicBrainz数据,或者您可以从客户端程序访问数据——例如,CD播放器程序可以使用MusicBrainz识别CD并提供有关CD、艺术家或相关信息的信息。MusicBrainz还支持MusicIP的Open FingerprintTM架构,该架构可以识别音频文件中的声音,而不管数字文件细节的变化如何。该社区提供了一个基于REST风格的XML Web服务。

数据库和索引

[编辑 | 编辑源代码]
Clipboard

待办事项
…类型… …位置… …路由… …跟踪… …可扩展… …灵活…


P2P应用程序的用户可以选择文件作为要在网络上共享的资源。最简单和安全的方法是以不可变的方式共享文件内容,大多数P2P应用程序都满足了这一需求,在任何情况下,都可以围绕文件资源和这些文件的可能状态构建其他同时模型,其中最复杂的是分布式文件系统的实现。

共享文件

[编辑 | 编辑源代码]

在P2P网络上共享文件包括管理(索引、启用搜索和传输)两种不同的资源:本地文件和远程文件。

本地文件
[编辑 | 编辑源代码]

如果P2P应用程序支持文件共享。最常见的文件共享方法是允许用户选择本地文件系统卷中的一个或多个目录。这包括在应用程序首选项中提供选择要共享的文件路径以及放置下载文件的位置的功能。

自动将下载目录添加到共享路径列表或下载文件列表中也是一种常见做法,以便对等节点立即参与下载资源的复制。

注意
实施者应该关注并提醒用户注意有关网络上文件共享的安全和法律问题。

监视更改
[编辑 | 编辑源代码]

在确定用户指定的资源后,应用程序需要在运行时验证对任何共享文件的删除、重命名或写入操作,因为这可能构成文件状态(内容更改)的更改或任何文件的添加,或对共享资源的任何更改。这可能会使先前生成的哈希值或索引失效。可以通过为文件内容生成哈希值并使用操作系统对文件系统的控制来监视发生的更改来解决此问题(例如,在Windows上可以使用Win32 API ReadDirectoryChangesW)。

根据实现的要求,使用多个内容哈希可能会有益,一个更强的哈希用于网络传输,另一个更快、质量较低的哈希仅用于监视本地更改。

检测到的共享文件及其更改

由于不期望应用程序始终运行并能够持续监视对资源所做的任何更改,因此必须采取措施来维护进一步的完整性。因为如果应用程序关闭,它将无法继续监视更改,并且操作系统将允许某种API来检测文件更改,例如上次写入访问时间戳。因此,每次运行应用程序时保证完整性所需的步骤是

  1. 验证资源(已知文件和共享路径)是否仍然有效(它们仍然存在且未被更改)。
  2. 更新本地索引以反映上述步骤中发现的内容(从共享列表中删除任何无效目录或卷)。甚至可以提示用户进行纠正操作,因为有些可能是可移动介质(DVD等)。
  3. 开始监视新的更改。
  4. 检查自应用程序上次退出以来所有资源内容的更改,这可能意味着必须单独检查每个文件的上次写入日期(大多数现代操作系统允许这样做)。根据实现方式,可以包含接下来的两个步骤以减少重复工作。
  5. 验证所有先前索引的文件是否仍然存在。
  6. 验证是否存在新文件。
重要的本地路径

至少有两条路径对P2P应用程序具有更高的实用价值。应用程序所在的路径,因为它可能需要用于更新或任何必要的安全检查,甚至可能用作定位应用程序首选项的基础(如果未使用其他设置,例如Windows操作系统上的系统注册表)和/或下载目录,一个启用写入的目录,所有下载都将放置在此目录中。

注意
应监视下载目录的可用磁盘空间,如果内容自动共享,则应将其视为安全问题,因为它将成为攻击的主要途径,比任何其他共享路径都要严重,因为来自外部来源的篡改不仅可能使不需要的内容可供外部访问,还可能使外部实体能够将危险内容上传到本地计算机。

外部文件
[编辑 | 编辑源代码]

这些文件不在本地用户的直接控制之下。


Clipboard

待办事项
待扩展…


文件过滤
[编辑 | 编辑源代码]

大多数P2P应用程序都不允许选择单个文件进行共享,而是通过启用特定目录的选择来批量进行共享,需要提供一种机制来排除特定文件不被共享,这可能是用户的意愿、网络的具体要求,或者是为了减少文件共享系统处理不需要文件的负担。无论是通过大小、扩展名还是文件的内在内容,能够剔除它们都是有用的。

索引,即对资源(如共享文件)进行索引的任务,其目标是使应用程序能够知道哪些资源可用于在网络上共享。

索引在每次运行应用程序时都会发生,因为只有在应用程序运行时才能监视资源的更改,并且在对共享资源首选项进行更改时也会发生。这也使得在应用程序运行时必须有一个函数来监视资源的更改。

大多数P2P应用程序还支持排除或过滤共享资源,例如,如果选择了一个目录进行共享,但需要排除其中的一些内容。

Clipboard

待办事项
提及Boyer-Moore算法


使用DHT

[编辑 | 编辑源代码]
Clipboard

待办事项
完整内容


Clipboard

待办事项
完整内容


Clipboard

待办事项
…跟踪…


种子(Seeds)

[编辑 | 编辑源代码]

吸附者(Leechers)

[编辑 | 编辑源代码]

在自然界中,合作现象普遍存在,但吸附者(欺诈者、变异体)也同样存在。从进化的角度来看,欺诈者确实应该会繁荣发展,因为他们不为集体利益做出贡献,只是简单地获取他人合作努力的成果,但事实并非如此。两者都使用不同的策略竞争相同的目标,合作是所有人成本最低的途径(即使从长远来看,吸附者也是如此),合作提供了稳定性和可预测性,另一方面,如果不对欺诈者进行某种程度的平衡,它们会导致系统退化,最终导致系统整体崩溃。

在计算机科学中,尤其是在互联网上,“吸附”或“吸附者”指的是受益于他人信息或努力的行为,通常是故意的,但没有提供任何回报,或者只提供象征性的回报以试图避免被称之为吸附者。这种行为普遍受到谴责。

这个名称来源于水蛭,一种吸食血液然后试图悄无声息离开的动物。其他术语也被使用,例如“免费搭车者”,但“吸附者”是最常见的。

示例

  • 在点对点网络中,吸附者不共享任何内容(或很少共享无价值的内容)进行上传。许多应用程序都提供了处理吸附者的选项,例如降低对不共享任何内容的用户上传速度,或者完全不允许他们上传。一些文件共享论坛有反吸附策略来保护下载内容,这要求用户付出比大多数吸附者愿意付出的更多精力或耐心,才能访问“下载区域”。
  • 大多数BitTorrent网站将吸附者称为正在下载文件但无法播种(Seeding)的客户端,因为他们没有文件的完整副本。它们默认配置为允许某个客户端在上传更多时下载更多。
  • 在共享网络(例如学校或办公室局域网)上,任何故意过度使用带宽的行为(达到明显降低网络正常使用程度的程度)都可以称为吸附。
  • 在网络游戏中(尤其是角色扮演游戏),吸附指的是玩家加入一个团队的明确目的是为了获取奖励,而不对获得这些奖励所必需的努力做出任何贡献。有时,为了提升玩家等级,这是允许的。通常,在未经团队许可的情况下这样做被认为是不好的行为。在第一人称射击游戏中,这个术语指的是依靠队友获得胜利的玩家。
  • 直接链接是一种带宽吸附形式,它发生在将未经授权的链接对象(通常是图像)从一个网站放置到属于第二个网站(吸附者)的网页中时。这构成对主机网站带宽和内容的未经授权的使用。

在某些情况下,吸附被用作“免费搭车”的同义词,而不是仅限于计算机环境。

可能的解决方案

[编辑 | 编辑源代码]
Clipboard

待办事项
完整内容


信任与声誉
[编辑 | 编辑源代码]

由于点对点网络的易变性和模块化特性,对等信任(在构建社区的参考中提到)和用户参与是为在线服务或资源交易提供动机或润滑剂的少数几个因素之一,最终归因于创建者。参与者拥有良好的平均声誉也将增强对网络及其上构建的系统的信任。


Clipboard

待办事项
完整内容


文件共享

[编辑 | 编辑源代码]
Sharing.
共享。

传统上,文件传输涉及两台计算机,通常被指定为客户端和服务器,大多数操作用于将文件从一台机器复制到另一台机器。

大多数Web和FTP服务器因受欢迎而受到惩罚。由于所有上传都从一个中央位置进行,因此受欢迎的网站需要更多资源(CPU和带宽)才能应对。通过使用P2P,客户端会自动镜像他们下载的文件,从而减轻发布者的负担。

大多数P2P协议的一个限制是它们不提供复杂的文件系统仿真或用户权限系统,因此像NFS或FTP协议提供的复杂文件操作非常少见,这也有其原因,因为网络是分散的,因此很难实现用户身份验证系统,而且大多数系统很容易被破解。

关于P2P传输的另一个概念是带宽的使用,事情不会是线性的,传输将取决于资源的可用性、种子节点的负载、网络大小以及本地用户的连接及其带宽上的负载。

如前所述,下载具有限制性版权、许可证或在特定国家/地区法律下的文件可能会增加被起诉的风险。这些网络上提供的一些文件可能是受版权保护或受法律保护的。您必须意识到存在风险。

Clipboard

待办事项
…身份验证… …数字签名…


来自多个来源(分段下载、集群)

[编辑 | 编辑源代码]

多源下载(分段下载、集群下载)可能是从多个对等节点同时下载文件的更有效方法。单个文件并行地从文件的几个不同的来源或上传者下载。这可以帮助一群用户使用非对称连接(例如ADSL)为一个下载者提供高总带宽,并处理下载需求高峰。所有集群传输都依赖于至少存在一个完整的文件副本(可能的演变包括在混合中添加某种里德-所罗门(RS)算法),并且它主要用于大型文件(大小取决于可用带宽,因为权衡包括更高的CPU成本和额外的数据传输以使系统工作)。

这种技术不能神奇地解决问题,在一组上传带宽不足的用户中,需求高于供应。但是,它可以很好地处理峰值,并且在某种程度上还可以让上传者“更频繁地”上传,以更好地利用他们的连接。但是,简单的实现通常会导致文件损坏,因为无法知道所有来源是否都实际上传了同一文件的片段。这导致大多数程序使用某种校验和哈希算法的分段下载来确保文件完整性。

Clipboard

待办事项
完整内容


下载时预览

[编辑 | 编辑源代码]

允许用户在下载过程完成之前尽可能早地预览文件可能会有所帮助,这将提高网络上共享的质量,增强用户的信心并减少时间和带宽的浪费。

安全性

[编辑 | 编辑源代码]
Clipboard

待办事项
完整内容


投毒和污染
[编辑 | 编辑源代码]

例如

  • 投毒攻击(例如,提供内容与描述不符的文件)
  • 污染攻击(例如,在网络上原本有效的文件中插入“不良”数据块/数据包)
  • 插入
    • 病毒到传输数据中(例如,下载或传输的文件可能感染了病毒或其他恶意软件)
    • 对等网络软件本身中的恶意软件(例如,分发软件可能包含间谍软件)
版权保护
[编辑 | 编辑源代码]

不应该将保护内容版权的责任强加给公众,即使今天大多数版权政策已经取消了声明作品保留权利的必要性,也不应该期望公众必须不遗余力地保护少数人的利益,尤其是在这些利益没有明确说明的情况下。预计今天公共领域的著作数量将超过拥有有效版权的著作数量。

鉴于实际情况,任何P2P应用程序都应有义务告知用户由于这种非常混乱的情况而产生的问题。一些缓解问题并帮助版权所有者保护其作品的解决方案已经逐渐出现,但那些应该关心此问题的人似乎没有表现出任何兴趣。本节将尝试展示可用的可能性。

解决此问题的简单方法是明确将识别受版权保护的作品的责任赋予权利所有者,为了实施此解决方案,需要向P2P应用程序提供一个可公开访问的数据库,以便可以声明内容受版权保护,或者必须创建一个标准来明确识别这些作品。针对这个问题,已经讨论和提出了几种解决方案,但在2003年7月,Kokopelli Network Inc.(由Alex Sauriol共同创立)提出了名为BluFilter的解决方案,该方案允许通过比较存储在mp3中的波形来识别版权状态(参见kokopellinetworks.com @ web.archive.org),这种方法似乎是可行的,但似乎还没有公开使用类似的技术来告知用户,但有传言称类似的方法已被用作法律诉讼的基础。


Clipboard

待办事项
完整内容


分布式代理

[编辑 | 编辑源代码]
Clipboard

待办事项
完整(Tor,Squid)


Clipboard

待办事项
完整内容


分布式流媒体

[编辑 | 编辑源代码]
Clipboard

待办事项
完整(Freecast)


优先级设置

[编辑 | 编辑源代码]

启用传输的动态优先级设置不仅可以使用户满意,还可以提供一种简单的方法来提升热门内容的传输速度,从而提高其在网络上的复制速度。

人们甚至可以更进一步,允许按资源进行配置,启用对每个资源的删除或配置访问权限,就像在文件系统上一样,甚至启用一种方式来允许数据自由交易的市场,让用户为该资源设置特定的比率。

带宽调度程序

[编辑 | 编辑源代码]

管理本地资源不仅对本地用户很重要,对全局网络也很重要。管理和启用对应用程序带宽使用的控制将作为激励用户改进其管理该资源(使用什么以及如何使用)的方式,如果应用程序将其视为动态资源,则可以通过减少浪费对全局网络产生积极影响。

许多现有的P2P应用程序都允许用户控制其带宽,但这不仅仅是P2P可以从中受益的策略,如今,大多数计算机的重要组成部分都已连接到互联网,因此管理这种稀缺资源至关重要。一个例子是微软的后台智能传输服务(BITS),旨在允许系统更新甚至MS IM服务在其他应用程序未使用带宽时传输数据,值得注意的是,还可以使用BITS技术,因为它通过组件对象模型(COM)公开。

华夏公益教科书