导航:首页 > 源码编译 > 一次解析p2p源码

一次解析p2p源码

发布时间:2023-02-23 07:46:36

① [以太坊源码分析][p2p网络07]:同步区块和交易

同步,也就是区块链的数据的同步。这里分为两种同步方式,一是本地区块链与远程节点的区块链进行同步,二是将交易均匀的同步给相邻的节点。

01.同步区块链
02.同步交易
03.总结

ProtocolManager 协议管理中的 go pm.syncer() 协程。

先启动了 fetcher ,辅助同步区块用的。然后等待不同的事件触发不同的同步方式。

同步的过程调用 pm.synchronise 方法来进行。

ProtocolManager 协议管理中的 go pm.txsyncLoop() 协程。

同步交易循环 txsyncLoop 分为三个部分的内容:

发送交易的函数。

挑选函数。

三个监听协程的 case 。

② 什么是P2P

是用自己电脑里的资源作为BT传播其他人下载的种子。

BitTorrent(简称BT,俗称BT下载、变态下载)是一个多点下载的源码公开的P2P软件,使用非常方便,就像一个浏览器插件,很适合新发布的热门下载。其特点简单的说就是:下载的人越多,速度越快一般简称 BT(BitTorrent) 也就是大家所说的变态下载。

该软件相当的特殊,一般我们下载档案或软件,大都由 HTTP 站点或FTP 站台下载,若同时间下载人数多时,基于该服务器频宽的因素,速度会减慢许多,而该软件却不同,恰巧相反,同时间下载的人数越多你下载的速度便越快,因为它采用了多点对多点的传输原理。

注意事项

1. 想知道自己是内网还是外网的看自己的 IP , 10.x.x.x ,172.16.x.x , 192.168.x.x 都是内网,看不见远程的基本也是内网。

2. 外网用户如果 BitComet0.06 下载效果不理想可以试用 BC 以前版本或者贪婪 abc 、比特精灵等。

3. 限制上传的朋友下载完毕后,强烈要求取消全局上传限制做种3 个小时以上。

4. 热门种子下载时,尽量只下载一个文件,这样才让你享受到 BitComet 的飞速快感。

5. 上传参数的选取,要依据自己的网络情况,仔细调整,如果我说的参数不适合您,请您自己多琢磨,仔细进行微调。

③ 什么是p2p网贷平台源码网贷源码有哪些

网贷,又称为p2p网络借贷。P2P是英文peer to peer的缩写,意即“个人对个人”。网络信贷起源于英国,随后发展到美国、德国和其他国家,其典型的模式为:网络信贷公司提供平台,由借贷双方自由竞价,撮合成交。资金借出人获取利息收益,并承担风险;资金借入人到期偿还本金,网络信贷公司收取中介服务费。p2p网贷平台源码基本上是不可能给公开下载的,网上有部分p2p网贷源码泄露了,那源码也是被修改过很多次的了,会隐藏也多bug的。下载安装后期维护成本很高,还不利于二次开发!你可以去看看迪蒙的网贷系统,中国网贷系统第一品牌,安全可靠,功能也很齐全,完全能满足企业定制开发需求。

④ 详解P2P技术中的NAT穿透原理(转载)

课程地址:零声学院 WebRTC入门与提高 https://ke.qq.com/course/435382?tuin=137bb271

技术支持QQ群:782508536

最近介入测试P2P的相关逻辑,因此对NAT穿透原理做了一定程度的了解(当然也没有很深入)。本篇文章也是综合和参考了些网络上和文献里的一些资料(文中没有对引用处进行标记,请见谅)。写本文的目的就是,用自己的语言描述了这个过程,同时也在描述过程中加入了一些自己的理解,形成一篇文章作为要点的记录。对于这一块的知识,自己也有很多盲点,还请各路大神多多指教。

NAT(Network Address Translation,网络地址转换),也叫做网络掩蔽或者IP掩蔽。NAT是一种网络地址翻译技术,主要是将内部的私有IP地址(private IP)转换成可以在公网使用的公网IP(public IP)。

时光回到上个世纪80年代,当时的人们在设计网络地址的时候,觉得再怎么样也不会有超过32bits位长即2的32次幂台终端设备连入互联网,再加上增加ip的长度(即使是从4字节增到6字节)对当时设备的计算、存储、传输成本也是相当巨大的。后来逐渐发现IP地址不够用了,然后就NAT就诞生了!(虽然ipv6也是解决办法,但始终普及不开来,而且未来到底ipv6够不够用仍是未知)。

因此,NAT技术能够兴起的原因还是因为在我们国家公网IP地址太少了,不够用,所以才会采取这种地址转换的策略。可见,NAT的本质就是让一群机器公用同一个IP,这样就暂时解决了IP短缺的问题。

优势其实上面已经刚刚讨论过了,根据定义,比较容易看出,NAT可以同时让多个计算机同时联网,并隐藏其内网IP,因此也增加了内网的网络安全性;此外,NAT对来自外部的数据查看其NAT映射记录,对没有相应记录的数据包进行拒绝,提高了网络安全性。

那么,NAT与此同时也带来一些弊端:首先是,NAT设备会对数据包进行编辑修改,这样就降低了发送数据的效率;此外,各种协议的应用各有不同,有的协议是无法通过NAT的(不能通过NAT的协议还是蛮多的),这就需要通过穿透技术来解决。我们后面会重点讨论穿透技术。

简单的背景了解过后,下面介绍下NAT实现的主要方式,以及NAT都有哪些类型。

1)静态NAT:也就是静态地址转换。是指一个公网IP对应一个私有IP,是一对一的转换,同时注意,这里只进行了IP转换,而没有进行端口的转换。举个栗子:

2)NAPT:端口多路复用技术。与静态NAT的差别是,NAPT不但要转换IP地址,还要进行传输层的端口转换。具体的表现形式就是,对外只有一个公网IP,通过端口来区别不同私有IP主机的数据。再举个栗子。

通过上面NAT实现方式的介绍,我们其实不难看出,现实环境中NAPT的应用显然是更广泛的。因此下面就重点介绍下NAPT的主要类型有哪些。

对于NAPT我们主要分为两大类:锥型NAT和对称型NAT。其中锥型NAT又分:完全锥型,受限锥型和端口受限锥型。概括的说:对称型NAT是一个请求对应一个端口;锥型NAT(非对称NAT)是多个请求(外部发向内部)对应一个端口,只要源IP端口不变,无论发往的目的IP是否相同,在NAT上都映射为同一个端口,形象的看起来就像锥子一样。下面分别介绍这四种类型及其差异。

1)完全锥型NAT(Full Cone NAT,后面简称FC)

特点:IP和端口都不受限。

表现形式:将来自内部同一个IP地址同一个端口号(IP_IN_A : PORT_IN_A)的主机监听/请求,映射到公网IP某个端口(IP_OUT_B : PORT_OUT_B)的监听。任意外部IP地址与端口对其自己公网的IP这个映射后的端口访问(IP_OUT_B : PORT_OUT_B),都将重新定位到内部这个主机(IP_IN_A : PORT_IN_A)。该技术中,基于C/S架构的应用可以在任何一端发起连接。是不是很绕啊。再简单一点的说,就是,只要客户端,由内到外建立一个映射(NatIP:NatPort -> A:P1)之后,其他IP的主机B或端口A:P2都可以使用这个洞给客户端发送数据。见下图()。

2)受限锥型NAT(Restricted Cone NAT)

特点:IP受限,端口不受限。

表现形式:与完全锥形NAT不同的是,在公网映射端口后,并不允许所有IP进行对于该端口的访问,要想通信必需内部主机对某个外部IP主机发起过连接,然后这个外部IP主机就可以与该内部主机通信了,但端口不做限制。举个栗子。当客户端由内到外建立映射(NatIP:NatPort –> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。因为IP受限啦,但是端口随便。见下图(绿色是允许通信,红色是禁止通信)。

3)端口受限型NAT(Port Restricted Cone NAT)

特点:IP和端口都受限。

表现形式:该技术与受限锥形NAT相比更为严格。除具有受限锥形NAT特性,对于回复主机的端口也有要求。也就是说:只有当内部主机曾经发送过报文给外部主机(假设其IP地址为A且端口为P1)之后,外部主机才能以公网IP:PORT中的信息作为目标地址和目标端口,向内部主机发送UDP报文,同时,其请求报文的IP必须是A,端口必须为P1(使用IP地址为A,端口为P2,或者IP地址为B,端口为P1都将通信失败)。例子见下图。这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。

4)对称型NAT(Symmetric NAT)

特点:对每个外部主机或端口的会话都会映射为不同的端口(洞)。

表现形式:只有来自同一内部IP:PORT、且针对同一目标IP:PORT的请求才被NAT转换至同一个公网(外部)IP:PORT,否则的话,NAT将为之分配一个新的外部(公网)IP:PORT。并且,只有曾经收到过内部主机请求的外部主机才能向内部主机发送数据包。内部主机用同一IP与同一端口与外部多IP通信。客户端想和服务器A(IP_A:PORT_A)建立连接,是通过NAT映射为NatIP:NatPortA来进行的。而客户端和服务器B(IP_B:PORT_B)建立连接,是通过NAT映射为NatIP:NatPortB来进行的。即同一个客户端和不同的目标IP:PORT通信,经过NAT映射后的公网IP:PORT是不同的。此时,如果B想要和客户端通信,也只能通过NatIP:NatPortB(也就是紫色的洞洞)来进行,而不能通过NatIP:NatPortA(也就是黄色的洞洞)。

以上,就是NAPT的四种NAT类型。可以看出由类型1)至类型4),NAT的限制是越来越大的。

根据上面的介绍,我们可以了解到,在实际的网络情况中,各个设备所处的网络环境是不同的。那么,如果这些设备想要进行通信,首先判断出设备所处的网络类型就是非常重要的一步。举个例子来说:对于视频会议和VoIP软件,对位于不同NAT内部的主机通信需要靠服务器来转发完成,这样就会增加服务器的负担。为了解决这种问题,要尽量使位于不同NAT内部的主机建立直接通信,其中,最重要的一点就是要判断出NAT的类型,然后才能根据NAT的类型,设计出直接通信方案。不然的话,两个都在NAT的终端怎么通信呢?我们不知道对方的内网IP,即使把消息发到对方的网关,然后呢?网关怎么知道这条消息给谁,而且谁允许网关这么做了?

为了解决这个问题,也就是处于内网的主机之间能够穿越它们之间的NAT建立直接通信,已经提出了许多方法,STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)技术就是其中比较重要的一种解决方法,并得到了广泛的应用。在这个部分,我们将重点介绍下STUN技术的原理。(PS:除此之外,还有UPNP技术,ALG应用层网关识别技术,SBC会话边界控制,ICE交互式连接建立,TURN中继NAT穿越技术等等,本文不一一做介绍。)

STUN是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。STUN由三部分组成:STUN客户端、STUN服务器端、NAT路由器。STUN服务端部署在一台有着两个公网IP的服务器上。大概的结构参考下图。STUN客户端通过向服务器端发送不同的消息类型,根据服务器端不同的响应来做出相应的判断,一旦客户端得知了Internet端的UDP端口,通信就可以开始了。

STUN协议定义了三类测试过程来检测NAT类型。

Test1: STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S1}把它所看到的STUN Client的IP和端口{IP-M1,Port-M1}作为Binding Response的内容回送给STUN Client。 Test1#2:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S2:Port-S2}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M1#2,Port-M1#2}作为Binding Response的内容回送给STUN Client。

