这是我参与「第五届青训营」笔记创作活动的第 7 天
前言
当我们在浏览器中输入了一段URL,浏览器就会发送请求给服务器,服务器会返回响应信息给浏览器,其中客户端与服务端就是使用HTTP进行通信的。本篇文章将为大家介绍的HTTP的发展历史。
HTTP协议
HTTP是什么
HTTP(HypeText Transfer Protocol)即超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。是一种无状态的协议
客户端(浏览器)会向服务器提交HTTP请求,然后服务器向客户端返回响应;其中响应包含有关请求的状态信息,还可能包含请求的内容。
HTTP发展历史
在HTTP的发展过程当中,出现了不少HTTP版本,其中的大部分协议都是向下兼容的。在进行HTTP请求时,客户端在请求时会告诉服务器它采用的协议版本号,而服务器则会在使用相同或者更早的协议版本进行响应。
HTTP/0.9
- 只支持GET请求方式
- 服务器只返回html字符串信息,不包含头信息
- 服务器返回后就断开tcp连接
- 只有一个请求行,并没有HTTP 请求头和请求体
- 是返回的文件内容是以 ASCII 字符流来传输的
HTTP/1.0
- 引入了请求头和响应头
- 新增GET,POST,HEAD请求方式
- 新增了请求的字段 文件类型,压缩还有编码格式
- 新增了服务端响应字段
- Content-Type支持的返回类型 支持图片,视频,二进制文件
- 多部分对象集合(Multipart) 如文件上传 Content-Type: multipart/form-data ,HTTP 协议中使用了多部分对象集合,发送的一份报文主体内可含有多类型实体
- 缓存Expires
- 新增状态码
- 可以使用Connection:keep-alive 实现请求后,tcp不断开,但是不是标准,并不是每个浏览器都支持
- 新增http header信息来描述元数据。
- 增加了用户代理UserAgent获取客户端的基础信息
缺陷
- 无状态: 服务器不跟踪不记录请求过的状态: 可以借助 cookie/session 机制做身份认证和状态记录
- 无连接:无法复用连接, 每次都需要进行三次握手, 四次挥手, 浪费网络资源
- 队头阻塞: HTTP1.0 规定, 在前一个响应完成后, 下一次请求才能发出, 如果前一个阻塞, 后面的请求也阻塞了
HTTP/1.1
HTTP/1.1 消除了大量歧义内容并引入了多项改进:
- 在原有的基础上新增了许多请求方法:PUT、PATCH、CONNECT 、OPTIONS、DELETE。
- 连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间。
- 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
- 支持响应分块。
- 引入额外的缓存控制机制。
- 引入内容协商机制,包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。
由于 Content-Length 字段必须真实反映实体长度,但实际应用中,有些时候实体长度并没那么好获得,例如实体来自于网络文件,或者由动态语言生成。这时候要想准确获取长度,只能开一个足够大的 buffer,等内容全部生成好再计算。但这样做一方面需要更大的内存开销,另一方面也会让客户端等更久。
- 当 Content-Length 大于实际值会超时
- 当 Content-Length小于实际值会截断并可能导致后续的数据解析混乱。
Transfer-Encoding: chunked 该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(比如由数据库动态产生的数据), Content-Length将被忽略。
HTTP/2.0
- HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
- 这是一个多路复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。
- 压缩了标头。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
- 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。
针对HTTP1.1的缺点进行了优化,首先是慢启动,慢启动避免了启动的刚开始会占用大量的资源,其次是会对tcp进行降速处理,避免tcp竞争资源占用过多资源,http队头堵塞,管道中同一时刻只能处理一个请求,所以会出现堵塞的情况
HTTP2成为了现代web开发最常用的HTTP协议之一,这种迅速的普及率很可能是因为 HTTP2 不需要站点和应用做出改变:使用 HTTP/1.1 和 HTTP/2 对他们来说是透明的。拥有一个最新的服务器和新点的浏览器进行交互就足够了。只有一小部分群体需要做出改变,而且随着陈旧的浏览器和服务器的更新,而不需 Web 开发者做什么,用的人自然就增加了
HTTP/3.0
HTTP3.0为了解决早期版本存在的一些问题,使用了QUIC作为了解决方案
QUIC 旨在为 HTTP 连接设计更低的延迟。类似于 HTTP/2,它是一个多路复用协议,但是 HTTP/2 通过单个 TCP 连接运行,所以在 TCP 层处理的数据包丢失检测和重传可以阻止所有流。QUIC 通过UDP运行多个流,并为每个流独立实现数据包丢失检测和重传,因此如果发生错误,只有该数据包中包含数据的流才会被阻止。
总结
HTTP自创造以来,发生了很多很多的变化,在保持其简单性的同时,不断延伸,拓展其灵活性。在当前的web开发中HTTP协议直接决定了前后端交互的速度、内容和安全等等,浏览器离不开HTTP,而我们作为一名前端开发更离不开HTTP协议,希望这篇文章能带给大家在学习HTTP协议的路上提供些许帮助。