简介
去中心化静态资源加速网络。
SW P2P Engine 采用最先进的HTML5技术——WebRTC来做点对点传输,ServiceWorker来代理网络请求,还有IndexedDB来缓存数据,打造了一个去中心化的静态资源加速网络。在不影响用户体验的前提下,利用终端设备的闲置带宽和少量的磁盘空间,创造一个可无限扩展的P2P网络,大幅节省网站的CDN成本。
# 特性
- 浏览器原生支持,不需要安装任何插件,采用仿BT算法,在线人数越多效果越好
- 支持大部分静态文件类型,包括js、css、图片和音频等
- 智能缓存和预加载资源
- 数据加密传输
- 浏览器不支持WebRTC时无缝切换到HTTP下载模式
- 可与所有CDN搭配使用,无需改造服务端
- Tracker服务器根据访问IP的ISP、地域等进行智能调度
# 浏览器支持情况
由于WebRTC已成为HTML5标准,目前大部分主流浏览器都已经支持。兼容性取决于浏览器是否支持 WebRTC, ServiceWorker 和 IndexedDB。
兼容性 | Chrome | Firefox | Mac Safari | 安卓微信/QQ | Opera | Edge | iOS Safari | IE |
---|---|---|---|---|---|---|---|---|
WebRTC | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
Service Worker | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
IndexedDB | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
SwarmCloud | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
# 工作原理
- 首先由客户端嵌入的js库 sw-p2p-engine 注册 ServiceWorker
- ServiceWorker 通过监听 fetch 事件,拦截全站的网络请求,并将可缓存的静态资源(如 https://yourwebsite.com/kitty.png)保存在 IndexedDB 中
self.addEventListener('fetch', event => { /* ⛦ magic here ⛦ */ })
- 判断一个网络请求是否可缓存的依据是:
- 响应头包含缓存相关的字段,如 Cache-Control 或者 Expires
- 目标资源是允许缓存的静态资源(如 jpg, png, js, css, mp3等)
- 一旦网络响应被视为可缓存的,在后台工作线程中,PeerWorker会分别对这些资源进行缓存、索引、切片、加密以及通过P2P网络进行分发
- 当资源被一个设备缓存之后,其他设备在请求相同资源时,将尝试优先通过P2P网络就近从该设备获取资源,而不是从成本更高、距离更远的源服务器获取(即用WebRTC替代HTTP)
- 从P2P网络获取失败或者不能缓存的资源,将自动回源
# 最佳实践
- 准备工作
- 为网站申请HTTPS证书
- 在CDNBye控制台注册账号并在 网站管理 界面添加域名
- 将 SDK 放在网站入口页面,比如网站的首页
- 将用户的 http 访问请求自动跳转到 https ,从而保证 P2P 可以正常工作
- 用户在内嵌 SDK 的页面点击跳转到其他页面时,在新的tab打开页面,保持原页面不被覆盖
- 尽量将图片等资源放在当前域名下,减少跨域配置等额外工作量
- 如果不得不使用第三方域名的资源(比如阿里云的CDN加速),请记得在CDN配置跨域头,并且在 SDK 侧将第三方域名加入白名单,详细步骤请参考这里
- 中长视频和大文件等体积较大的资源不适合使用本 SDK 加速