Test2: STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(设置了Change IP和Change Port属性)。STUN Server收到该请求后,通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M2,Port-M2}作为Binding Response的内容回送给STUN Client。

Test3: STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(设置了Change Port属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S2}把它所看到的STUN Client的IP和端口{IP-M3,Port-M3}作为Binding Response的内容回送给STUN Client。

STUN协议的输出是: 1)公网IP和Port 2)防火墙是否设置 3)客户端是否在NAT之后,及所处的NAT的类型

因此我们进而整理出,通过STUN协议,我们可以检测的类型一共有以下七种:

A:公开的互联网IP。主机拥有公网IP,并且没有防火墙,可自由与外部通信 B:完全锥形NAT。 C:受限制锥形NAT。 D:端口受限制形NAT。 E:对称型UDP防火墙。主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙。 F:对称型NAT G:防火墙限制UDP通信。

输入和输出准备好后,附上一张维基网络的流程图,就可以描述STUN协议的判断过程了。

STEP1:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后 -- Test1 客户端建立UDP socket,然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port,客户端发送请求后立即开始接受数据包。重复几次。 a)如果每次都超时收不到服务器的响应,则说明客户端无法进行UDP通信,可能是:G防火墙阻止UDP通信 b)如果能收到回应,则把服务器返回的客户端的(IP:PORT)同(Local IP: Local Port)比较: 如果完全相同则客户端不在NAT后,这样的客户端是:A具有公网IP可以直接监听UDP端口接收数据进行通信或者E。 否则客户端在NAT后要做进一步的NAT类型检测(继续)。

STEP2:检测客户端防火墙类型 -- Test2 STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT向客户端回复包: a)收不到服务器从其他IP地址的回复,认为包前被前置防火墙阻断,网络类型为E b)收到则认为客户端处在一个开放的网络上,网络类型为A

STEP3:检测客户端NAT是否是FULL CONE NAT -- Test2 客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包,客户端发送请求后立即开始接受数据包。 重复这个过程若干次。 a)如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。 b)如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信。

STEP4:检测客户端NAT是否是SYMMETRIC NAT -- Test1#2 客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包。 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。 用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。 比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)因为对称型NAT,每次连接端口都不一样,所以无法知道对称NAT的客户端,下一次会用什么端口。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

STEP5:检测客户端NAT是Restricted Cone 还是 Port Restricted Cone -- Test3 客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包。重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

通过以上过程,至此,就可以分析和判断出客户端是否处于NAT之后,以及NAT的类型及其公网IP,以及判断客户端是否具备P2P通信的能力了。当然这是自己个人笔记的第一篇,后面,再作一篇笔记《NAT穿透原理浅析(二)》分析下不同NAT类型的穿透打洞策略。

⑤ IPFS(四) 源码解读之-p2p

package p2p

