目前,p2p网络技术已经比较成熟。由于具有节省带宽和加快速度两大优势,近些年已经被各大视频播放器和下载软件所采用。在这里,简单分享一下p2p下载技术和测试的方法。
一、什么是p2p
p2p即peer to peer,指的是对等网络。
传统的文件下载服务都是基于客户端/服务器模型,文件存储在服务器上,用户通过客户端向服务器请求文件下载。在下载过程中,仅仅是服务器单向地对客户端传输。如图:
图 1 传统客户端/服务端模型
这种网络的瓶颈在于服务器。当有大量用户同时从服务器下载的时候,无论是对服务器的压力还是带宽来讲,都是很大的考验。对于百度网盘,某些热门资源的突然出现会使得流量暴涨,尤其是在高峰时段。给云存储及后端服务器造成较大压力,并极大的增加了带宽成本,因此引入p2p传输方式,在节省带宽的同时,也能提高用户的下载速度,增强用户体验。
p2p的核心就是实现peer间互联,让端与端之间互相传输数据,如图:
图 2 p2p网络模型
这种网络的优点是,能够让每一个下载的客户端进行资源的共享。在下载的同时,也能够向其他的客户端做上传操作。将服务器的压力分散到各个客户端。
二、p2p下载过程
在网盘客户端上,p2p服务是以动态链接库或静态链接库的形式嵌入到各端内,p2p任务下载过程如下:
1、资源上报
p2p客户端会将已下载的热门资源上报到服务端,以便其他端下载同一资源的时候可以做种上传。上报资源的时机有两个,一是客户端调起p2psdk的时候,sdk会检查本地数据库,查看是否有已经下好的资源,如果有则上报;二是在下载过程中,资源分片下载完成的时候实时上报。
2、peer筛选
用户添加一个下载任务,客户端会向p2p服务端发送请求,查询该文件是否为热门资源。如果该任务为p2p任务,为了保证传输的高效性,服务端会返回优选过的peer列表信息,客户端就可以去连相应的peer传输数据。优选的规则如下:
图 3 peer优选规则
3、peer间数据交互
客户端拿到资源相应的peer信息后,就会尝试去连接这些peer。根据对端和自身的NAT类型,选择不同的打洞策略。下图是打洞及传输的流程:
图 4 打洞传输流程图
Peer间连接的建立首先通过服务器进行穿透,收到对方的网络信息请求则表示穿透成功。同时Peer马上向对端的Peer发送数据请求,回复请求后则开始收发数据。
三、p2p下载测试
如上所述,当我们在下载一个资源的时候,能拿到的peer越多,peer的质量越好,下载速度就会越高。所以,p2p网络必须在大量的节点下部署才能够看出策略所带来的效果。然而在日常测试中,p2p主要是以sdk的形式集成到各端进行功能的验证。由于测试机数量有限,网络环境单一,给测试带来很大的困难。
实际上,在测试p2p的时候,客户端与服务器的交互都可以通过实时的日志来跟踪定位。但我们不能只关注过程而忽略了结果,到底本次的速度优化有没有效果,崩溃率有没有降低,各种网络环境下的数据交互是否正常,这些都应该是可度量,可评估的。下面针对这三方面来介绍一下QA所做的相应的工作:
1、下载速度详细信息的查看
p2p最大的作用,一个是节省带宽,一个是提高速度。使用端来测试p2psdk的时候,端上展示的是下载的总速度。但是对于p2p来讲,由于是混合下载,数据源有多种,需要展示速度的详细分布信息。因此,开发了一个涵盖多个端的web测试监控平台。
首先配置上报级别、后端服务器地址,然后再启动网盘下载任务,就可将实时的速度和peer信息上报。服务器对这些数据处理存库,再在万花瞳平台页面上展示出来,就可以得到比较直观的量化指标。
如下表所示,可以清楚的看到速度的平均值、最大值和来源分布:
图 5 速度结果表格
通过速度变化曲线可以使得下载过程一目了然,图中还可以通过不同peer的速度信息看到当前peer的网络情况:
图 6 速度变化曲线
2、崩溃收集与崩溃率的统计
由于p2p策略的复杂性,除了少数的必现的崩溃能够在线下发现,更多的还要靠小流量期间用户的真实网络环境触发。
p2p的崩溃收集环境实现了崩溃文件的收集、解析和分类统计等功能,可以对线上的崩溃率进行有效的评估。
统计的时候,利用p2p各版本对应的符号表解析出堆栈信息,对每个版本小时级别的崩溃数求和。由于p2p是在用户下载和视频播放的过程中用到的,流量越多,表明sdk的使用越频繁,发生崩溃的可能性越大,所以,计算出的版本崩溃数要分别与init数和p2p流量做百分比。
图 7 崩溃率变化曲线(1)
图 8 崩溃率变化曲线(2)
如图所示,可以将小流量版本与线上版本做对比分析。如果小流量的时候发现占比过高,可以直接停止放量,利用堆栈的详细信息定位问题。
3、sdk自动化测试探索
p2psdk的测试,目前主要集中在三端,即PC、Android和iOS。当前的测试方法,一种是将sdk打包到端上,然后通过安装包安装;一种是在现有的端进行sdk的替换。但是两种方法归根结底都是通过端上的点击去进行case的构造。当然,这种方式有其优点,就是能够真正贴近用户操作。但是与此同时,也暴露出了很多的缺点,比如没有接口级别的测试,case覆盖不全;自动化测试难推进;测试的机型及网络环境较单一等等。
因此,开发一个仿真环境,用于模拟网络异常,测试p2psdk接口的稳定性,构造自动化case并收集相关数据统计。架构如下图:
图 9 仿真模拟架构图
线下仿真环境的优势是能够脱离端上交互来直接访问接口,便于构造自动化测试来节省人力。难点在于模拟网络干扰,p2p下载过程中,客户端与服务器之间,客户端与客户端之间都有请求和数据交互,需要模拟出真实环境下会发生的各种网络情况,比如延时、丢包等。解决方案是通过Chaosproxy层构造可叠加的链式异常动态,无需修改模块配置,实现可注入式异常配置。下载任务结束时上报相应统计,服务端可根据统计信息分析出线下分享率连通率等概况。
作者介绍
钟万新
百度个人云部测试开发工程师,目前负责百度网盘边缘计算方向的测试工作。