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

来源:互联网 发布:网吧系统还原软件 编辑:程序博客网 时间:2024/05/07 16:24

0  前言

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

 

1   HTTP

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

为了控制本篇篇幅,关于TCP三次握手和四次挥手的知识请看这篇。

 

1.1  细节补充

1HTTP 1.0,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。(2而在HTTP 1.1,默认保持长连接,数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

使用了长连接的好处包括可以使用HTTP 流水线技术,它是指在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起。使用这个技术的还必须是幂等的HTTP方法,因为客户端无法得知当前已经处理到什么地步,重试后可能发生不可预测的结果。POST方法不是幂等的:同样的报文,第一次POST跟第二次POST在服务端的表现可能会不一样。

2HTTP常用的状态码有五大类如下所示:

1xx://表示服务器已接收了客户端请求,客户端可继续发送请求2xx://表示服务器已成功接收到请求并进行处理3xx://表示服务器要求客户端重定向;要完成请求必须进行更进一步的操作4xx://表示客户端的请求有语法错误或请求无法实现5xx://表示服务器未能正常处理客户端的请求而出现意外错误


1.2  HTTP协议的主要特点

1)支持C/S模式。

2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GETPOST

GET一般用于查询操作,GET把请求的参数信息放在URL后面(以问号隔开),服务器将URL指定的资源放在响应报文的数据部分并返回。

POST一般用于向服务器提交更新信息,POST会把请求的参数封装在HTTP请求数据中,以键值对的形式出现,可以传输大量数据。

(3)灵活:HTTP允许传输任意类型的数据对象(正在传输的类型由Content-Type加以标记)。

(4)无连接:无连接的含义是限制每次连接只处理一个请求(服务器处理完客户的请求并收到客户的应答后即断开连接,可以节省传输时间)。

(5)无状态:服务器不保存浏览器的任何信息。每次提交的请求之间没有关联。就是说如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。但是服务器不需要先前信息时,应答就较快


2   HTTPS

HTTPS是由SSL协议+HTTP协议构建的可进行加密传输、身份认证的网络协议。可以说HTTP +加密+认证+完整性保护= HTTPS。针对这三条,正好对应HTTP本身的不足。本文原创,链接为SEU_Calvin的博客

(1)通信使用明文(不加密),内容可能会被窃听,保密性不足。

(2)不验证通信方的身份,不论是谁发送过来的请求都会返回响应。

(3)无法证明报文的完整性,有可能遭遇中间人攻击将内容已篡改。

 

2.1  HTTPSHTTP的对比优化

(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。


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

4 0