P2P CDN
public | ||
.gitignore | ||
index.html | ||
LICENSE | ||
main.js | ||
package.json | ||
README.md | ||
server.js | ||
sw.js |
PCDN
P2P CDN
/data/path/filename.xx
缓存指定资源后, 假设资源按 16kb 分片 a1 要求返回第 1 片, a2 要求返回第 2 片, 如果 a2 提前完成, 继续返回第 3 片 全部分片接收完毕后合并进行 size 和 hash 验证
资源表汇报给
持有资源变动时, 通知节点列表 获取一个资源时, 先查找拥有此资源的节点列表
增量列表
节点列表伺服器记录每个节点持有的资源, 假设有 ABCDE 节点在线, 当 E 节点请求资源 a, 向伺服器查询没有任何节点持有此资源, 则从 CDN 下载此资源, 并通知伺服器将持有此资源 48 h 如果此节点持有资源过多, 将主动过期部分资源
O1双向查询 获取和修改某个节点持有的所有资源 获取和修改持有某个资源的所有节点 节点的上线和下线状态变动
应用于大量用户在线的网站或游戏以及图床, 当然也可以存储网站本身的 JS 文件
安全
资源污染: 某些节点发放虚假资源(使用hash校验) 空壳节点: 某些节点上报资源却拒绝分享资源(节点可用性上报) 虚假上报: 可用节点报告为不可用, 不可用节点报告为可用(伺服器要求指定节点上报指定节点可用性)
节点
某终端连接 8 个节点, 查询某资源信息 8x8=64 节点 64x8=512 节点
建立连接后交换资源列表及过期时间
最短响应时间
- 请求某个资源时, 先向节点列表伺服器请求拥有此资源的节点列表, 再通过节点列表取一个建立连接信道, 随后获取此资源
- 由于节点是持久在线, 资源伺服器对节点空间位置进行节点网络分布预测, 返回给距离请求节点最近的几个节点列表(减少地域距离耗时)
- 同时向多个节点建立连接, 获取某个资源时从不同节点请求不同分片, 这需要预先了解资源大小分片数量(通过并发减少串行下载时间, 且能从更快的节点下载更多的分片, 慢的节点减少分片下载)
- 建立连接需要多次三方通信握手, 且保持连接也需要续握手, 如何减少握手时间?
- 每个资源都从服务器请求节点列表效率极差, 如何复用,
- 建立连接耗时较大, 如何复用连接?
在线与资源分布计算, 假设 10-100 同时在线, 每节点储量为1000资源(1GB) 100 设备储存 100G资源, 去除重复 75% 则 25G 资源被减耗 高峰访问不均, 利用率上升 50% 则实 %50 流量被减耗 由于峰值浮动, 在低谷期减耗效率仅为 10% 在线人数越多则减耗比率越大