3

《HTTP/2 in Action》阅读笔记(一)

 2 years ago
source link: https://yanbin.blog/http-2-in-action-reading-notes-1/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

《HTTP/2 in Action》阅读笔记(一)

2022-08-16 — Yanbin

本书买来有一段时日了,一直还未开始阅读,关于网络上 HTTP/2 的真实使用状态查到以下信息

  1. 截止 2021 年 1 月 8 日,有 50% 的网站正在使用 HTTP/2,参见 Usage statistics of HTTP/2 for websites
  2. 另一篇介绍 HTTP/2 Adoption 说 2020 年就有 64% Web 请求是基于 HTTP/2 的

得看看我们自己的网站对 HTTP/2 的支持以及使用状况

于此同时,HTTP/3(gQUIC) 也上了议程,作为 HTTP/3 的提议标准的 RFC9114 也于 2022 年 6 月 6 日由 IETF 发布。

本书首先介绍的是关于 HTTP 协议从 0.9 到 1.0, 再到 1.1 的变迁史。

关于 IPv4 和 IPv6

IP 报文的前四位表示协议版本,所以 0100 就是 4。版本 0 ~ 3 是留给实验用的,5 设计为 Intenet 流协议的,例如实时音视频,像 VoIP, 实际上也因为地址数量的限制没被使用。所以就跳到了 IPv6,字节为  0110。后续的 IP 协议版本 7, 8, 9 都被预定了(比如中国的 IPv9 - 冷),所以再有新的 IP 协议版本的放丈是 IPv10

下面是访问 curl http://google.com 时用 Wireshark 抓下来的数据包

ipv4-google-com-800x697.png

这是在 Linux 下访问 curl http://ipv6.google.com 时用命令 tcpdump 'tcp port 80' -w target.cap 抓下的包,然后在 Wireshark 中打开该 cap 文件

ipv6-google-com-1-800x550.png

HTTP(Hypertext Transfer Protocol) 最早设计用来传输带链接的超文本,后来 HTTP 不只用来传文本了,还传图片等任何类型的数据,但我们还是继续用 Hypertext 这个词。

OSI - Open Systems Interconnection

HTTP 是文本形式的协议 request-response

HTTP 0.9 只有 GET method, 没有 HTTP 头的概念,只是单行的命令,回车是可选的,被设计为请求完即关闭连接,只用来传送文本,它发布于 1991 年

$ telnet www.google.com 80   [或 nc www.google.com 80]
.....
GET /     [默认版本为 HTTP/0.9, 应该 GET / HTTP/1.1]

通过 telnet 发送的请求在 Wireshare 好像不能正常识别为 HTTP 请求。如果用 HTTP/1.0 或 HTTP/1.0, 在输入完命令

GET / HTTP/1.1 ⏎⏎

后必须两次回车才能发送出请求,大约第一个回车是产生空行,第二个回车送出请求

如果用 GET / HTTP/1.1 完成一个请求后连接不会被关闭(telnet 或 nc 不退出),可以继续发送其他的 HTTP 请求。因为 HTTP/1.1 可以重用连接,HTTP/1.0 都不行. GET / HTTP/1.1 是否会关闭连接可以用来验证 Web 服务端是否支持连接的重用, 在 Ubuntu 20.04 上 apt install apache2 默认安装的 Apache2 就不能重用连接, 可是它的 KeepAlive 是 On

 HTTP/1.0 作为 RFC 1945 发布于 1996 年 5 月,加入 HEAD 和 POST; GET / 未指定版本时默认仍为 HTTP/0.9; Request 和 Response 加入了头信息,如允许重定向,条件请求和错误状态; 引入了三位数字的状态码。有了头信息,利用 Content-type 就能支持更多的媒体类型。 

HTTP/1.0 因为有了头信息,所以请求需要一个额外的空行表示头信息结束,然后根据需要加上请求体

