p2p原理简介
大家通过什么途径下载网络资源呢?
p2p( peer to peer)是一种去中心化的思想:应用在网络是加速手段,应用在币圈是区块链,应用在金融就是一种高风险投资。本文着眼讨论p2p网络技术。
相比于传统的C/S模式中,S提供服务,C接受服务所不同的是,在P2P网络中,所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息、处理器运算能力、存储空间等资源的共享。
C/S网络模型
p2p网络模型
p2p关键技术
关键名词解释
- 种子文件(Torrent文件)
种子文件由最初发布者创建,发布到互联网上,供感兴趣的用户下载。种子文件记录了负责管理该文件所在分发网络的Tracker服务器的地址、文件名、文件长度以及每个文件分块的SHA-1校验值。
- 跟踪服务器(Tracker服务器)
Tracker是一个中心服务器,负责跟踪系统中所有的参与节点,收集和统计节点状态,帮助参与节点互相发现,维护共享网络中文件的下载。一个Tracker服务器可以同时维护和管理多个文件共享网络。
- 种子节点(Seed节点)
Seed节点是指在一个P2P共享下载网络中,拥有完整文件拷贝的节点。这类节点只提供上传服务,而没有下载请求。
- 下载节点(Leecher节点)
共享网络中相对于Seed节点的是Leecher节点,它只拥有部分的文件拷贝,在提供这部分拷贝的同时,还会向其他节点请求自己缺少的那部分文件。
- 共享网络(Swarm网络)
一个Swarm共享网络是拥有和传输同一个文件资源的所有节点所构成的一个覆盖网络,包括共享该文件的Seed节点、Leecher节点和Tracker服务器。
- 分片机制
BitTorrent像其他文件共享软件一样对文件进行了分片(Piece),Piece是最小的文件共享单位,每个Leecher在下载完一个完整的分片后才会进行完整性校验, 完整性校验成功后通知其他节点自己拥有这部分数据。为了加快文件传输的并行性,每个分片还会分成更小的分块(Block), Block是最小的文件传输单位,数据请求者每次向数据提供者请求一个Block的数据。
- 片选择机制
为了保证共享网络的健壮性,延长一个共享网络的生命周期, BitTorrent通过局部最少块优先(Rarest-First)策略在节点间交换数据。下载节点根据自己周围的邻居节点拥有的数据块信息,选择拥有节点最少的分块优先下载,从而维护局部的数据块相对平衡。
- 节点选择机制
BT系统采用了基于"Tit-for-Tat"(以牙还牙、以眼还眼)的激励机制来抵御“Free-riding”(白嫖)行为,其中Choking/Unchoking算法最为关键。每个BT节点通过Internet/Uninterest消息来维护与多个节点的并发连接,但是只能为少数节点提供上传。服务提供节点在收到上传请求后会通过Choking/Unchoking机制决定是否对文件请求节点提供上传服务,可以拒绝服务(Choking)或者允许服务(Unchoking),该机制决定了两个相连的节点是否共享彼此的资源。为了防止部分节点只下载不上传的自私行为,Choking/Unchoking算法优先选择曾经为自己提供过上传数据并拥有高下载速率的节点,前者可以鼓励节点上传以获取下载,后者有助于最大化系统资源利用率。此外, Choking/Unchoking算法每隔30s将不考虑过去的贡献随机选择一个节点进行上传,一方面有利于发现可能存在更高下载速率的节点,另一方面可以避免新节点因从未进行过上传而无法获得有效的下载连接。
一次完整的p2p下载流程
这里以最简单的形式讲述下载过程,一台做种机(10.129.34.154),一台已经下载好(10.227.11.3),另一台开始下载(10.6.21.24)
- 10.6.21.24拿到种子后,向Tracker announce,上报自己有这个种子,然后Tracker返回拥有该种子的所有Peers(10.129.34.154和10.227.11.3),接着分别和两台节点建连,开始握手的过程。握手过程是相互的,即10.6.21.24和10.129.34.154建连后,接着两台节点同时相互发送Handshake握手。
- 在发送完Handshake后,如果本地有当前种子对应文件的部分或者全部,则接着给对方发送Bitfield消息。上诉说过,P2P将分发的文件分隔成Piece,Bitfield消息则是表明当前Peer有哪些Piece。对于当前例子,Bitfield消息包含当前分发文件所有Piece。此时10.6.21.24会记录两个Peer都拥有所有的Piece。
- 接着,10.6.21.24分别向10.129.34.154和10.227.11.3发送Interested消息,表示10.6.21.24对两个Peer拥有的Piece感兴趣。
- 10.129.34.154和10.227.11.3分别给10.6.21.24回复Unchoke消息,表示说愿意upload data给10.6.21.24;
- 10.6.21.24开始分别给10.129.34.154和10.227.11.3发送Request请求,该请求中包含了Piece信息,例如,一个Piece 1MB,一个 Chunk 16KB,则一个Piece包含64个Chunk,如果一个Request请求最大可包含64个Chunk,则10.6.21.24分别给10.129.34.154和10.227.11.3发送请求某个Piece的所有Chunk信息,例如Piece(Idx:0x3, Begin:0x0, Len:0x4000), Piece(Idx:0x3, Begin:0x4000, Len:0x4000)。。。等和Piece(Idx:0x4, Begin:0x0, Len:0x4000), Piece(Idx:0x4, Begin:0x4000, Len:0x4000)。。。等;
- 10.129.34.154和10.227.11.3收到Request消息后,根据Request里的Piece信息,从本地检索Piece中Chunk数据,分别发送给10.6.21.24。对于本case,即10.129.34.154和10.227.11.3向10.6.21.24发送0x3和0x4 Piece的所有64个Chunk。
- 当10.6.21.24收到一个Piece的所有Chunk后,则开始给所有Peer发送Have消息,表明自己拥有此Piece,此时其他Peer也可以过来下载。例如,如果此时10.6.21.23也在同时下载这个种子,则10.6.21.23也可以连到10.6.21.24下载这个Piece,这样就可以减轻做种机和其他下载机的压力。这也是P2P Peer之间可以相互下载的原理。
- 当所有Piece都下载好之后,则10.6.21.24即可为其他Peer提供所有Piece下载。
NAT概念以及穿透方式图例
虽然P2P通信模式非常理想,但是有一些问题需要解决:
- 客户端通信之前,必须知晓接受端的公网IP和端口port
- 客户端的p2p通信数据包必须能够穿透NAT(network address translate)网络地址翻译
为什么需要NAT
事实上,国内目前的 BT 生态很恶劣,首先现状是我们的互联网还是大量使用的 IPv4 ,这就导致了 IP 地址很稀缺,根据维基百科 各国IPv4地址分配列表 可以看出,美国 3 亿多的人口,拿走了 15 亿的 IPV4 地址,而中国 13 亿的人口,却只有 3 亿多的 IPV4 地址,这就势必造成了国内运营商分配到每户的 IP 地址是经过层层 NAT 的,有公网 IP 的网民并不多。
p2p过程中的NAT穿透
发包流程:
NAT类型
根据建联条件的不同,NAT分为不同的类型:
- 完全圆锥形NAT (Full Cone)
- 地址受限锥型NAT (Restricted Cone)
- 端口受限锥型NAT (Port Restricted Cone)
- 对称型NAT (Symmetric)
p2p的机遇与挑战
机遇
p2p的优势其实就是去中心化的优势
- 节点的可拓展性:下载速度快
- 容错性高:不用担心服务节点宕机而无法下载
- 对于公司来说:廉价(免费)的资源
挑战
-
安全性无法保障
-
版权问题无法保障
-
P2P大环境较差
- 运营商限制:上下行网速不对等
- 视频app的崛起
- 吸血软件(某雷)对于圈子的破坏
- 网盘的崛起(下载速度稳定、资源分享方便、没有死种等优势)
- 用户习惯(只下载不上传)
目前内部播放侧关于p2p的探索
-
播放质量的劣化
-
p2p/pcdn的调度分配
-
数据基建混乱带来的“迷雾重重”
-
打洞成功率低?
-
做种与查种匹配度低?
-
“and that
governmentInternet of the people, by the people, for the people, shall not perish from the earth”
“人人为我,我为人人”,p2p是一种思想,也是一种精神。
网站可以被隔离、被拔线、被禁止访问,但种子不会:种子不死,资源永存。