Contents

Http

概念

HTTP是一种超文本传输协议(Hypertext Transfer Protocol),HTTP是一个基于TCP实现的应用层协议。一个两点之间传输数据的约定和规范。

组成

分为三部分,超文本、传输、协议

  • 超文本是不止文本,还包含图片、音频、视频等数据
  • 传输是数据从一端系统传送到另一端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。
  • 协议是指传输的规范、规则。

特点

  1. 灵活可扩展。一个是语法上只规定了基本格式,空格分隔单次,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据。
  2. 请求-应答模式。通常而言,就是一发发送消息,另外一方接受消息 。
  3. 可靠传输,http是基于TCP/IP,因此把这一特性继承下来。
  4. 无状态,只负责发信息,不保存信息,需要通过cookie等保存信息。

缺点

  1. 明文传输。即协议中的报文(主要指头部)不适用二进制数据,而是文本形式。这让HTTP的报文信息暴露给了外界,给攻击者带来了便利。
  2. 队头阻塞。当http开启长连接时,共用一个TCP连接,当某个请求时间过长时,其他的请求只能处于阻塞状态。
  3. 无状态,只负责发信息,不保存信息。

http 1.0

  • 标准:

    • 任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制等文件。
    • 通常每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)
  • 性能:

    • HTTP 1.0 被设计用来使用短连接,即每次发送数据都会经过 TCP 的三次握手和四次挥手,效率比较低。
    • 不支持断点续传,也就是说,每次都会传送全部的页面和数据。
    • 只使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。
  • 方法:

    • 支持GET、POST、HEAD
  • 安全:

    • HTTP 1.0 仅仅提供了最基本的认证,这时候用户名和密码还未经加密,因此很容易收到窥探。

http 1.1

与http1.0区别

  • 标准

    • 虚拟主机的支持:使用虚拟网络,在一台服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且共享一个IP地址
    • 引入Cookie。
  • 性能:

    • 引入持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。长连接的连接时长可以通过请求头中的 keep-alive 来设置。
    • 引入管道机制。即在同一个TCP连接里,客户端可以同时发送多个请求。
    • 缓存处理:HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。
    • 支持断点续传,通过使用请求头中的range来实现。
  • 方法:

    • 新增PUT、 PATCH、 OPTIONS、 DELETE。
  • 安全:

    • 使用摘要算法进行身份验证。

存在问题

  1. 队头阻塞问题,HTTP/1.1 默认允许复用TCP连接,但是在同一个TCP连接里,所有数据通信是按次序进行的,服务器通常在处理完一个回应后,才会继续去处理下一个,这样子就会造成队头阻塞。
  2. 在传输数据过程中,所有内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性。

http 2.0

特性

  1. 多路复用(即一个tcp/ip连接可以并发请求多个资源)
  2. 头部压缩(http头部压缩,减少体积)
  3. 二进制分帧(在应用层跟传送层之间增加了一个二进制分帧层,将数据切分为数据帧,改进传输性能,实现低延迟和高吞吐量)
  4. 服务器端推送(即SSE,服务端可以对客户端的一个请求发出多个响应,可以主动通知客户端)
  5. 请求优先级(如果流被赋予了优先级,它就会基于这个优先级来处理,由服务器决定需要多少资源来处理该请求。)

与http1.1不同点

  • http1.1中,一个TCP请求可以发送多个请求,但只能按顺序一个一个请求。如果想并发多个请求,必须使用多个 TCP/ip链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制。
  • http2.0中,只要一个tcp请求可以并发请求多个资源,分割成更小的帧请求,速度明显提升。

HTTP 队头阻塞

我们之前讨论了 HTTP 队头阻塞的问题,其根本原因在于HTTP 基于请求-响应的模型,在同一个 TCP 长连接中,前面的请求没有得到响应,后面的请求就会被阻塞。

后面我们又讨论到用并发连接域名分片的方式来解决这个问题,但这并没有真正从 HTTP 本身的层面解决问题,只是增加了 TCP 连接,分摊风险而已。而且这么做也有弊端,多条 TCP 连接会竞争有限的带宽,让真正优先级高的请求不能优先处理。

队头阻塞

而 HTTP/2 便从 HTTP 协议本身解决了队头阻塞问题。注意,这里并不是指的TCP队头阻塞,而是HTTP队头阻塞,两者并不是一回事。TCP 的队头阻塞是在数据包层面,单位是数据包,前一个报文没有收到便不会将后面收到的报文上传给 HTTP,而HTTP 的队头阻塞是在 HTTP 请求-响应层面,前一个请求没处理完,后面的请求就要阻塞住。两者所在的层次不一样。

引用

HTTP2 详解

http发展史(http0.9、http1.0、http1.1、http2、http3)梳理笔记

神三元

解读HTTP/2 及 HTTP/3特性

HTTP/2.0 Header Compression