0 前言
作为一个Android开发人员,应用中难免会用到和服务器交互的情境,因此了解一些常用的网络协议是必须的,本文将总结诸如HTTP、HTTPS等协议的概念和区别,希望能给读者带来一些收获。本文原创,链接为SEU_Calvin的博客。
1 HTTP
网络由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。我们的超文本传输协议(HyperText Transfer Protocol)处于计算机网络中的应用层,默认端口号为80。HTTP建立之初主要目的是为了将超文本标记语言(HTML)文档通过客户端url请求从Web服务器传送到客户端的浏览器。包括后面由于我们的页面变得复杂,HTML页面有了CSS,Javascript等,这些其实都是基于HTTP协议的。
HTTP是建立在TCP协议之上的(TCP协议对应于传输层、IP协议对应于网络层),所以HTTP协议的优化都是基于TCP协议本身的特性,例如TCP协议的三次握手和四次挥手、每次建立连接带来的RTT延迟时间等。
为了控制本篇篇幅,关于TCP三次握手和四次挥手的知识请看这篇。
1.1 持续性与非持续性
(1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。(2)而在HTTP 1.1中,默认保持长连接,数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
使用了长连接的好处包括可以使用HTTP 流水线技术,它是指在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起。使用这个技术的还必须是幂等的HTTP方法,因为客户端无法得知当前已经处理到什么地步,重试后可能发生不可预测的结果。POST方法不是幂等的:同样的报文,第一次POST跟第二次POST在服务端的表现可能会不一样。
1.2 HTTP协议的主要特点总结
(1)支持客户/服务器模式。
(2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。
(3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后即断开连接,可以节省传输时间。
(5)无状态:指协议对于事务处理没有记忆能力,服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2 HTTPS
HTTPS是由SSL协议+HTTP协议构建的可进行加密传输、身份认证的网络协议。HTTPS的出现主要是为了拟补HTTP在安全上的一些不足,可以说HTTP +加密+认证+完整性保护= HTTPS。本文原创,链接为SEU_Calvin的博客。
(1)通信使用明文(不加密),内容可能会被窃听,保密性不足。
(2)不验证通信方的身份,不论是谁发送过来的请求都会返回响应,因此有可能遭遇伪装攻击,也不能做到抗抵赖。
(3)无法证明报文的完整性,有可能遭遇中间人攻击将内容已篡改。
2.1 HTTPS对HTTP的对比优化
(1)HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的,保证了通信的保密性。当然SSL协议并不能对UDP应用进行保护
(2)虽然使用 HTTP 协议无法确定通信方,使用 SSL可以。SSL使用了一种被称为证书的手段,证书由值得信任的第三方机构颁发,使用HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。证书用以证明服务器和客户端是实际存在的。身份确认过程使用RSA非对称密钥加密方式(破解难度基于两个大素数乘积的因式分解难度),但是为了提高效率,身份确认完成后使用共商后的对称密钥。
(3)虽然有使用 HTTP 协议确定报文完整性的方法,但事实上并不便捷、可靠。其中常用的是 MD5 和 SHA-1 等散列值校验的方法,以及用来确认文件的数字签名方法。SSL通过消息校验算法增强信息的完整性。
(4)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80后者是443。
3 SSL
SSL协议位于TCP/IP协议与各种应用层协议(不止能用于HTTP)之间,为数据通讯提供安全支持。
SSL协议可分为两层:
(1)SSL记录协议:建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
(2)SSL握手协议:建立在记录协议之上,用于数据传输开始前的双方身份认证、协商加密算法、交换加密密钥等。
3.1 SSL身份认证以及密钥交换流程
SSL的作用我们在2.1中已经介绍过了,那么我们着重介绍SSL协议的工作流程。博主本人是信息安全专业的,密钥交换这方面在考研复试的时候就了解过了,这里进行简述。
客户向服务器发送一个HTTP请求,服务器在响应客户时返回自己的公钥证书,客户产生一个主密钥(可以加随机数防止对服务器的重放攻击),并将其用服务器的公开密钥加密后传给服务器,服务器用自己的私钥解密恢复出主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。经过认证的服务器发送一个提问给客户,客户则返回用自己私钥加密过的提问以及自己的公钥,从而让服务器认证客户。
4. 移动端获取网络数据优化的几个点
(1)连接复用,节省连接建立时间,如开启 keep-alive。Android中的HttpURLConnection和HttpClient都开启了keep-alive。
(2)请求合并,如果在某个页面内请求过多,也可以考虑做一定的请求合并。
(3)减少请求数据的大小,对于post请求,body可以做gzip压缩,header也可以作数据压缩(不过只支持http 2.0)。返回数据中的body也可以作gzip压缩,body数据体积可以缩小到原来的30%左右。(也可以考虑压缩返回的json数据的key数据的体积,尤其是在返回数据格式变化不大的情况)
(4)根据用户的当前的网络质量来判断下载什么质量的图片。
最后,如果觉得有所收获,请点下面的赞多多支持~谢谢各位