概述
参考
书
基于本书的文章总结:
网站
- HTTP - MDN
- Computer Network Tutorial - GeeksforGeeks
简介
HTTP 是 超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口。
它使用 TCP 作为传输层协议,保证了数据传输的可靠性。
参考
- HTTP 概述 - MDN
版本
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 的增加
Etag
、If-Unmodified-Since
、If-Match
、If-None-Match
等 - 引入
内容协商
机制
包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。 - 凭借
Host
的 header,能够使不同域名配置在同一个 IP 地址的服务器上。 - 新增了很多请求方法,如 PUT、HEAD、OPTIONS 等。

HTTP/2
2015年
TIP
🔔 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)。

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

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

头信息压缩(header compression)
由于 HTTP 1.1 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。
HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。

服务端推送(server push)
需要开发者自己配置的功能
服务端可以在发送页面 HTML 时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 时再发送这些请求。
这里需要注意的是 http2 下服务器主动推送的是 静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。
参考
TIP
HTTP/1 的几种优化可以弃用
合并文件、内联资源、雪碧图、域名分片对于 h2 来说是不必要的,使用 h2 尽可能将资源细粒化,文件分解地尽可能散,不用担心请求数多
HTTP/3 ⌛️
2022年
QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议
连接的对比图


参考
- HTTP 协议入门 - 阮一峰
- HTTP 的发展 - MDN
- HTTP/1.x 的连接管理 - MDN
- HTTP2 基本概念学习笔记 - 掘金
- 解密 HTTP/2 与 HTTP/3 的新特性 - segmentfault
URx
URI = Uniform Resource Identifier 统一资源标志符
URL = Uniform Resource Locator 统一资源定位符
URN = Uniform Resource Name 统一资源名称
INFO
- 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
INFO
大白话,就是URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI
本来设想的使用两种方法定位:
URL,用地址定位
URN,用名称定位
举个例子:
去村子找个具体的人(URI)
如果用 【地址:某村多少号房子第几间房的主人】 就是URL
如果用 【身份证号+名字】 去找,就是URN了
结果就是 目前WEB上就URL流行开了,平常见得URI 基本都是URL
答案来自知乎
参考
- 标识互联网上的内容 - MDN