一、什么是HTTP?
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。(HTTP协议属于应用层协议)
标题HTTP的工作流程
- 浏览器与服务器建立TCP连接,即三次握手
- TCP连接成功,浏览器发出HTTP请求命令
- 服务端接收请求并返回HTTP响应
- 服务器关闭连接,即四次挥手
- 浏览器解析请求的资源
HTTP1.0:
- 每次请求都必须新建一次连接,必须通过TCP的三次握手才能开始传输数据,连接结束之后还要经历四次挥手。
- 不跟踪每个浏览器的历史请求
缺点:
- 连接无法复用-每次请求都需要建立一个TCP连接,费时费力
- 队头阻塞,下一个请求必须在前一个请求响应到达后发送。如果某请求一直不到达,那么下一个请求就一直不发送。(高延迟–带来页面加载速度的降低)
HTTP1.1:
在HTTP1.1中,默认支持长连接,即在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
特点:
- 支持长连接,通过Keep-Alive保持HTTP连接不断开,避免重复建立TCP连接 管道化,通过长连接实现在一个连接中传输多个文件
- 加入缓存处理(新字段cache-control) 支持断点续传
- 增加了Host字段,实现了在一台WEB服务器上可以同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点
- 并且添加了其他请求方法:put、delete、options…
缺点:
- 高延迟–队头阻塞
- 无状态特性–阻碍交互
- 明文传输–不安全
- 不支持服务端推送
- 每个请求会单独建立一个tcp连接,浏览器限制单个域名连接数上限一般为6个,当接口数量大于6时,后面的请求只能排队等待
HTTP2.0
- 二进制分帧传输:将请求和响应消息分割为多个二进制帧,可以并发地发送和处理,提高传输效率。
- 多路复用:在单个连接上可以同时发送多个请求和响应,避免了建立多个 TCP 连接的开销,提高并发性能。 头部压缩:使用 HPACK
- 算法对请求和响应的头部进行压缩,减少数据传输量,提高性能。
- 服务器推送:服务器可以主动推送与当前页面相关的资源,减少客户端的请求延迟。
存在TCP队头阻塞问题:
HTTP/2是同域名的请求共享一个tcp链接,如果前一个请求发生丢包,由于tcp的数据丢失重传机制,导致浏览器会不断重传数据包,进而阻塞后续请求。
根源是tcp协议丢失重传机制,导致了上述问题。
HTTP3.0
QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。
- 连接迁移:支持在网络切换或设备漫游时无缝迁移连接,避免连接中断。 无队头阻塞:解决了 TCP
- 协议中的队头阻塞问题,可以同时发送多个请求和响应,提高并发性能。
- 自定义拥塞控制:使用独立的拥塞控制算法,适应不同网络条件下的流量控制和拥塞控制。
- 前向安全和前向纠错:支持端到端的加密和纠错机制,提高数据传输的安全性和可靠性。