P2P系统的研究中,大多侧重于资源管理,传输策略相对研究得少一点。

在P2P系统中,资源信息的存储、检索与P2P的架构相关,常见的P2P架构有:


1. 集中式


2. 非集中式无结构化


3. 非集中式结构化


4. 混杂结构


集中式的通过中心服务器为所有的节点提供资源信息存储和检索服务,效率最高,但鲁棒性不佳,代表作napster。


为了应对这个问题,就研究了非集中式的结构,最开始实现的是无结构的,效率非常低,代表作是gnutella早期的版本。


后来研究将资源按照一定的结构存储在P2P网络中,提高了存储和检索的效率,应用最广泛的是DHT技术,代表作有BT和电驴。


混杂结构通常是将集中式和其他两种技术结合在一起,应用不太广泛,gnutella后期的版本使用这个技术。

在解决了资源发现的问题后,大部分以媒体服务为主的P2P系统最终还是要传输数据。


数据传输策略应该包含上传策略和下载策略。


这里先说上传策略,在不同的系统中有不同的场景,使用的上传策略也常会有所不同。

1. 来者不拒。这是最简单的实现方法,不做上传控制,谁要就给谁,很多简单的P2P实现都会采用这种方式。


在mesh-pull模式下的live streaming系统,这种策略就可以较充分的利用上行带宽,付出的代价是延迟较大。

对单个Peer来说,上传带宽总是有限的,在带宽不充足的时候,对上传对象做一定的选择可以更好的达到目标。

2. BT的tic-for-tac策略。如果像BT这样协议公开的P2P系统,来者不拒的上传策略会遇到严重问题,


每个人都想找别人要数据,而不怎么关心(甚至不愿意)给别人数据,这会导致P2P系统根本无法正常运行,


因为每个人都下完就离开了。


BT的作者设计了一个非常精巧的策略:上行带宽用满时,谁给我传,我给谁传。这样就避免了有人只下载不上传,


如果你想下载更多,你最好上传更多。

然而这个策略可能导致囚徒困境,连接的每个Peer都不愿意给别的Peer传。


为了解决这个问题,BT的实现引入了optimistic unchoking,轮流向每个Peer上传一点数据,打破困境。

3. 电驴的积分制。BT的tic-for-tac策略是应用在一个资源(种子)上,而电驴更鼓励长期分享,采用了一种积分制度。


积分与上传,上传下载比有关,对方给我上传越多,下载越少,积分越高,上传的时候就会优先排队,本质上是一种长期的tic-for-tac策略。


同样为了避免囚徒困境,对于新加入的用户,有一个基本积分,不至于新加入的用户无法获得下载。


使用电驴时,一开始速度很快,但不久后速度就慢下来了,就是这个原因。

不幸的是,有人利用BT/电驴上传策略的漏洞,于是
吸血驴
就诞生了。


BT/电驴社区也尝试采用反吸血技术,但没能根本上解决问题。学术界有很多这方面的研究,目前貌似还没有被广泛应用。

4. rarest-first。前面都是讨论的节点向谁提供数据,努力让P2P网络更健康,但是P2P网络还有另一个威胁:节点随时可能退出。


如果某个Peer拥有唯一的资源/数据,其他节点又需要,而此时它的退出就会导致所有Peer都不能获得这份资源/数据。


所以在上传的时候,还可以引入一个控制能力,上传哪些数据?


这就是rarest-first策略的目标,优先上传分布最少的资源,对抗节点随机退出。


这在BT做种过程中非常关键,如果所有Peer都是从头到尾下载,那种子必须等到第一个Peer下载完成后退出才安全。


如果采用rarest-first策略,最理想的情况是只上传完一份数据退出就可以了。


Super Seeding
 也是一种上传策略,与rarest-first在设计上有一些类似。