import (
"context"
"errors"
"time"

net "gx/ipfs//go-libp2p-net"
manet "gx/ipfs//go-multiaddr-net"
ma "gx/ipfs//go-multiaddr"
pro "gx/ipfs//go-libp2p-protocol"
pstore "gx/ipfs//go-libp2p-peerstore"
p2phost "gx/ipfs//go-libp2p-host"
peer "gx/ipfs//go-libp2p-peer"
)
//P2P结构保存当前正在运行的流/监听器的信息
// P2P structure holds information on currently running streams/listeners
type P2P struct {
//监听器
Listeners ListenerRegistry
//数据流
Streams StreamRegistry
//节点ID
identity peer.ID
//节点地址
peerHost p2phost.Host
//一个线程安全的对等节点存储
peerstore pstore.Peerstore
}
//创建一个新的p2p结构
// NewP2P creates new P2P struct
//这个新的p2p结构不包含p2p结构中的监听器和数据流
func NewP2P(identity peer.ID, peerHost p2phost.Host, peerstore pstore.Peerstore) *P2P {
return &P2P{
identity: identity,
peerHost: peerHost,
peerstore: peerstore,
}
}
//新建一个数据流 工具方法 构建一个有节点id,内容和协议的流
func (p2p P2P) newStreamTo(ctx2 context.Context, p peer.ID, protocol string) (net.Stream, error) {
//30s 后会自动timeout
ctx, cancel := context.WithTimeout(ctx2, time.Second
30) //TODO: configurable?
defer cancel()
err := p2p.peerHost.Connect(ctx, pstore.PeerInfo{ID: p})
if err != nil {
return nil, err
}

return p2p.peerHost.NewStream(ctx2, p, pro.ID(protocol))
}
//对话为远程监听器创建新的P2P流
//创建一个新的p2p流实现对对话的监听
// Dial creates new P2P stream to a remote listener
//Multiaddr是一种跨协议、跨平台的表示格式的互联网地址。它强调明确性和自我描述。
//对内接收
func (p2p P2P) Dial(ctx context.Context, addr ma.Multiaddr, peer peer.ID, proto string, bindAddr ma.Multiaddr) ( ListenerInfo, error) {
//获取一些节点信息 network, host, nil
lnet, _, err := manet.DialArgs(bindAddr)
if err != nil {
return nil, err
}
//监听信息
listenerInfo := ListenerInfo{
//节点身份
Identity: p2p.identity,
////应用程序协议标识符。
Protocol: proto,
}
//调用newStreamTo 通过ctx(内容) peer(节点id) proto(协议标识符) 参数获取一个新的数据流
remote, err := p2p.newStreamTo(ctx, peer, proto)
if err != nil {
return nil, err
}
//network协议标识
switch lnet {
//network为"tcp", "tcp4", "tcp6"
case "tcp", "tcp4", "tcp6":
//从监听器获取新的信息 nla.Listener, nil
listener, err := manet.Listen(bindAddr)
if err != nil {
if err2 := remote.Reset(); err2 != nil {
return nil, err2
}
return nil, err
}
//将获取的新信息保存到listenerInfo
listenerInfo.Address = listener.Multiaddr()
listenerInfo.Closer = listener
listenerInfo.Running = true
//开启接受
go p2p.doAccept(&listenerInfo, remote, listener)

default:
return nil, errors.New("unsupported protocol: " + lnet)
}

return &listenerInfo, nil
}
//
func (p2p *P2P) doAccept(listenerInfo *ListenerInfo, remote net.Stream, listener manet.Listener) {
//关闭侦听器并删除流处理程序
defer listener.Close()
//Returns a Multiaddr friendly Conn
//一个有好的 Multiaddr 连接
local, err := listener.Accept()
if err != nil {
return
}

stream := StreamInfo{
//连接协议
Protocol: listenerInfo.Protocol,
//定位节点
LocalPeer: listenerInfo.Identity,
//定位节点地址
LocalAddr: listenerInfo.Address,
//远程节点
RemotePeer: remote.Conn().RemotePeer(),
//远程节点地址
RemoteAddr: remote.Conn().RemoteMultiaddr(),
//定位
Local: local,
//远程
Remote: remote,
//注册码
Registry: &p2p.Streams,
}
//注册连接信息
p2p.Streams.Register(&stream)
//开启节点广播
stream.startStreaming()
}
//侦听器将流处理程序包装到侦听器中
// Listener wraps stream handler into a listener
type Listener interface {
Accept() (net.Stream, error)
Close() error
}
//P2PListener保存关于侦听器的信息
// P2PListener holds information on a listener
type P2PListener struct {
peerHost p2phost.Host
conCh chan net.Stream
proto pro.ID
ctx context.Context
cancel func()
}
//等待侦听器的连接
// Accept waits for a connection from the listener
func (il *P2PListener) Accept() (net.Stream, error) {
select {
case c := <-il.conCh:
return c, nil
case <-il.ctx.Done():
return nil, il.ctx.Err()
}
}
//关闭侦听器并删除流处理程序
// Close closes the listener and removes stream handler
func (il *P2PListener) Close() error {
il.cancel()
il.peerHost.RemoveStreamHandler(il.proto)
return nil
}
// Listen创建新的P2PListener
// Listen creates new P2PListener
func (p2p P2P) registerStreamHandler(ctx2 context.Context, protocol string) ( P2PListener, error) {
ctx, cancel := context.WithCancel(ctx2)

list := &P2PListener{
peerHost: p2p.peerHost,
proto: pro.ID(protocol),
conCh: make(chan net.Stream),
ctx: ctx,
cancel: cancel,
}

p2p.peerHost.SetStreamHandler(list.proto, func(s net.Stream) {
select {
case list.conCh <- s:
case <-ctx.Done():
s.Reset()
}
})

return list, nil
}
// NewListener创建新的p2p侦听器
// NewListener creates new p2p listener
//对外广播
func (p2p P2P) NewListener(ctx context.Context, proto string, addr ma.Multiaddr) ( ListenerInfo, error) {
//调用registerStreamHandler 构造一个新的listener
listener, err := p2p.registerStreamHandler(ctx, proto)
if err != nil {
return nil, err
}
//构造新的listenerInfo
listenerInfo := ListenerInfo{
Identity: p2p.identity,
Protocol: proto,
Address: addr,
Closer: listener,
Running: true,
Registry: &p2p.Listeners,
}

go p2p.acceptStreams(&listenerInfo, listener)
//注册连接信息
p2p.Listeners.Register(&listenerInfo)

return &listenerInfo, nil
}
//接受流
func (p2p *P2P) acceptStreams(listenerInfo *ListenerInfo, listener Listener) {
for listenerInfo.Running {
//一个有好的 远程 连接
remote, err := listener.Accept()
if err != nil {
listener.Close()
break
}

}
//取消注册表中的p2p侦听器
p2p.Listeners.Deregister(listenerInfo.Protocol)
}
// CheckProtoExists检查是否注册了协议处理程序
// mux处理程序
// CheckProtoExists checks whether a protocol handler is registered to
// mux handler
func (p2p *P2P) CheckProtoExists(proto string) bool {
protos := p2p.peerHost.Mux().Protocols()

for _, p := range protos {
if p != proto {
continue
}
return true
}
return false
}

⑥ p2p网贷系统源码怎么使用

杭州融都网贷系统,专注于高端定制的平台就比较安全,有专门人员定期维护,检查漏洞,补丁跟新等,而且服务器部署高安全。全体24小时都有人在时刻检查 特别稳定

⑦ 投屏解析p2p版是什么意思

peer to peer
就是点对点传输的意思
网络中p2p的技术意义是指:计算机网络,其中每个客户计算机都可以作为其他计算机的服务器,允许对文件和外围设备的共享访问,而不需要中央服务器。也可简单的理解为:一对一或点对点传输,平等共享资源的意思。具体在网络中的应用有视频或音频资料的p2p共享模式。这种模式属于不计较版权的,可以由看客的计算机在收看收听的同时,共享给其它就近的想看想听的客户,而不需要通过总部统一发布。

⑧ p2p的原理

P2P软件是基于P2P技术工作的

1、什么是p2p

P2P是一种技术,但更多的是一种思想,有着改变整个互联网基础的潜能的思想。

(1)p2p的概念

P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。这样一来,P2P也就可以理解为“伙伴对伙伴”的意思,或称为对等联网。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。

简单的说,P2P直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。P2P就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。P2P另一个重要特点是改变互联网现在的以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。 P2P看起来似乎很新,但是正如B2C、B2B是将现实世界中很平常的东西移植到互联网上一样,P2P并不是什么新东西。在现实生活中我们每天都按照P2P模式面对面地或者通过电话交流和沟通。

即使从网络看,P2P也不是新概念,P2P是互联网整体架构的基础。互联网最基本的协议TCP/IP并没有客户机和服务器的概念,所有的设备都是通讯的平等的一端。在十年之前,所有的互联网上的系统都同时具有服务器和客户机的功能。当然,后来发展的那些架构在TCP/IP之上的软件的确采用了客户机/服务器的结构:浏览器和Web服务器,邮件客户端和邮件服务器。但是,对于服务器来说,它们之间仍然是对等联网的。以email为例,互联网上并没有一个巨大的、唯一的邮件服务器来处理所有的email,而是对等联网的邮件服务器相互协作把email传送到相应的服务器上去。另外用户之间email则一直对等的联络渠道。 当然但是过去的5年里,互联网的发展至少从表面上远离了P2P,互联网上绝大部分的节点也不能和其他节点直接地交流。Napster正是唤醒了深藏在互联网背后的对等联网。Napster的文件共享功能在局域网中共享目录也是再平常不过的事情。但是Napster的成功促使人们认识到把这种“对等联网”拓展到整个互联网范围的可能性。当然,在许多人的眼中,Napster并不是纯粹的P2P,它仍然需要一个处于中心协调机制。

事实上,网络上现有的许多服务可以归入P2P的行列。即时讯息系统譬如ICQ、AOL Instant Messenger、Yahoo Pager、微软的MSN Messenger以及国内的OICQ是最流行的P2P应用。它们允许用户互相沟通和交换信息、交换文件。用户之间的信息交流不是直接的,需要有位于中心的服务器来协调。但这些系统并没有诸如搜索这种对于大量信息共享非常重要的功能,这个特征的缺乏可能正 是为什么即时讯息出现很久但是并没有能够产生如Napster这样的影响的原因之一。

另外一个可以归入P2P是拍卖网站譬如eBay,人们在总结eBay的模式的时候用了C2C,是不是和P2P有一点类似?eBay就是一个将人们联系的和交易物品的社区,用户可以方便的搜索其他用户叫卖的商品。eBay提供了一些使得交易得以顺利进行的服务,但是交易是直接在用户之间进行的。如果将“交易”的概念推广,C2C就是P2P的一个特例,这里人们互相交换的是商品。

但如果仔细深究的话,Napster和即时讯息在赋予用户之间直接交流的能力、eBay使用户可以直接交易的同时,却破坏了服务器端的那种自互联网出现之初就存在的对等联网思想,因为它们都需要有一个位于中心的服务器来协调,而不是分布在世界上不同地方的、对等联网的许多服务器。这也正是诸如Gnutella和Freenet不断的宣称它们创造了“纯粹”的P2P,完全没有中心服务器的P2P服务。

(2)p2p的思想溯源:回到互联网的本质

如果回顾一下,我们会发现在WWW出现伊始P2P就是互联网的本质特征之一。人们各自建立网页、互相做链接,人们上网是沿着链接冲浪。那时的web是真正的“网”(web)。但是当Yahoo!和Lycos建立了搜索引擎和门户站点后,人们上网的方式被改变了,人们从此到一个地方去获取所有的信息。记得_blank">新浪曾经有一段时间说它们是“目标站点”模式,但是如果多问一句,现在人们一条一条地阅读_blank">新浪的新闻,在头脑中还有一个“网”的概念吗?最大的问题是,这些站点控制了信息的流动、充斥了过时的信息、阻碍了真正的交流,或者对于很多人来说,另外还有太多的广告。 P2P就是把控制权重新还到用户手中去。人们通过P2P可以共享硬盘上的文件、目录甚至整个硬盘。这种能量是非常令人激动的,那些费心存储在自己的硬盘上的东西肯定是我们认为最有价值,所有人都共享了他们认为最有价值的东西,这将使互联网上信息的价值得到极大的提升。是不是有一种和WWW刚刚出现的时候同样的激动呢?有一点。

因为每个Peer都代表了其后的人,基于自组织的网上社区也正在显现。与门户站点从上而下建立社区的方式不同,人们将以自发的方式形成社区。

当人们加入P2P网络的时候,所有人都拥有了平等的机会,所有人都拥有了极容易地在网络上创造“内容”的机会。当然,真正在网络上创造或提供内容的人还是少数的,据统计Gnutella的用户中仅仅有2%向其他用户提供了内容,即使在比较活跃的Usenet张贴文章的用户也仅占所有用户的7%。但是,P2P第一次使得所有上网的人都拥有了平等的机会。

下面试图用三句话来揭示P2P的影响:

对等联网:是只读的网络的终结(Peer-to-peer is the end of the read-only Web)

对等联网:使你重新参与互联网(Peer-to-peer allows you to participate in the Internet again)

对等联网:使网络远离电视(Peer-to-peer steering the Internet away from TV)如上文所言,P2P不是一个新思想,从某些角度看它甚至是整个最初创建互联网的最基本的思想。我们不妨花时间作一点回顾。

互联网的发展于近现代的许多尖端科学技术的发展模式并无不同,即都是先在军事工业形成,再转到民用领域。互联网发源于至今看来也十分新颖的战略思想:为了避免敌人的毁灭性武器命中全国的军事指挥控制中心,应该怎么办?传统的方法是一方面想方设法尽可能地不让敌人知道中心的确切位置,另一方面提高中心的抵御打击的能力。

但在当今的核武器年代,对方有着连一个星球都可以炸毁的核弹,再固若金汤的防御措施一旦受到攻击肯定马上化为乌有。而只要有机密存在,总有打探出机密的方法,所以靠保密中心所在位置的方法也不是长远之计。在这种情况下,美国的军事人员充分发挥逆向思维,想到既然不可能长期、有效地保护中心免受攻击,那么还不如根本不设中心!

让每一个基地乃至每一台电脑都能独立运作,这么一来等于有了无数中心,敌人除非真的将这个星球炸了,否则其中一个基地或电脑受损,也不影响其他基地或电脑继续发挥作用。正是这种“非中心化”的思想成为形成互联网最基本的概念。

