Skip to content

Latest commit

 

History

History
76 lines (49 loc) · 5.7 KB

29.HTTP-1 http性能优化.md

File metadata and controls

76 lines (49 loc) · 5.7 KB

29 | HTTP/1:HTTP性能优化

以浏览器视角谈谈即将完成使命的HTTP/1、正向我们走来的HTTP/2和未来的HTTP/3

HTTP0.9

  • 需求:网络间传送超文本内容,所以也叫超文本传输协议,采用基于请求响应的模式,从客户端发送请求,服务端返回数据

    • 请求流程
      1. 客户端根据IP地址,端口和服务器建立TCP连接,TCP三次握手过程
      2. 建立完连接之后,发送一个GET请求行信息,如'GET' index.html获取index.html
      3. 服务端接收到请求信息后,读取对应的HTML文件,数据流以ASCII字符返回给客户端
      4. 完成传输后,断开连接
    • 客户端 ->构建请求 -> DNS查询 -> TCP三次握手 -> 客户端发起请求 -> 服务器响应 -> TCP四次挥手
  • 特点:

    1. 只有一个请求行,没有请求头和请求体
    2. 服务器没有返回头信息,服务器端不需要告诉客户端太多信息, 只需要返回数据就可以了
    3. 返回文件内容不过通过ASCII字符流传输,都是HTML所以字节码传输还是比较合适的

HTTP1.0

  • 需求:传输数据不单只是HTML文件,浏览器功能的发展带入JS和CSS和音频等不同类型的文件。

    • 改进:

      1. 引入请求头和响应头,以key-value形式保存,在http发送请求时会岛上请求头信息,服务端处理完数据对数据回传的时候会带上响应头信息,请求流程只是客户端和服务端之间通过带上请求行和请求头信息

        1. 对于支持多种文件类型,需要服务器告诉浏览器返回的数据是什么类型的,浏览器才会根据不同的数据做处理
        2. 单文件数据量增大,所以服务器会将数据进行压缩,浏览器也需要知道服务器压缩数据的方式(gzip等)
        3. 万维网需要提供国际化的支持,所以服务器需要提供不同的语言版本
        4. 每种文件的编码类型也需要提供给浏览器
      2. 基于上面的问题,HTTP1.0通过请求头和响应头进行协商

        1. 发送出来的请求头内容如下

          accept: text/html // 期待服务器返回的html类型文件
          accept-encoding: gzip, deflate, br // 采用的压缩方式
          accept-Charset: ISO-8859, utf-8 // 采用的编码方式
          accept-language: zh-CN, zh // 支持的国际化语言
          
          • 协商情况: 如果浏览器请求的压缩形式gzip,服务器不支持gzip,只支持br压缩,那么会通过响应头中的content-encoding字段告诉浏览器压缩类型,浏览器最终根据响应头信息处理数据:

            content-encoding: br
            content-type: text/html, charSet=UTF-8
            
    • 新特性:

      1. 有时候请求服务器无法处理或者处理出错,这时候需要告诉浏览器最终处理请求的结果,所以引入了状态码,通过响应行的形式告诉浏览器
      2. 为减轻服务器的压力,HTTP/1.0提供Cache机制,用来缓存已经下载过未过期的资源
      3. 服务器统计客户端的基础信息,如Win和Mac用户数量,所以请求头中还加入了user-agent用户代理字段

HTTP1.1

  • 需求: 每一次HTTP通信都要经过建立TCP连接,传输HTTP数据和断开TCP连接三个阶段,所以在这些阶段的时候通信的花销是巨大的
  • 改进点:
    1. 改进持久连接,一个TCP连接可以传输多个HTTP连接,对于TCP连接进行复用,只要没有明确断开连接TCP连接都会一直保持此状态,从而减少TCP连接和断开产生的花销,持久化连接是默认开启的,如果想关闭可以带上Connection: close,缺点: 浏览器对于同一个域名, 默认允许同时建立6个TCP持久连接(TCP连接队列)
    2. 不成熟的HTTP管线化: 虽然持久化连接能有效减少TCP建立和断开次数,但是也需要等待前面的请求返回之后才能进行下面的请求操作,如果TCP通道中某些请求没有及时处理返回,就会阻塞后面的所有请求,这就是著名的队头拥塞问题,HTTP1.1中尝试用管线化来解决此问题,其管线化是指将多个HTTP请求批次提交给服务器的技术,虽然可以批次发送,但是服务器也要根据请求顺序来处理浏览器的请求(由于技术不成熟,所以浏览器厂商基本都放弃了)
    3. 提供虚拟主机的支持: 每个域名绑定唯一IP地址,所以服务器也只能支持一个域名,由于虚拟主机的支持,需要实现在一台物理主机绑定多个虚拟主机,每个虚拟主机都有单独的域名,HTTP1.1请求头中增加了Host字段用于表示当前域名地址,服务器根据不同Host做不同的处理
    4. 对动态生成的内容提供完美的支持: 引入Chunk transfer机制,服务器将数据分割成若干任意大小数据块, 数据块发送的时候附上数据块的长度, 使用一个领长度的块作为数据发送完成的表示,完成对动态内容的支持
    5. 引入Cookie机制和安全机制

summary

  • 重点强调HTTP是浏览器和服务器的通信语言,从需求演变追溯HTTP发展史,对于万维网的迅速发展也带来了新需求, HTTP1.0将简单的请求行升级为请求行加请求头和响应行响应头机制,使服务端和客户端能够获得更多的信息来处理更多更精细的需求,在HTTP1.1中带来了Cache、状态码,持久连接提升HTTP传输的效率,同时也带来了对头阻塞的问题,试图采用管线化来解决带来的问题,无奈失败,同时对于HTTP1.1中的Cookie,虚拟主机支持和支持动态内容也值得关注, 但还是有性能和效率的问题存在,在下篇带来的HTTP2将有望解决