HTTP123

593 阅读3分钟

// 【】的是没想起来的
// 还差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算法)(静态编码表,动态编码表,哈夫曼编码)
    • 静态字典:用长度较小的索引号表示重复的字符串

    • 动态字典:动态维护的,静态字典里没有的字符串

image.png

HTTP3

  • 基于QUIC(基于UDP)
    • QUIC,基于UDP实现的可靠数据传输
  • TLS升级到1.3
    • TLS1.3只需要3次握手
  • 头部压缩算法变为QPACK
    • 静态编码表项变多了
    • 哈夫曼编码基本没变
    • 动态编码改变最大
      • HTTP2时,如果第一个请求出现丢包,后续请求即使受到了也无法解码头部
      • 建立两个单向的流来同步动态编码表
  • 比HTTP2的改进
    • 网络状态迁移

    • 优化握手

    • 无队头阻塞,因为不基于TCP了

image.png

HTTP1.1如何优化

  • 不发请求:
    • 缓存:【增加缓存,ETag头部存入摘要,服务器返回不含body的304NOT MODIFIED】
  • 减少请求:
    • 服务器去重定向:【代理服务器配置重定向规则】
    • 懒加载
    • 多个资源合并
  • 压缩
    • 有损压缩
    • 无损压缩