HTTP 是什么
简介
HTTP 是超文本传输协议。它是协议、也是传输、又是超文本。但它不是互联网、不是编程语言、不是 HTML、不是一个孤立的协议
它由蒂姆·伯纳斯-李发明,同时,他也是 WWW 的发明人,最初主要用于传递 HTML 封装过的数据
超文本传输协议,拆分出来就是,”超文本“、”传输“、”协议“
超文本:比文本更大,它不仅包括文本,还包括图片、音视频等
传输:它专门用来在两点间传输数据,不能用于广播、寻址或路由
协议:是计算机世界里的协议,它确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式
有趣的网站
HTTP CAT 喵星人给你解释状态码 https://http.cat
特点
- HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
- HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达;
- HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
- HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
- HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。
优缺点( HTTP/1.1)
HTTP 最大的优点是简单、灵活和易于扩展;
HTTP 拥有成熟的软硬件环境,应用的非常广泛,是互联网的基础设施;
HTTP 是无状态的,可以轻松实现集群化,扩展性能,但有时也需要用 Cookie 技术来实现“有状态”;
- 因为 Cookie,又有了 XSS、CSRF 等 web 安全问题
HTTP 是明文传输,数据完全肉眼可见,能够方便地研究分析,但也容易被窃听;
HTTP 是不安全的,无法验证通信双方的身份,也不能判断报文是否被窜改;
- 所以有了 HTTPS
- HTTPS 相对 HTTP 有了安全性、机密性、完整性、身份认知、不可否认等特点
- 安全性:由 TLS 协议保证
- 机密性:对称加密与非对称加密
- 完整性:...
HTTP 的性能不算差,但不完全适应现在的互联网,还有很大的提升空间
- 性能一般,所以有各种优化手段,HTTP1.1 的优化手段就有并发连接、域名分片
- 所以才有了 HTTP2,从协议层解决队头阻塞问题
- 后来又有了 HTTP3,将 TCP 协议换成 UDP,解决 TCP 的队头阻塞
历史时段
- 1991 年发布 HTTP 0.9
- 只支持纯文本格式
- 只支持 GET 请求
- 1996 年发布 1.0 版
- 增加了 HEAD、POST 等新方法
- 没有长连接,每次发送请求,都要链接一个 TCP
- 1997 年发布 1.1 版
- 至今传输最广泛的版本
- 加上 connection: keep-alive (长连接),复用一个 TCP 连接
- 优点(特点)
- 长连接(持久连接):响应头中设置 keep-alive,可以在一个 TCP 连接上发送多个 HTTP 请求
- 存在的问题
- 对带宽的利用率并不理想(三个主要原因)
- TCP 的慢启动
- 多条 TCP 连接竞争带宽
- 队头阻塞(主因)
- 工作流程是请求-响应,请求发出去等待响应,然后在发送下一次请求。队头请求处理太慢,就会阻塞后面的请求处理
- 发起了请求,但是响应还没回应,引起了“塞车”
- (队头阻塞)解决方法:
- 并发连接(多建立几个 TCP 连接)
- 同一个服务器,最多建立 6 个连接
- 域名分片
- 多几个域名
- 例如:把图片资源、js、css 分别部署在 10 个服务器,可以同时下载 60 个文件
- 多路复用
- HTTP2 解决方案
- 并发连接(多建立几个 TCP 连接)
- 此时的前端优化方案(网络层面)
- 减少请求数量(例如雪碧图)、内敛一些资源:css、base64 图片、合并小文件等
- 对带宽的利用率并不理想(三个主要原因)
- 2015 年发布 2.0 版
- 基于 SPDY 协议
- 解决 HTTP1.1 的队头阻塞问题,让同一个 TCP 连接上发送所有 HTTP 请求
- 优点:
- 多路复用:相同域名多个请求,共享同一个 TCP 连接
- 二进制传输:之前是纯文本传输
- 请求优先级:给每个 request 设置优先级
- 数据流:每个请求和影响都当作一个流,
- 服务器推送:可以主动向客户端发送消息
- 头部压缩:减少包的大小和数量
- 缺点:
- TCP 以及 TCP+ TLS 建立连接的延时
- 还是会存在队头阻塞,不过是 TCP 的队头阻塞
- 多路复用导致服务器压力上升
- 多路复用容易 Timeout
- 2018 年发布 3.0 版
- Google 发明了一个新的协议,叫做 QUIC,它基于 UDP 协议,取代 TCP 协议
- 因为 TCP 会丢包,所以改用另外一个协议
- 一旦 TCP 层出现丢包,依然会出现队头阻塞问题(Stream 丢失),使用 UDP 协议能从根本上解决了队头阻塞的问题
- 特点:
- 改进的拥塞控制、可靠传输
- 快速握手
- 继承了 TLS 1.3 加密
- 多路复用
- 连接迁移