GET /page.html HTTP/1.0↩︎
Header1: Value1↩︎
Header1: Value2
# 或
GET /page.html HTTP/1.0↩︎
Header1: Value1, Value2↩︎

相同的 header 值可以分多行写或用逗号分隔写在同一行

HTTP/0.9 只有大概 700 个单词,而 HTTP/1.0 的 RFC 有近 20,000 个单词

HTTP/1.1 作为 HTTP/1.0 的增强,例如它让 HTTP 协议支持连接重用,强制的服务器头,支持缓存和响应分块(chunked encoding)。第一个 HTTP/1.1 标准发布于 1997 年 1 月, 距离 HTTP/1.0 的发布后仅 9 个月. 在 1999 年 6 月更新,并在 2014 年 6 月再一步增强,HTTP/1.1 的文档到了近 100,00 个单词。HTTP/1.1 不停的更新,每一次都会把前面的 RFC 作废弃掉,如 RFC2616 不断演进到了 RFC9110, RFC9111, 和 RFC9112

HTTP/1.1 目前被广泛应用, HTTP/1.0 进化到 HTTP/1.1 后每一次变化基本都是对头信息的增强。

在 HTTP/1.1 中 Host 头是强制的,在 HTTP/1.0 中是可选项。比如在一个主机上(192.168.0.1) 上根据域名的不同部署了多个 Web 服务时(虚拟机)

telnet 192.168.0.1 80
GET / HTTP/1.0

没有 Host 头时只能访问默认的 Web 服务,而通过 Host 头的,一个连接可访问多个 Web 服务

telnet 192.168.0.1 80
GET / HTTP/1.1
Host: aa.example.com↩︎↩︎

GET / HTTP/1.1
Host: bb.example.com↩︎↩︎

强制的 Host 头让一个服务器上部署多个虚拟机。实现了 HTTP/1.1 的 Web 服务为持与 HTTP/1.0 兼容,仍会处理不含  Host 头的请求。

Connection: Keep-Alive, 客户端请求服务器保持连接,允许后续请求重用访连接。现在 HTTP/1.1 重用连接已是默认行为,所以只要指定用 HTTP/1.1, 默认就会试图重用连接。如果客户端希望显式的关闭连接,发送一个 Connection: close 头就行。

用 telnet 可以试验重用连接的效果

telnet www.google.com 80
GET / HTTP/1.1↩︎↩︎       -- 如果 GET / HTTP/1.0↩︎ ↩︎  会立即关闭连接
..... 还能重用连接继续发送请求
GET / HTTP/1.0↩︎
Connection: Keep-Alive
..... 可能还能重用连接继续发送请求, 但对 www.google.com 的测试依旧会关闭连接
GET / HTTP/1.1↩︎
Connection: close↩︎↩︎
Connection closed by foreign host.      -- 连接关闭

HTTP 确定响应是否发送完成,在响应头中有 Content-Length 标明响应体的长度,当收到相应长度的响应体即能判定收到全部数据。

HTTP/1.1 虽然能重用连接,但重用连接只能顺序的一个个处理请求,pipelining 似乎能通过一个连接发送多个请求,响应中按相同的顺序取得响应,不过支持的客户端和服务器较少。

HTTP/1.1 的其他更新(除了新增的 HTTP  方法外,其作都是通过 Header   来增强的)

  1. 新增了 PUT, OPTIONS, CONNECT, TRACE, 和 DELETE
  2. Cache-Control 头,在 HTTP/1.0 中已有 Expires 头
  3. HTTP cookie 让 HTTP 变得有状态了
  4. 增加了字符集(charset)与语言(language) 的支持
  5. 支持代理和鉴权,新的状态码
  6. Trailer 头  -- 没用过

由于 HTTP 定义了许多标准的 header 名称,最初建议用 X- 前缀来定义自己的非标准 header 名称,但这种约定被 RFC6648 否决了。因为 X 常被理解为 eXperimentaleXtension. 建议只要选择一个非标准的头名称就行。

  1. Web Almanac - HTTP/2

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK