1、网络框架对比和源码分析
关于网络框架,一类是基础的网络框架,如HttpUrlConnection
, HttpClient
, OkHttp
;另一类是对其进行封装并组合其他技术一起使用,如Volley
、Xutils
、Retrofit
、OkGo
、MvpArms
等。
在网络框架中,很多人总是喜欢乱做对比,比如拿Retrofit和OkHttp做对比,其实他们不在一个层级,不能说好用不好用来做对比
底层库中,HttpUrlConnection
, HttpClient
是比较老的,现在基本都推荐用OkHttp
做网络请求的底层库,在4.4以上新的Android 系统版本中也是默认使用的OkHttp
。
对于上层框架的使用,我觉得是仁者见仁,智者见智,都有自己的特点,目前这几个上层框架底层也基本上是OkHttp
了,其中,Volley
是google官方2014年推出的,适用于高并发、数据量少的场景;Xutils
是一个国人写的综合库,包括网络加载、图片、数据库等内容;Retrofit
是最主流的square开发的高效网络库,Restful API;OkGo
是一个相比Retrofit
好上手一点的库,它的很多配置都已经搞好了,和Retrofit
一样支持https本地认证、双向认证; MvpArms
不仅仅是一个网络加载库了,是一种流行的架构模式:MVP
+OkHttp
+Retrofit
+Dagger2
+Rxjava
+RxLifeCycle
的MVP开发框架
2、自己去设计网络请求框架,怎么做?
学习成熟网络框架OKHTTP的设计思维,如果要实现restful风格的话,参考retrofit的封装格式;
一般而言,我们需要考虑的方面有:
1、构建我们的请求Request:包含url
,请求方法
,请求参数
,请求头
,编码
,请求体
,编码格式
,超时时间
,代理端口
,代理主机
等。
2、由Dispatcher
分发器并行分发我们的Request请求,这里的分发器实际是一个线程池。
3、准备开始连接服务器,连接http
获取https
服务器地址,https需要考虑自签名证书、双向SSL验证等安全问题。
4、Response得到服务器的回调,考虑输入流关闭的问题,大文件传输的问题,线程切换问题,缓存问题。
3、okhttp源码
4、网络请求缓存处理,okhttp如何处理网络缓存的
5、从网络加载一个10M的图片,说下注意事项
6、TCP的3次握手和四次挥手
7、TCP与UDP的区别
8、TCP与UDP的应用
9、HTTP协议
见12问
10、HTTP1.0与2.0的区别
见12问
11、HTTP报文结构
见12问
12、HTTP与HTTPS的区别以及如何实现安全性
两者的区别:
1、HTTP是明文传输
,传输内容容易被篡改或者窃取;HTTPS是密文传输
,https 相当于包装了SSL\TLS协议的HTTP。
2、https在网络请求效率上会低于http,因为采用了不同的请求协议以及更复杂的安全验证操作。
3、https需要申请CA证书,用于验证公钥这个证书收费,http不用。
如何实现安全?
主要是通过非对称加密
+对称加密
+CA证书
来保证请求安全的。
因为http协议是基于TCP/IP协议进行传输的,内容填写了相应的目标地址,端口,内容等信息,这些信息在途径中间路由时是可以被第三方窥视的,这种问题通常是通过“加密”来解决的。
接下来让我们分析一下http以及https的握手流程,这样能够更清楚的理解https为何是安全的
第一次握手:客户端发送
syn
包(syn=j)到服务器,并进入SYN_SEND
状态,等待服务器确认;第二次握手:服务器收到
syn
包,必须确认客户的SYN(ack=j+1)
,同时自己也发送一个SYN
包(syn=k)
,即SYN+ACK
包,此时服务器进入SYN_RECV
状态;第三次握手:客户端收到服务器的
SYN+ACK
包,向服务器发送确认包ACK(ack=k+1)
,此包发送完毕,客户端和服务器进入ESTABLISHED
状态,完成三次握手。中间人可以抓取我们三次握手的数据包来进行分析,因此这种方式存在很大的安全隐患。
HTTPS
在HTTP
的基础上加入了SSL
协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。如下图:1. 客户端发起HTTPS请求
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以是自己制作或者
CA证书
。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用CA证书
则不会弹出提示页面。这套证书其实就是一对公钥和私钥。公钥给别人加密使用,私钥给自己解密使用。3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的
颁发机构
,过期时间
等。4. 客户端解析证书
这部分工作是有客户端的
TLS
来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值,然后用证书对该随机值进行加密。5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个
随机值
来进行加密解密了。6. 服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行
对称解密
。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。7. 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8. 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。
13、如何验证证书的合法性?
上题中的第四部就是验证证书的合法性的,我们为何要验证证书的合法性呢,因为我们访问的服务器有可能是中间人代理服务器,并不是真正的服务器。我们客户端持有真正的公钥,如果不是服务器真实证书的签名则会解密失败,如果是真签名则会生成一个随机对称加密密钥,然后对密钥加密后传到服务端。后面的信息内容都是由这个中间人并不知道的随机对称加密密钥加密后进行传输的
14、https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?
首先我们必须知道为啥需要有对称加密和非对称加密,因为两者各有优缺点,对称加密传输速度快,但对称加密算法本生容易泄露,必须保证只有服务器和客户端知道这个算法;这也是非对称算法出现的原因,就是为了加密对称算法用的,非对称算法安全,但效率低,时间代价是对称的100倍级别 ,其中,对称加密算法有:AES、DES 非对称加密:RSA、DSA 散列算法 :MD5、SHA1 等。算法选择(从性能和安全性综合)
对称加密: AES(128位),
非对称加密: ECC(160位)或RSA(1024),
消息摘要: MD5
数字签名:DSA
15、client如何确定自己发送的消息被server收到?
当client收到服务器返回的二次握手信息,包含client发送的SYN+服务器确认的SYN
16、谈谈你对WebSocket的理解
WebSocket
是应用层html5
出的一种协议,相比较http
而言优势是支持长连接,Websocket
只需要一次HTTP
握手,整个通讯过程是建立在一次连接/状态中,也就避免了HTTP
的非状态性,服务端会一直知道你的信息,直到你关闭请求;同时WebSocket
协议解决了服务器与客户端全双工通信的问题。
注:什么是单工、半双工、全工通信?
信息只能单向传送为单工;
信息能双向传送但不能同时双向传送称为半双工;
信息能够同时双向传送则称为全双工。
17、WebSocket与socket的区别
如上图所示
socket
处于抽象层,是http的底层协议;而WebSocket
是类似于http的应用层协议,WebSocket
是应用层html5
出的一种协议。HTTP 协议有一个缺陷:通信只能由客户端发起,做不到服务器主动向客户端推送信息。
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
18、谈谈你对安卓签名的理解。
Android 签名是为了保证应用发布者是本人,大致有几种,以前Eclipse 用KeyStore进行签名;现在android studio开发app采用JKS进行签名;android系统签名采用的pem/pk8。
每个android app都会有自己的签名,如果我们没有指定签名,编译时会默认用SDK目录下的debug签名文件。
常见的签名jks在android studio中有两种方式给app签名,一种是build时generate signed apk ;一种是在build文件中配置签名,如下:
signingConfigs {
debug {
}
release {
keyAlias 'xxx'
keyPassword 'xxx'
storeFile file('../xxx.jks')
storePassword 'xxx'
}
}
release {
buildConfigField "boolean", "IS_DEBUG", "false"
minifyEnabled true // 是否混淆
shrinkResources true //是否清理无用资源
zipAlignEnabled true //是否启用zipAlign压缩
signingConfig signingConfigs.release
}
19、请解释安卓为啥要加签名机制?
1、应用程序升级,验证app的唯一性,包名和签名都一致才允许升级。
2、应用程序模块化,可以模块化部署多个应用到一个进程,只要他们的签名一样。
3、代码或者数据共享,同一个签名有相同的权限,可以共享数据和代码。
20、视频加密传输
要处理这个问题首先我们要知道为何视频需要进行加密?因为 盗链 和 盗播 的存在,让版权价值大打折扣。用户通过一次付费行为,就可以拿到付费视频的播放URL,将播放URL进行二次分发,这种行为叫做盗链;用户直接将视频下载到本地,然后再进行二次上传分发,这种行为叫做盗播
常用的视频加密技术有:
1、分片加密
基于苹果公司的HLS协议,服务器需要切片出TS文件并进行AES
加密,生成m3u8
索引文件,然后客户端下载到本地给播放器播放。
2、文件的前中后加密
这三段加密都涉及到文件的读取,尤其对于大文件的读取,我们使用java的RandomAccessFile(随机访问文件)
这个类来进行文件的加密和解密.
21、App 是如何沙箱化,为什么要这么做?
沙箱是为app提供隔离环境的一种安全机制,严格控制执行的程序所访问的资源,以确保系统的安全,让app在独立的进程中执行任务,让其不能访问外部进程的资源,这样一个应用出问题了,其他的应用进程能够保证不被影响。
22、权限管理系统(底层的权限是如何进行 grant 的)?
应用程序在应用层的AndroidManifest.xml中所申请的权限将会在Android系统启动时,经过解析后,逐步映射到内核层的组ID
和用户ID
,最终由内核层的setgid()
和setuid()
函数设置后才能执行;在进行权限申请时,6.0以上需要动态代码申请,6.0以下直接在AndroidManifest.xml注册即可。