HTTP/1.0、 HTTP/1.1、HTTP/2.0之间的区别
HTTP/1.0:
连接处理: HTTP/1.0 使用简单的短连接来处理每个请求,每次请求都需要建立一个新的 TCP 连接到服务器,请求完成后立即关闭连接。
性能: HTTP/1.0 性能较差,主要因为每个请求都需要重新建立连接,这增加了延迟。
头部压缩: HTTP/1.0 不支持头部数据的压缩,这导致了较大的网络开销。
HTTP/1.1:
保持连接: HTTP/1.1 引入了持久连接(Keep-Alive),使得在单个连接上可以传输多个文件,减少了建立连接的次数,提高了性能。
请求管道化: HTTP/1.1 支持请求管道化,允许多个请求在一个连接上同时发送,避免了先前版本中存在的一个请求需要等待前一个请求响应完成的问题。
头部压缩: 支持头部压缩,减小了请求和响应的大小。
HTTP/2.0:
多路复用: HTTP/2.0 支持多路复用,允许在单个连接上并行交换多个请求和响应,提高了并发性能。
头部压缩: HTTP/2.0 进一步改进了头部压缩,减少了重复数据的传输,降低了网络开销。
服务器推送: HTTP/2.0 支持服务器推送,服务器可以在客户端请求之前主动向客户端推送资源,加快了页面加载速度。
总的来说,HTTP/1.1 在 HTTP/1.0 的基础上引入了持久连接和请求管道化,提升了性能。而 HTTP/2.0 在 HTTP/1.1 的基础上进一步改进了性能,引入了多路复用和服务器推送等技术,使得网络通信更加高效和快速。
多路复用细说:
多路复用是 HTTP/2.0 协议中的一个重要概念,它极大地改善了网络性能,特别是对于提升网页加载速度和优化资源利用方面有重要意义。我来详细解释下多路复用的概念和作用:
1. 单一连接上的并发请求
在传统的 HTTP/1.x 中,每个资源(比如页面中的图片、样式表、脚本等)都需要通过独立的连接来获取,这可能导致连接的建立和资源传输所带来的延迟,尤其是在高延迟的网络环境下,会影响页面的加载速度。而在 HTTP/2.0 中,所有的请求都可以通过同一个 TCP 连接并行传输,这就是多路复用的核心概念。
2. 提升并发性能
多路复用允许客户端发送多个并发请求,服务器也可以以任意顺序对这些请求进行响应,这样可以最大化地利用网络连接,提高了并发性能,尤其是对于那些需要同时获取大量资源的网页来说,效果更加显著。
3. 避免线头阻塞
在 HTTP/1.x 中,由于队头阻塞(Head-of-line blocking)的问题,一个资源的加载会影响到其它资源的获取,从而导致性能瓶颈。而多路复用能够避免这种情况的发生,加快了整体页面加载速度。
4. 优化网络利用
多路复用减少了建立连接的开销和头部数据的发送,减少了网络资源的浪费,有效地优化了网络利用。
总的来说,多路复用通过允许多个请求/响应同时在一个连接上进行处理,提高了网络通信的效率,降低了延迟,改善了性能,是 HTTP/2.0 协议带来的重要优势之一。
证书检验过程:
HTTPS 证书的校验是确保客户端与服务器之间通信安全的重要步骤。当客户端访问一个使用 HTTPS 协议的网站时,服务器会向客户端展示一个数字证书,客户端需要验证该证书的有效性。下面我将详细介绍 HTTPS 证书校验的过程:
1. 证书请求
客户端向服务器发起连接请求时,服务器会把自己的数字证书一并返回给客户端。该证书中包含了公钥、证书持有者的信息以及数字签名等内容。
2. 根证书验证
客户端会检查服务器提供的数字证书是否由可信的机构颁发,这些机构的公钥通常被内置在操作系统或浏览器中,我们称之为根证书。如果服务器的证书是由一个受信任的证书颁发机构签发的,那么该证书链 (Certificate Chain) 中的每个颁发者证书都必须能被客户端顶层信任的根证书机构所验证。
3. 证书有效性检查
客户端会验证服务器证书是在当前时间内有效且是否包含与要连接的服务器域名一致的信息。同时,客户端还会检查证书是否被吊销 (Revocation),以确保证书的有效性。
4. 公钥加密
如果证书验证通过,客户端会使用证书中的公钥来加密对称密钥(用于后续的对称加密通信)。这个对称密钥是临时生成的,用于加密整个通信过程。
5. 数据传输
一旦客户端收到并加密了对称密钥,双方就可以使用该对称密钥进行加密通信,从而实现安全的数据交换。
上述过程确保了客户端与服务器进行通信时的安全性和数据完整性。通过对证书的校验,客户端可以确保连接的服务器是合法可信的,避免了中间人攻击等安全问题。
Android避免被抓包的方法:
使用 HTTPS 加密通信:通过使用 HTTPS 协议,应用程序的通信将会被加密,这样即使被抓包,也难以直接窃取敏感信息。
证书锁定:在应用中集成服务器的证书,以避免中间人攻击。这样做可以确保应用只会信任特定的证书,而不是接受从其他证书颁发机构颁发的证书。
避免传输敏感信息:尽量避免在网络传输中发送敏感信息,特别是避免在URL参数中发送敏感数据。
加密本地存储数据:对于应用内需要存储的敏感信息,特别是用户凭据等,应该采用适当的加密机制进行存储。
使用安全的网络库:使用知名的网络库如OkHttp,并确保它们已经正确地配置和使用了安全的传输机制。
支持网络安全配置:从 Android 9(Pie)开始,Android 提供了网络安全配置,可以用于配置应用的网络安全策略,确保安全的通信。
防止逆向工程:应用程序的代码可以被逆向工程并进行分析。通过使用代码混淆、加固、二进制保护等技术可以降低应用程序被逆向工程的风险,进而保护其中的网络通信部分。
以上这些方法可以帮助你加强你的 Android 应用程序的安全性,使其在通信过程中更难被他人抓包。
想一想如果没有证书校验直接发公钥给客户端会是什么情况?被中间人攻击
TCP三次握手四次挥手:
tcp粘包拆包的过程:
粘包/拆包的原因
发生TCP粘包或拆包有很多原因,现列出常见的几点:
要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
粘包、拆包解决办法
TCP本身是面向流的,作为网络服务器,如何从这源源不断涌来的数据流中拆分出或者合并出有意义的信息呢?通常会有以下一些常用的方法:
发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。