您的位置:首页 > 理论基础 > 计算机网络

NetWork——关于HTTP、HTTPS的知识总结(以及Android网络优化建议)

2016-11-07 13:41 411 查看
0 前言
作为一个Android开发人员,应用中难免会用到和服务器交互的情境,因此了解一些常用的网络协议是必须的,本文将总结诸如HTTP、HTTPS等协议的概念和区别,希望能给读者带来一些收获。本文原创,链接为SEU_Calvin的博客

1 HTTP
超文本传输协议(HyperText Transfer Protocol)处于计算机网络中的应用层(网络由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),HTTP是建立在TCP协议之上的,默认端口号为80。HTTP建立之初是为了客户端发起url请求后,将超文本标记语言(HTML)从Web服务器传送到客户端的浏览器中。(包括后面由于我们的页面变得复杂,HTML页面有了CSS,Javascript等,这些其实都是基于HTTP协议的)
为了控制本篇篇幅,关于TCP三次握手和四次挥手的知识请看这篇

1.1 细节补充
(1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。(2)而在HTTP 1.1中,默认保持长连接,数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
使用了长连接的好处包括可以使用HTTP 流水线技术,它是指在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起。使用这个技术的还必须是幂等的HTTP方法,因为客户端无法得知当前已经处理到什么地步,重试后可能发生不可预测的结果。POST方法不是幂等的:同样的报文,第一次POST跟第二次POST在服务端的表现可能会不一样。
(2)HTTP常用的状态码有五大类如下所示:
1xx://表示服务器已接收了客户端请求,客户端可继续发送请求
2xx://表示服务器已成功接收到请求并进行处理
3xx://表示服务器要求客户端重定向;要完成请求必须进行更进一步的操作
4xx://表示客户端的请求有语法错误或请求无法实现
5xx://表示服务器未能正常处理客户端的请求而出现意外错误


1.2 HTTP协议的主要特点(1)支持C/S模式。
(2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。
GET一般用于查询操作,GET把请求的参数信息放在URL后面(以问号隔开,URL最长2048字节),因为数据在URL中可见,且会保存在浏览器历史中,所以相对于POST不安全。且对数据类型有限制,只允许ASCII字符,服务器将URL指定的资源放在响应报文的数据部分并返回。

POST一般用于向服务器提交更新信息,POST会把请求的参数封装在HTTP请求数据中,以键值对的形式出现,可以传输大量数据,对数据类型没有限制,可以传输二进制。
(3)灵活:HTTP允许传输任意类型的数据对象(正在传输的类型由Content-Type加以标记)。(4)无连接:无连接的含义是限制每次连接只处理一个请求(服务器处理完客户的请求并收到客户的应答后即断开连接,可以节省传输时间)。(5)无状态:服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。就是说如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。但是服务器不需要先前信息时,应答就较快。2 HTTPSHTTPS是由SSL协议+HTTP协议构建的可进行加密传输、身份认证的网络协议。可以说HTTP +加密+认证+完整性保护= HTTPS。针对这三条,正好对应HTTP本身的不足。本文原创,链接为SEU_Calvin的博客。(1)通信使用明文(不加密),内容可能会被窃听,保密性不足。(2)不验证通信方的身份,不论是谁发送过来的请求都会返回响应。(3)无法证明报文的完整性,有可能遭遇中间人攻击将内容已篡改。 2.1 HTTPS对HTTP的对比优化(1)HTTP协议运行在TCP之上,所有传输的内容都是明文,而HTTPS与TCP中间有SSL/TLS保证数据加密的一层,因此保证了通信的保密性。当然SSL协议并不能对UDP应用进行保护。
(2)HTTP 协议无法确定通信方,但是 SSL可以。SSL使用了证书机制,证书由可信任的第三方机构颁发。身份验证过程使用RSA非对称密钥加密方式(破解难度基于两个大素数乘积的因式分解),身份确认完成后使用共商后的对称密钥。
博主本人是信息安全专业的,密钥交换这方面在考研复试的时候就了解过了,这里进行简述。
客户向服务器发送一个HTTP请求,服务器在响应客户时返回自己的公钥证书,客户产生一个主密钥(可以加随机数防止对服务器的重放攻击),并将其用服务器的公开密钥加密后传给服务器,服务器用自己的私钥解密恢复出主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。经过认证的服务器发送一个提问给客户,客户则返回用自己私钥加密过的提问以及自己的公钥,从而让服务器认证客户。(3)虽然有使用 HTTP 协议确定报文完整性的方法(MD5/SHA-1等散列算法),但事实上并不便捷可靠。而SSL通过数字签名增强信息的完整性。过程如下:发送方将使用自己的私钥加密消息摘要形成数字签名,接收方使用发送方公钥对摘要进行解密,再与文件散列值对比即可确保完整性。(4)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80后者是443。2.2 SSL的分层SSL协议可分为两层:
(1)SSL记录协议:建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
(2)SSL握手协议:建立在记录协议之上,用于数据传输开始前的双方身份认证、交换加密密钥等。

3. 移动端网络优化的几个点
(1)避免DNS解析,一次域名到IP的映射需要几百毫秒的时间,并且存在DNS劫持的风险,建议使用IP直连代替域名访问。

(2)连接复用,节省连接创建时间。HttpURLConnection、HttpClient都默认开启了keep-alive。
(3)根据网络情况获取不同质量的资源、以及优化重连机制。
比如在Wifi状态下获取高质量图片,非Wifi状态时获取较差质量的图片。
在Wifi状态下请求失败可以按照一定间隔继续请求,非Wifi状态请求失败后可以使用双倍的时间间隔再进行网络请求。
(4)做好适当的数据缓存工作。尤其是图片等静态资源。304状态码。
(5)增量更新,客户端进行bsdiff将补丁和旧apk合并成新apk。
(6)使用更精简的通信数据格式,如使用Json代替Xml、使用WebP代替JPEG和PNG。

最后,如果觉得有所收获,请点下面的赞多多支持~谢谢各位

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: