zhangdizhangdi

概述

参考

基于本书的文章总结:

网站

简介

HTTP 是 超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口。
它使用 TCP 作为传输层协议,保证了数据传输的可靠性。

参考

版本

HTTP/0.9

1991年

请求由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源的路径
响应也极其简单的:只包含响应文档本身,且只能传送 HTML 文件

HTTP/1.0

1996年

  • 请求增加了 协议版本,响应增加了 状态码
  • Content-Type 可传送不同类型文件,如图像、视频、二进制
  • 短链接: 每个HTTP请求都需要建立一个新的TCP连接
  • 缓存使用 If-Modified-Since Expires
  • 每台服务器都绑定一个唯一的 IP 地址
  • 增加 POST、HEAD命令

HTTP/1.1

1997年

  • 支持持久连接(Persistent Connection)
    • 同域名下可以并发 6-8 个TCP连接
    • 多个HTTP请求可以共用一个TCP连接,但是下次请求必须在上次响应返回之后进行【队头阻塞 (Head Of Line Blocking) 】
  • 管道化
    可以不用等待响应返回而发送下个请求并按顺序返回响应,现代浏览器并未默认开启管道化
  • 支持响应分块。
    Range 的 header,它允许只请求资源的某个部分,即返回码是 206(Partial Content)
  • 缓存 headers 的增加
    EtagIf-Unmodified-SinceIf-MatchIf-None-Match
  • 引入内容协商机制
    包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。
  • 凭借 Host 的 header,能够使不同域名配置在同一个 IP 地址的服务器上。
  • 新增了很多请求方法,如 PUT、HEAD、OPTIONS 等。

HTTP1.1 Chrome
图:HTTP1.1 Chrome

HTTP/2

2015年

🔔 h2 是使用 https 协议名,跑在 TLS 上面。

bash
# nginx 下开启 http2
listen 443 ssl http2;

主要概念:

  • 二进制、帧(Frame)
  • 多路复用、流(Stream)
  • 头信息压缩
  • 服务器推送

二进制协议

在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。

HTTP/2 在 应用层(HTTP/2)和传输层(TCP/UDP)之间增加一个二进制分帧层。在二进制分帧层中,HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码,封闭成为头信息帧(headers frame)和数据帧(data frame)。

HTTP2 二进制
图:HTTP2 二进制

数据流

因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流 ID ,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。

数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。

客户端还可以指定数据流的优先级

HTTP/2 数据流
图:HTTP/2 数据流

多路复用(MultiPlexing)

在一个 TCP 连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了”队头堵塞”的问题。

HTTP/2 多路复用
图:HTTP/2 多路复用

头信息压缩(header compression)

由于 HTTP 1.1 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。

HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。

HTTP/2 头信息压缩
图:HTTP/2 头信息压缩

服务端推送(server push)

需要开发者自己配置的功能

服务端可以在发送页面 HTML 时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 时再发送这些请求。

这里需要注意的是 http2 下服务器主动推送的是 静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。

参考

HTTP/1 的几种优化可以弃用
合并文件、内联资源、雪碧图、域名分片对于 h2 来说是不必要的,使用 h2 尽可能将资源细粒化,文件分解地尽可能散,不用担心请求数多

HTTP/3 ⌛️

2022年

QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议

连接的对比图

HTTP 连接
图:HTTP 连接

HTTP 连接
图:HTTP 连接

参考

URx

URI = Uniform Resource Identifier 统一资源标志符
URL = Uniform Resource Locator 统一资源定位符
URN = Uniform Resource Name 统一资源名称

  • https://developer.mozilla.org/zh-CN/docs/Learn
  • ftp://example.org/resource.txt
  • mailto:zhangdi1281@163.com
  • git@github.com:mdn/browser-compat-data.git
  • urn:isbn:9780141036144

大白话,就是URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI

本来设想的使用两种方法定位:
URL,用地址定位
URN,用名称定位

举个例子:
去村子找个具体的人(URI)
如果用 【地址:某村多少号房子第几间房的主人】 就是URL
如果用 【身份证号+名字】 去找,就是URN了
结果就是 目前WEB上就URL流行开了,平常见得URI 基本都是URL

答案来自知乎

参考