// 【】的是没想起来的
// 还差SSL/TLS相关的部分,不过应该也不重要?懂的兄弟们评论下
理解队头阻塞(HOL)
- HTTP1 非流水线式的,请求响应的形式,自然而然的,如果前面的请求没有得到回复,就有队头阻塞
- HTTP1.1 流水线式的,按照FIFO没有优先级,如果前面的请求服务器处理的时间较长,则也会队头阻塞
- HTTP2 多个STREAM复用一个TCP连接,TCP如果发生丢包,后面的TCP到了也不能向上传递,也就是队头阻塞
HTTP是什么
超文本传输协议
- 超文本:超过了文本的内容,图片,视频,音频
- 传输:点对点之间的通信
- 协议:规范,守则
状态码
- 100:中间状态
- 200:成功
- 300:请求重定向
- 400:客户端错误
- 500:服务端错误
字段
- host:【服务器域名】
- connection:keep-alive,长连接
- accept:接收的编码类型
- content-length:内容长度
- content-encoding:编码类型
- content-type:数据的格式,text/html
- ETag:摘要
- Method:请求的方法
GET和POST
- 本质上是一样的,都是HTTP的方法
- 人为的定义,语义,是不一样的
- 获得/提交资源
- 可与/不可以保存书签
- 安全且幂等/不安全且不幂等
HTTPS
- HTTP相对HTTPS的缺点:
-
冒充 -> 数字证书
-
窃听 -> 【混合加密】,交换密钥的时候是【非对称加密】,之后的通信是对称加密(性能好,无法安全交换密钥)
-
篡改 -> 【摘要算法】
-
- 区别:
- HTTPS建立连接时TLS/SSL需要4次握手
- 安全的HTTP
- 端口号 【80 -> 443】
HTTP1.1
- 更灵活缓存处理: 引入Etag(Entity tag)等目前常用的缓存相关策略
- 优化带宽使用: 引入
range头域,支持206(Partial Content),用于数据断点续传。 - 错误机制更完善: 引入24个错误状态码,如409(Conflict)请求资源与当前状态冲突; 410(Gone)资源在服务器上被永久删除
- Host头处理: 请求头中必须带上
host,否则会报400 Bad Request,为了支持一台服务器上有多台虚拟主机,因此通常一个IP对应了多个域名
HTTP2
- 【基于HTTPS,TLS1.2】
- 【服务器推送】
- 【二进制帧(利于计算机处理)】
- 每一个请求/响应报文分成2个帧
- HEADERS Frames/DATA Frames
- 【多个STREAM复用同一个TCP连接(问题:一个TCP丢包会丢失很多请求)】
- 【CONNECTION/STREAM/MESSAGE/STREAM】
- 多个STREAM复用同一个TCP连接
- 相对于HTTP1.1提升很大,HTTP1.1每一个连接都要TCP三次握手、慢启动、SSL/TLS四次握手
- 【可以设置优先级 】
- 头部压缩(HPACK算法)(静态编码表,动态编码表,哈夫曼编码)
-
静态字典:用长度较小的索引号表示重复的字符串
-
动态字典:动态维护的,静态字典里没有的字符串
-
HTTP3
- 基于QUIC(基于UDP)
- QUIC,基于UDP实现的可靠数据传输
- TLS升级到1.3
- TLS1.3只需要3次握手
- 头部压缩算法变为QPACK
- 静态编码表项变多了
- 哈夫曼编码基本没变
- 动态编码改变最大
- HTTP2时,如果第一个请求出现丢包,后续请求即使受到了也无法解码头部
- 建立两个单向的流来同步动态编码表
- 比HTTP2的改进
-
网络状态迁移
-
优化握手
-
无队头阻塞,因为不基于TCP了
-
HTTP1.1如何优化
- 不发请求:
- 缓存:【增加缓存,ETag头部存入摘要,服务器返回不含body的304NOT MODIFIED】
- 减少请求:
- 服务器去重定向:【代理服务器配置重定向规则】
- 懒加载
- 多个资源合并
- 压缩
- 有损压缩
- 无损压缩