但是许多技术出现之后往往并不会完全按照原先的设计发展,服务器/客户机的架构逐渐变成了互联网的主流,浏览变成了人们在互联网上最主要的生存方式。互联网的普通用户似乎在慢慢的退化、和电视观众一样被动地浏览着大网站们创造的内容。

人们在网络上的主要活动访问了在这么门户站点上,读新闻、参与讨论组、聊天。但是这使得设计的互联网的一个特性消失了——如果Yahoo因故中断服务如出现什么情况?这种假设不太容易看到,但是年初的黑客攻击各大网站造成的混乱似乎可以给我们一点联想的线索。

上面提到像Napster和即时讯息还是需要位于中心的服务器,那么Gnutella网站上的一句话可能表达了它们所推广的“纯粹”的P2P所包含的“非中心化”的理念:设计Gnutella是为了在核战中生存(Gnutella Is Designed to Survive Nuclear War)。

它的网站上这样描述,纽约的用户受到攻击至多只会影响那个地区的部分用户,而其他地方的Gnutella用户还能正常的使用,这不正是互联网最初的理想吗?

(3)Napster带来的革命

Napster是去年当时由只有18岁的肖恩·范宁(Shawn Fanning)开发的,它提供服务允许音乐迷们交流MP3文件。它与先前也被推上被告席的提供免费音乐下载MP3.com的不同就是在Napster服务器没有一首歌曲,Napster提供了一个新的软件供音乐迷在自己的硬盘上共享歌曲文件,搜索其他用户共享的歌曲文件,并到其他也使用Napster服务的用户硬盘上去下载歌曲。Napster在短时间里吸引了5000万用户,最终,它被五大唱片商以侵犯版权推上被告席而成为世界的焦点。

可能从来没有一个行业象唱片业这样,生存会因为一个小小的软件而受到如此深重的威胁。对于Napster引起的版权问题有过很多的讨论,但是多花一些时间讨论还是值得的,因为这个案件决定了也决定了P2P文件共享这一分支的前途,也决定了未来如何处理互联网上的版权问题。

10月31日原告之一BMG公司和Napster达成和解协议。舆论认为这表明唱片业意识到通过数字方式发布音乐将是不可阻挡的潮流,消灭Napster也无法阻止其他模仿Napster的服务商出现。因此还不如与之合作改变Napster,将之变成在线音乐销售的渠道。现在的唱片工业面临的可能不是如何“像压碎一个鸡蛋”那样压碎,而是与之合作,将Napster的5000万用户变成自己的客户。也就是将Napster的模式变成“合法化的Napster”模式。唱片工业的困境是如何防止那些Napster的模仿者继续免费提供歌曲。

2000年2月12日,美国旧金山第九巡回上诉法院的三名法官就音乐网站Napster版权纠纷案作出裁决,认为它侵害了各大唱片公司的版权。但是三名法官并没有应唱片公司的要求,决定立即关闭网站,而是把最初的判决送回给低一级的地方法院。法官们说,这项裁决内容过于复杂,需作进一步澄清。但错综复杂的法律过程和长达58页的判决书反映了现在既缺乏与互联网相关的版权法,也缺乏相应的司法实践。

但是,不管Napster案的结果如何都不能改变Napster后面的技术和思想给互联网带来的影响。“魔鬼”已经钻出了魔瓶,而魔瓶也已经被打破了。对于唱片界来说,至少它们销售唱片的方式被彻底改变了。下一个可能是好莱坞的电影工业,压缩技术和宽带网络将使得人们会在网络上轻易地传输整部电影。

事实上合法化的网络上已经出现了许多试图推出“合法化的Napster”模式的公司,譬如由Napster的创办人之一创办的lightshare.com和Flycode.com。P2P对于唱片商来说的确有吸引力,如果它们能够从用户身上收费的话。对于利用诸如一个集中的站点提供收费的mp3音乐下载,用户每次从网站下载的时候,网站都必须向电信交流量费,而使用P2P则使得这部分费用不再存在了。因此唱片商获得更多的利润,用户也应该可以得到更便宜的音乐。

从某种意义上软件也好像预测到了大规模盗版和文件共享可能带来的影响,这主要归功于开放源码软件给软件业带来的“头脑风暴”。在亚洲和东欧,软件业已经在反对盗版上打了败仗。这也正是微软极力推广一种“软件注册模式”,把软件作为按月付费的服务出售,而不再是向过去那样出售容易复制和盗版的硬拷贝。

当然,对所谓“合法化的Napster”模式还是有很多质疑。P2P的这种文件共享功能似乎没有带来什么附加值,尽管这个过程可能是非常有趣的。从另一方面来说,这项技术可能被用来推动人们重新参与互联网、创造他们自己的内容,这也许是价值所在。所有的社区网站都有一个“梦想”,让用户互动来产生内容,但是由于由上而下创建的社区的最根本上的问题,这种梦想从来没有真正实现过。P2P或许可以改变这一点。

Napster创造的奇迹同时也是揭示了在互联网时代普通人也具有改变整个世界的能力。当肖恩·范宁在波士顿的东北大学校园开发Napster的时候,他只不过是想和他在维吉尼亚的朋友共享mp3歌曲文件。现在这个小软件改变了整个世界。

(4)p2p改变了什么?内容转移到“边缘”

在回顾了Napster了问题和困境之后,下面将看看P2P的更多激动人心的东西和消除围绕这个新词的种种误解,以及看看P2P的机会主要在哪儿。

P2P带来的一个变化就是改变了“内容”所在的位置,内容正在从“中心”走向“边缘”,也就是说内容将主要不是存在几个主要的服务器上,而是存在所有用户的个人电脑上。

