HTTP和HTTPS详解

HTTP长连接

HTTP协议采用的是请求-应答的模式,客户端发起了请求,服务端才会响应

由于HTTP是基于TCP传输协议实现的,因此客户端与服务端在进行通信前,需要先建立TCP连接,然后客户端发起HTTP请求,服务端收到后就返回响应,这样请求-应答的模式就完成了,随后释放TCP连接。如果我们每次请求都要经历这样的过程,每次请求前都要建立TCP的连接(三次握手),请求后释放连接(四次挥手),这样的过程就是HTTP短连接

很显然这样这样是很浪费资源和时间的,那么有没有一种方法可以在第一个请求完后,不释放连接,让后续的HTTP请求继续使用此连接呢?有的,兄弟有的

HTTP的keep-Alive就是实现了这个功能,可以让一个TCP连接来发送和接收多个HTTP的请求和应答,避免连接建立和释放的开销,这就是HTTP长连接

HTTP1.0到HTTP2.0

最初HTTP是没有版本号的,随着越来越多人用上了互联网,促进了HTTP协议的修改

HTTP1.0

1.增加了HEAD,POST等新方法

2.增加了响应状态码

3.引入了头部(请求头,响应头)

4.在请求中加入了HTTP版本号

5.引入了Content-Type,使得传输不再限于文本

HTTP1.1

1.新增了连接管理即keep-Alive,允许持久连接

2.支持pipeline,即无需等待前面的请求响应,就可以发送第二次请求,但服务端必须按照接收到的客户端请求顺序依次返回响应结果

3.允许响应数据分块,即响应时不标明Content-Length,客户端就无法断开连接,直到收到服务端的EOF,这样有利于大文件的传输

4.新增缓存的控制和管理

5.加入了Host头,用于部署了多台主机,多个域名解析是同一个ip的情况,加入Host头后就可以分辨是哪个主机

HTTP2.0

1.变为二进制协议,不再是纯文本,头信息和数据体都是二进制,并统称为帧:头信息帧和数据帧

这样计算机收到报文后就不需要再将报文转为二进制,而是直接解析二进制报文,增加了数据传输效率

2.多路复用

移除了pipeline,复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或响应,而且不需要按照顺序一一对应,这样就避免了队头阻塞

3.头部压缩

在客户端和服务端会使用一个“首部表”来跟踪和存储之前发送的键值对,对于相同的数据,便不再通过每次请求和响应发送,首部表在连接存续期内始终存在,由客户端和服务端共同渐进更新

如下图中的两个请求, 请求一发送了所有的头部字段,第二个请求则只需要发送差异数据,这样可以减少冗余数据,降低开销

该图引用https://vue3js.cn/interview/http/1.0_1.1_2.0.html#%E4%B8%89%E3%80%81http2-0

4.允许服务器主动推送资源

服务器会顺便把一些客户端需要的资源一起推送到客户端,非常适合加载静态资源

HTTPS握手过程

传统的TLS握手基本都是使用RSA算法(非对称算法)来实现密钥交换的,在将TLS证书部署到服务端时,证书文件就是服务端的公钥,会在TLS握手阶段传递给客户端,而服务端的私钥则一直留在服务端。客户端会生成随机密钥,使用服务端的公钥加密后传给服务端,在非对称加密算法中,公钥加密的消息仅能通过私钥解密,服务端用私钥解密后,双方就得到了相同的密钥,最后再用它加密消息

TLS第一次握手

首先由客户端向服务端发起加密通信请求(ClientHello)主要会发送以下信息:

1.客户端支持的TLS协议版本,如TLS1.2版本

2.客户端产生的随机数(Client Random),是后面用于生成会话密钥条件之一

3.客户端支持的加密套件,如RSA加密算法

TLS第二次握手

服务端收到客户端请求后,向客户端发出响应(ServerHello)主要发送以下信息:

1.确认TLS协议版本,如果浏览器不支持,则关闭加密通信

2.服务端产生的随机数(Server Random),也是后面用于生成会话密钥条件之一

3.确认的密码套件,如RSA加密算法

4.服务器的数字证书

TLS第三次握手

客户端收到服务器的响应之后,会先通过浏览器或者操作系统中的CA公钥,检查服务器的数字证书真实性。如果证书没问题,客户端会从数字证书中获得服务器的公钥,再向服务器发送以下信息:

1.一个随机数(pre-master key),会用公钥加密这个随机数

2.加密通信算法改变通知,表示随后的信息都将用会话密钥加密通信

3.客户端握手结束通知,表示客户端的握手阶段已经结束。同时把之前所有内容的发生的数据做个摘要,用于服务端校验

客户端和服务端有了这三个随机数【客户端随机数(Client Random),服务端随机数(Server Random),客户端用公钥加密的随机数(pre-master key)】,接着就用双方协商的加密算法,各自生成本次通信的会话密钥

TLS第四次握手

服务端手收到客户端的随机数(pre-master key),通过协商的加密算法,会计算出本次通信的会话密钥,最后向客户端发送最后的信息:

1.加密通信算法改变通知,表示随后的信息都将用会话密钥加密通信

2.服务器握手结束通知,表示服务器的握手阶段已经结束。同时把之前所有内容的发生的数据做个摘要,用于客户端校验

完整过程如下图所示(该图来源于小林coding

HTTP和HTTPS区别

1.数据传输

HTTP传输数据是以明文传输的,容易被窃听篡改,而 HTTPS则解决了HTTP不安全的风险,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文得以加密传输

2.端口号

HTTP的默认端口号为80

HTTPS的默认端口号为443

3.性能

HTTP的性能相对更好,因为没有加密过程,在TCP三次握手之后就可以进行报文传输了,而HTTPS则在TCP三次握手之后还需要进行SSL/TLS的握手过程,才可以进行加密传输。

4.SEO影响

搜索引擎一般会降低未加密站点的排名,更倾向于优先展示HTTPS网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值