我正在参与掘金创作者训练营第5期,点击了解活动详情
http 0.9
-
1.只允许客户端 发送 GET 这一种请求
-
2.不支持请求头
- 由于没有请求头 那么就只能发送纯文本
- 不过网页仍然支持 html 格式化 但是无法插入图片
-
3.http 无状态也是在这时候就有了
- 基于 tcp 三次握手 每次都会重新连接和断开
- 成功就返回对应页面内容 但是即使失败也没有状态码返回
http1.0
-
相较于 http 0.9 增加了以下特性
- 请求和响应支持头部
-
短链接
-
每次发送都需要重新建立 tcp 连接 及三次握手 性能较差
-
没有 host 头域 也就是 http 请求头里面的 host
-
不允许使用断点续传 而且不能只传输对象的一部分 要求传整个对象
- 比如下载一个视频 上次下了一半 然后下次下载又要重头开始
-
http 1.1
-
引入了更多的缓存策略
- http1.0 主要使用 If-Modified-Since Expires 来做缓存的判断
- http1.1 引入更多的缓存控制策略 如 entity tag if-Unmodified-since If-Match If-None-match 等更多可选择的缓存头来控制缓存策略
-
在请求头中 引入 range 头域 它允许只请求资源的某一部分 及返回 206 (partial Content) 这样就便于开发者自由选择 充分利用带宽和链接
-
Host 头处理
- http 1.0 中认为每台服务器都绑定一个唯一的 ip 地址 因此 请求消息中的 URL 并没有传递主机名 但随着虚拟主机的发展 在一台物理服务器上可以有多台虚拟主机 并且共享一个 ip 地址
- http 1.1 中的请求消息和响应消息 都支持 host 头域 且请求消息中如果没有 Host 头域会报 400 Bad Request
-
长连接支持
- 支持长连接 和 请求的流水线处理 在一个 tcp 连接上可以传送多个 http 请求和响应 减少了建立和关闭的延迟和消耗
- http 1.1 中默认开启 connection: keep-alive 一定程度上弥补了 http1.0 每次请求都要船舰连接的缺点
http 2.0
-
采用了新的二进制格式
- http 1.x 的解析式基于文本 文本多样的 不够健壮
- 二进制嘛 0 1 无论什么文本都能够解析了
-
多路复用
- 连接共享 基于长连接的 一个连接哈桑可以有多个 request 一个 request 对应一个 id 每个连接的 request 可以随机的混杂在一起 接收方可以根据 request 的 id 将request 在归属到各自不同的服务端请求里面
-
多路复用 和 长连接有什么区别?
- 1.1 里面长连接式串行的 一个被卡住了 就会影响后面的请求 也就是队头阻塞
- 2.0 是并行的 不会影响到其他连接的正常执行
- 但是因为是基于 tcp 协议的 传输过去了之后会进行组合 但是如果其中一个包丢失了 还是需要等待重传的
-
header 压缩
- http 1.1 header 带有大量的信息 而且每次都会重复发送
- http 2.0 使用 encoder 来减少需要传输的 header 大小 通讯双方各自 cache 一份 header fields 表 避免重复 header 的传输 又减小了需要传输的大小
- 就是缓存起来吗 直接从缓存里拿就行了
-
服务器推送
我正在参与掘金创作者训练营第5期,点击了解活动详情
http 3.0
-
基于 google 的 QUIC 协议 而 quick 协议是使用 udp 实现的 减少了 tcp 三次握手的时间 以及tls(安全传输层协议 用于在两个通信应用程序之间提供保密性 和 数据完整性)握手时间
- 问题 tcp 和 udp 的区别
-
解决了 http 2.0 中前一个 stream 丢包导致后一个 stream 被阻塞的问题 (tcp 层 的对头阻塞)
-
优化了 重传策略 重传包和原包的编号不同 降低了后续重传计算的消耗
-
连接迁移 不再使用 tcp 四元组确定一个链接 而是使用 64 位 随机数来确定这个连接
-
更适合流量控制
tcp 是基于操作系统实现的 浏览器 qq 腾讯会议 传输数据啥的 都是基于直接调用操作系统直接使用的
\