Napster的成功使我们不得不去质疑流传已久的两个断言,“应用服务提供商(ASP)是未来趋势”和“个人电脑死了”。ASP的一个基本假设就是对于大多数客户来说购买和维护高性能的服务器的成本太高了,但是P2P使得每个人办公桌上的电脑都可以成为“服务器”。用户原来是用台式电脑准备好数据之后再把数据上载到服务器上去,而使用P2P将不再需要这个过程。“个人电脑死了”这个断言就是个人电脑将主要用来浏览互联网、字处理等,因此最简单的瘦客户机就可以满足需求。P2P使得个人电脑再一次成为“中心”。P2P使得个人电脑重新焕发活力、不再是被动的客户端,而成为具有服务器和客户端的特征的设备,个人电脑将重新成为互联网的中心。

互联网的存储模式将由现在的“内容位于中心”模式转变为“内容位于边缘”模式。从这个角度看P2P带来了几个改变:

首先,客户不再需要将文件上载到服务器,而只需要使用P2P将共享信息提供出去;

其次运行P2P的个人电脑不需要固定IP地址和永久的互联网连接,这使得那些拨号上网的用户也可以享受P2P带来的变革,这部分用户在所有用户中占有极大的比重;

最后,P2P完全改变过去控制互联网的客户机/服务器模式,消除客户机和服务器二者之间的差别。

上文对Napster所遭遇的法律问题有很多讨论,但是换个角度来阐述,盗版问题往往也正显示存在大量未能满足的需求。Napster的惊人成功(这里指吸引大量用户而不是获得利润)是一种难得的对P2P的概念上可行性的证明,揭示了P2P改变互联网的潜力。直通桌面的宽带网络逐渐成为现实、个人电脑越来越强大足以胜任“服务器”功能也从另外的方面确保P2P发挥其能量。

个人电脑取代位于中心的服务器成为内容的主要存储地将对互联网的几个主要发展方向有着意义深远的影响:这可能改变Windows和Linux几年的“战争”的局面,当“桌面”和服务器逐渐融合,微软可能会极力推广其基于Windows2000的Web服务和“内容处于边缘”(内容处于桌面)模式,从而可能破坏Linux在服务器市场上存在的基础。

提供免费个人主页服务的公司存在的一个理由就是目前互联网使得普通用户很难拥有自己的服务器放置自己的内容。可以预言类似Napster的服务将会出现供人们在自己的个人电脑上发布主页和内容。

WAP等移动服务协议目前还主要关注让人们去使用处于中心的商业服务如新闻、股票信息等。但更多的时候人们最需要的信息是那些在他们的个人电脑上的信息,P2P使这成为可能。人们可以通过无线联网P2P访问他们的个人电脑,这也就是一些公司所宣传的个人化P2P(Personal P2P)的“无线版本”。

当然,这也不是说使用P2P的个人电脑可以取代服务器,那些安全的备份和需要专家来不断更新的数据还将存在于位于中心的服务器上。 可以这样看待P2P带来的转变,“内容位于中心”模式较好的适应了互联网初期的情况,个人电脑性能太差因而需要有专门的服务器、带宽太窄使得个人电脑不得不退化到被动浏览。宽带互联网、更稳定的更高性能的个人电脑使得我们有理由预言下一个5年将是由“内容位于边缘”模式主导。

(5)重新解读P2P

每个具有划时代意义的创新出现的时候它往往可能被人们误读。P2P这次也不例外,Napster让人们开始关注P2P,但也使得许多人认为P2P就是歌曲交换、文件交换,甚至认为P2P和盗版有着必然的联系。可以说人们对P2P的理解是被误导的和不完全的。

自由软件(Free software)出现之初也面临着误读的困境,人们开始的时候将Free理解为免费的,从而认为自由软件是不可靠的、认为自由软件运动是激进的“反文化的”。事实上Free更多的应该指自由地探索想法、在软件中表达出来和共享软件。这一点对自由软件的鼓吹者们来说是自然而然的,但是需要有人去告诉商界、媒体和公众自由软件在经济上和逻辑上是可行的。当时着名出版人O’reilly组织了一次自由软件峰会重新定义自由软件,将自由软件改名为开放源码软件(open source software)。这一重新定义使得人们开始拨开误解的乌云,了解Free的本质。开放源码将人们从有缺陷的软件、锁定效应和传统的软件分发渠道中解脱出来。自由表示合作将可以跨越公司的边界、共享基础性的开发,使人们可以把注意力集中到高附加值的服务上去。 今年8月,O’Reilly又组织另一次峰会来帮助人们认识P2P的潜力和消除Napster、Gnutella造成的P2P是盗版技术的负面影响。另外,他认为目前P2P的状态类似于“盲人摸象”,P2P技术的领导者们每个人都看到了P2P这头“巨象”的一些特征。,如果他们能够有机会交流思想,P2P将会更快地发展。这次P2P峰会主要有三个目的:定义P2P,我们要从中的到什么以及为什么;描述P2P的机会,P2P能解决什么样的问题;形成一个提供给大众的关于P2P的信息,消除那些负面影响。

参与P2P峰会的有媒体不断报道的那些提供文件交换服务如Napster、Gnutella、Freenet的开发者,也有那些试图挖掘P2P分布计算能力的公司和组织如Popular Power、SETI@home、distributed.net等的开发者。后面的三家公司希望使用P2P技术集中那些联接在网络上的电脑的空闲的CPU时间片断、内存空间、硬盘空间来替代“超级计算机”。其它正在进行的P2P应用还有,IBM、微软、Ariba也在合作开展一个名为UDDI的项目以将B2B电子商务标准化;Eazel正在建立下一代的Linux桌面;Jabber已经开发了一种基于XML、开放的即时讯息标准,Jabber被认为是建立了未来使用P2P数据交换的标准;由Lotus Notes的开发者创建的Groove试图“帮助人们以全新的方式沟通”;英特尔也在推广它的P2P技术以帮助更有效地使用芯片的计算能力。

列这样一个名单有一点枯燥,尤其是对于那些对于具体细节没有太多兴趣的读者,但这又是必要的。因为这些描述可以让我们更全面的了解。

(6)尚未被了解的P2P

Napster是与设备相关的,用户连接到到由它创建的P2P网络上是为了获取Mp3歌曲文件。但是对于即时讯息这一类P2P应用来说是完全不同的,别人连接的目的是和另一个Peer交流,而不必管他使用的是电脑、手持电脑或者手机。P2P提供了在网络上与设备无关的实时交流的能力。

这种将把用户实时的连接起来的能力是P2P最令人感到激动的特性。事实上我们可以从AOL的AIM、国内Oicq受欢迎的程度认识到这个事实。

能够实时地寻找和联络需要的人是商业应用的基本要求,电话可以做到这一点,而在网络上最常用的E-mail并不能做到这一点。因此,即时讯息将不仅仅是一个有趣的服务,更多的它将是下一个最基本的互联网商业工具。即时讯息现在看起来可能成为诸如客户服务、供应链管理等商业应用的平台。开发了一个开放源码的基于XML和Java即时讯息服务的Jabber似乎正是创建了一个这样的平台。Jabber的开发者似乎刻意集中了互联网现有的所有激动人心的东西:P2P、Java、XML和开放源码。它是不是有这种潜力呢?我们最好拭目以待,但Jabber的模式至少要比Napster要清晰得多。

Negroponte在其《数字化生存》中曾经有一个着名的论述,“网络上的东西将比人要多”。P2P将使得这些“东西”之间的直接交流成为可能,网络上每个设备都是“活跃”的,而不是像过去那样有部分是非常活跃,而有的则被动的,有时候直接交流的那些设备可能都是某一个用户自己的,譬如说掌上电脑和台式电脑的数据同步是最好的例子。如果用户的掌上电脑上有些数据和内容是台式电脑上没有的,台式电脑也应该能够向掌上电脑要求获取那些信息,这应该跟我们通过Napster到其他用户那儿去搜索和下载mp3歌曲一样。

最重要的一点是,不是网络上的节点数目而是这些节点如何参与网络决定网络是否强大、是否有价值。怎样使得网络上几亿的人和更多的设备都活跃地参与呢?P2P正是一系列架构、技术、策略的开端,它使得互联网的这一理想开始变为现实。现在人们看到的和预言的都只是冰山露出的一个小角,更多的还在水下。

(7)P2P中的P是人(People)!

Dave Winner的论断P2P中的P是人(people)!这可能是我读到的关于P2P最深刻的解读之一。

事实上,我们所处的真实生活是P2P的环境,人们可以和其他人直接地的交流。信息技术将我们带到了网络空间,在网络空间我们仍然希望还能够按照原来的P2P方式交流沟通。尽管互联网本质上是支持对等交流模式,但是网络的发展给对等交流增加了许多障碍。

正如许多技术专家所指出的,动态IP地址、_blank">防火墙、代理服务器从技术上使得对等连接变得很困难。更不用说目前的网络主导模式已经发展成为服务器/客户端模式,人们在网络上只能被动的接受那些大公司诸如Yahoo!、ABCnews.com等提供的信息,交流是非常困难的。(当然,在现实生活中诸如空间、社会等级等也束缚了人们的对等交流。但是如果网络能够使我们看到对等交流的可能性,为什么不去追求?)

可以这样类比,互联网的出现和电话的发明是具有同样的意义的,但是互联网最开始的主要特征是非实时的,更类似于传真,而没有提供像电话那样实时交流,现在P2P的即时讯息可能使得互联网上的实时交流变得和Web页面、E-mail那样普遍和不可或缺。

对于所有的P2P应用来说,最先要做的就是恢复互联网曾经失去的对等联网能力。这也正是Napster从概念上最大的缺陷。(email是具有P2P交流的特征的,但email缺乏实时交流的能力,它类似与传真,但我们还需要“电话”的。)

从“人”的角度上将,P2P发展的要点并不是P2P网络架构是如何,而是P2P将人们在网络上连接起来了,人们可以在网络这个更迅疾的媒介上处理那些需要沟通的问题。这是最重要的。尽管到今天还有人在怀疑互联网作为零售商业和B2B媒介的有效性,但是互联网已经从根本上改变了我们的交流方式是不需要任何讨论的。过分的谈了“纯粹的”的、完全消除控制的P2P是毫无意义的。中心化或者非中心化都只是工具,都是为了创造出使人们可以更有效地沟通的工具。

人类在现实生活中的经验至今仍只有极少的部分被应用到网络上,如新闻、B2C、B2B。现在,人们最常使用的P2P被移植到了网络空间。P2P可能改变一些我们已经熟知的、习惯了的产品和服务,也会创造更多。

究竟会出现些什么?预言未来的最好办法是去创造。

阅读全文

与一次解析p2p源码相关的资料

热点内容
广东加密货币 浏览:214
利用python批量查询系统 浏览:493
什么app看左右脸 浏览:302
台湾小公主s解压密码 浏览:568
易语言锁机软件源码 浏览:156
迅雷下载完成无法解压 浏览:592
硬盘分区命令图解 浏览:445
当前云服务器如何关闭 浏览:78
mac下python在哪 浏览:641
广东惠州DNS服务器地址 浏览:357
编译影片时软件渲染错误 浏览:625
流星蝴蝶剑解压失败 浏览:294
如何确认方舟编译器 浏览:664
奶粉源箱源码什么意思 浏览:178
台州程序员兼职一般去哪些网站 浏览:404
旧版本怎么下载到新的安卓 浏览:970
flash个人网站源码下载 浏览:724
javasocketbyte 浏览:268
素描基础教程pdf 浏览:542
香港商报pdf版 浏览:428