29 | HTTP/1:HTTP性能优化

超文本传输协议 HTTP/0.9

image.png
特点:

  • 没有请求头和请求体,只需要一个请求行
  • 没有响应头,只有返回数据,不需要告诉浏览器过多信息
  • 返回的文件内容是以ASCII字符流传输的

    被浏览器推动的 HTTP/1.0

    image.png
    特点:

  • 增加了请求头和响应头:用以表示文件类型、文件压缩类型、文件编码类型、语言版本

  • 增加了状态码:表示实际请求处理的结果
  • 增加了Cache机制:用以减轻服务器的压力
  • 增加了用户代理:用以统计客户端的基础信息

    缝缝补补的 HTTP/1.1

    特点:

  • 持久连接:HTTP/1.1 中增加了持久连接的方法,它的特点是在一个 TCP 连接上可以传输多个 HTTP 请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。(目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。)

  • HTTP 管线化:将多个 HTTP 请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求
  • 提供虚拟主机的支持: 将一个物理主机划分为多个虚拟主机,通过浏览器端的请求头Host 字段,浏览器根据不同的Host 字段值做不同的处理
  • 对动态生成的内容提供了完美支持:引入Chunk transfer 机制
  • 客户端 Cookie、安全机制

    30|HTTP/2:如何提升网络速度?

    HTTP 1.1的问题

  • TCP 的慢启动

  • 同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽
  • HTTP/1.1 队头阻塞的问题

    HTTP/2的特点

  • HTTP/2 的多路复用

  • 可以设置请求的优先级
  • 服务器推送
  • 头部压缩

    HTTP/2 的多路复用

    一个域名只使用一个 TCP 长连接和消除队头阻塞问题

image.png
HTTP2的多路复用机制:为每一个请求生成一个ID,服务器端接收到请求以后,可以根据请求的优先级(或其他喜好)决定优先返回哪些内容给浏览器,可以先返回响应头,后面在合适的时机再返回响应体,之所以可以这样乱序发送,是因为每一个响应数据都有对应的ID,浏览器接受到数据以后,再根据对应的ID将其拼接成一个完成的HTTP响应数据。

多路复用的实现

image.png

通过引入二进制分帧层,为请求和响应增加了ID,就实现了 HTTP 的多路复用技术,可以乱序发送数据

  1. 首先,浏览器准备好请求数据,包括了请求行、请求头等信息,如果是 POST 方法,那么还要有请求体。
  2. 这些数据经过二进制分帧层处理之后,会被转换为一个个带有请求 ID 编号的帧,通过协议栈将这些帧发送给服务器。
  3. 服务器接收到所有帧之后,会将所有相同 ID 的帧合并为一条完整的请求信息。然后服务器处理该条请求,并将处理的响应行、响应头和响应体分别发送至二进制分帧层。
  4. 同样,二进制分帧层会将这些响应数据转换为一个个带有请求 ID 编号的帧,经过协议栈发送给浏览器。
  5. 浏览器接收到响应帧之后,会根据 ID 编号将帧的数据提交给对应的请求。

    31|HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络

    HTTP2的问题

  • TCP 的队头阻塞:在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞
  • TCP 建立连接的延时:TCP(1.5RTT) + TLS(1-2RTT) = 3~4 个 RTT(Round Trip Time 网络延迟)
  • TCP 协议僵化: 中间设备、操作系统

    QUIC 协议(Quick UDP Internet Connections)

    image.png
    QUIC 协议特点:

  • 实现了类似 TCP 的流量控制、传输可靠性的功能(虽然UDP不支持可靠传输,增加了一层实现数据包重传、拥塞控制以及其他一些 TCP 中存在的特性)

  • 集成了 TLS 加密功能
  • 实现了 HTTP/2 中的多路复用功能(QUIC 实现了在同一物理连接上可以有多个独立的逻辑数据流)

image.png

  • 实现了快速握手功能

**


HTTP1 VS HTTP1.1 VS HTTP2 的对比

HTTP1

  • 无状态:服务器不记录不存储请求过的状态
  • 无连接:每一次发送请求,都需要重新建立TCP连接


HTTP1.1**

  • cookie:增加了cookie记录客户端身份
  • 缓存机制
  • 断点续传
  • 持久连接 connection: keep-alive:对于同一个域名下的请求,可以复用TCP连接
  • 管道化:在同一个TCP连接下,允许发送多个HTTP请求,但是响应的顺序依然是按照请求的顺序返回(没有解决对头阻塞的问题) ``` // 无管道化 请求1 > 响应1 —> 请求2 > 响应2 —> 请求3 > 响应3

// 管道化 请求1 —> 请求2 —> 请求3 > 响应1 —> 响应2 —> 响应3 ```

HTTP2

  • 多路复用:一个TCP连接可以发送多个HTTP请求
  • 二进制分帧层
    • 将一个TCP划分为多个流(stream)
    • 将http消息分解为独立的帧(frame)【帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流】
    • 帧通过自己所属的流乱序发送
    • 服务端根据标识符和首部将消息重新组装起来
  • 请求优先级
    • 可以设置请求的优先级,对优先级高的请求优先响应
  • 服务端推送:服务器端可以向客户端推送消息
  • 请求头压缩

HTTP VS HTTPS 的对比

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

TCP VS UDP

UDP(User Datagram Protocol 用户数据包协议)

  • UDP不能保证数据的可靠性,但是传输速度非常快
  • 主要应用在一些关注速度、但是不那么严格要求数据完整性的领域,如在线视频、互动游戏等

TCP(Transmission Control Protocoa, 传输控制协议): 面向连接的、可靠的、基于字节流的传输层通信协议

  • 对于数据包丢失的情况,TCP 提供重传机制;
  • TCP 引入了数据包排序机制,用来保证把乱序的数据包组合成一个完整的文件。
  • 主要应用在一些关注数据传输可靠性的应用,如邮箱