最近有个测试Android 网络库SDK的任务,并不能立刻想到要覆盖的基本网络测试用例,补充学习。
1. 从计算机系统层面:C/S模型 --> 网络:另一种I/O设备 --> 主机间如何交互 --> 一种实现:socket --> web服务器
2. 从网络层面:协议分层 --> TCP/IP + HTTP/HTTPS
3. 从Android开发层面:如何发起请求 --> 常用请求框架 --> okhttp
初步看完以上3条线索,还存在以下几个疑惑:
1. socket属于网络协议哪一层?
2. 网络SDK属于网络协议哪一层?
3. 此类网络SDK做的主要是什么?测试需要基本覆盖哪些方面?
1. 计算机系统层面
网络请求都是客户端-服务器编程模型(Client - Server);基于进程,而不是机器;基本操作步骤见下图;
具体聚焦到某台主机(无论是当作客户端或服务器)的组成原理,网络对于主机来说,可以看作是另一种I/O设备。
其中,网络适配器用于协调网络与主机间的数据,实现串行数字信号与比特流的转换,对应于以下TCP/IP协议中的最底层链接层;网络则是一个层次结构,由集线器(物理层)/网桥(物理链路层)/路由器(网络层)将多个局域网和广域网链接起来的结构(如下图)。
不同局域网或广域网可能采用完全不同且不兼容的技术,它们之间的交互就需要一个达成共识的协议(TCP/IP),规定数据传送机制(层次结构,逐层封装)以及各主机地址的命名机制(IP地址 -- > 域名,套接字 地址:端口)。
socket接口就是实现了协议TCP/IP的一组函数,不属于协议的某个层,而是协议整体的一种现实实现,可借助socket函数去实现网络应用。
Web客户端通过网络使用socket向服务器端发起请求,服务器端需要实时监听并处理这些请求。一个服务器基本需要提供哪些能力?
发起的请求(URL)可以大致分为两类,请求服务器中的静态内容(类型由MIME字段决定,如HTML)/运行服务器中的可执行文件,获取运行结果。此处请求格式具体涉及到应用层协议HTTP等。简单来说,服务器需要实现以下能力:
a. 监听链接端口,解析URL,确定请求的是静态还是动态文件;
b. 实现HTTP协议,确定请求与响应的格式;
c. fork子进程,传入参数,子进程执行结果输出到已连接描述符;
2. 从网络层面
正如上文所说,为了保证不同主机间能相互理解传输数据,定义了TCP/IP协议(OSI协议的简化),基本结构如下。实际传输过程是由上而下逐层封装,数据包都由header和body组成,格式由协议簇规范。
同一个子网中的主机使用MAC地址进行广播传输,由接收方主机判断自己是否是接收方;网络层则采用IP地址进行分发,传递到所属子网后由网关查询MAC地址进行补充;同一个主机中又有多个程序使用网络,增加传输层采用端口来区分;应用层则是规范读取数据的方法,具体逐层分析可参照 互联网协议入门(一) 互联网协议入门(二)
3. 从Android开发层面
Android一般是发起请求的客户端,在android developer中搜索,可发现两章内容 connect to network 和 Transmitting Network Data Using Volley,前者使用java.net包中的 HttpsURLConnection,Android基于Java实现,所以这个类可以看作是最基本的网络类;后者则介绍了第三方库Volley,注意是从Android2.2 开始的,历史稍有久远。同时Google Android网络,还能搜到 HttpClient (httpUrlConnection基础上,官方已不建议使用,sdk 23起)、okhttp(第三方网络框架,主流,从Android4.4开始HttpURLConnection的底层实现采用的是okHttp)以及其他各种第三方请求框架(也可参见Android网络开源项目,内含原理图)。
okhttp基本设计(基本原理待深入理解)
其实了解到这里还是有疑问的,Android要实现网络连接,直接使用这些框架就可以了啊,为什么公司要重新实现网络库?
1. 从面向接口编程的角度来说,与网络框架隔离开,更容易维护,即使日后这些框架变化;
2. 从应用所需网络功能来说,不同应用需要的网络层规范也不一样,自定义并实现一系列需要具备的网络接口更现实。
由此也得出了此类测试的需求,除了网络请求的基本情况,也要关注自定义实现的功能。
了解到此,以上几个疑惑也能回答了:
1. socket属于网络协议哪一层? 理论与技术的对应关系,不局限于哪一层,而是整体框架的实现方法;
2. 网络SDK属于网络协议哪一层?网络SDK可以理解为自实现一套Android的网络请求框架(封装基本方法);
3. 此类网络SDK做的主要是什么?测试需要基本覆盖哪些方面?自定义网络功能,面向接口编程;