• 网页(Web 页,或称文档)由许多对象组成。
  • 对象就是文件
  • 网页由单个基本 HTML 文件和若干个所引用的对象
  • 每个对象被一个 URL(统一资源定位符)寻址
  • HTTP 使用 TCP 协议
  • HTTP 服务器使用 80 端口
  • HTTP 是无状态协议(不维护客户先前的状态信息)

非持久 HTTP 连接

  • 每个 TCP 连接上只传送一个对象
  • 每个对象总共需要 2 个 RTT+transmit time
    • 一个 RTT: 建立连接,
    • 另一个 RTT:HTTP 请求和响应的交互信息
  • 操作系统必须为每个 TCP 连接分配主机资源
  • 大量客户的并发 TCP 连接形成服务器的严重负担
  • HTTP/1.0 使用非持久 HTTP 连接

持久 HTTP 连接

  • 一个 TCP 连接上可以传送多个对象
  • 服务器发送响应消息后保持连接
  • 同一 TCP 连接上会话的后续 HTTP
  • 消息继续在该连接上传送
  • HTTP/1.1 默认使用持久 HTTP 连接

响应时间模型(RTT)

定义往返时间 RTT:一个分组从 C 到 S 再到 C 所花费的时间

非持久 HTTP 连接:每个对象需要两个 RTT,大量并发 TCP 会造成服务器的严重负担

持久 HTTP 连接:分为不带流水线的持久 HTTP 连接带流水线的持久 HTTP 连接

不带流水线:

  • 客户先前响应消息收到,才发出新的请求消息
  • 每个引用对象经历 1 个 RTT

带流水线:

  • 客户遇到 1 个引用对象就发送请求消息
  • 所有引用对象只经历 1 个 RTT
  • HTTP/1.1 默认使用

报文格式

  • 请求行
  • 头部
    • 响应报文中的 Date 是报文响应时间
    • Last-Modified 才是对象创建或最后修改时间。
  • 回车换行表示结束
  • 数据(响应)
    • HTTP 响应报文可以为空

请求方法

HTTP/1.0

  • GET
  • POST
  • HEAD
    • 服务器收到请求时,用 HTTP 报文进行响应,但不返回请求对象

HTTP/1.1

  • GET, POST, HEAD
  • PUT
    • 文件在实体主体中被上载到 URL 字段指定的路径
  • DELETE
    • 删除 URL 指定字段的文件

状态相应码

2 开头都是成功,3 开头有特定功能,4 以上就是各种错误了

  • 200 OK
    • 请求成功, 所请求信息在响应消息中返回
  • 301 Moved Permanently (永久重定向)
    • 所请求的对象已永久迁移, 新的 URL 在本响应消息的(location:)头部指出
  • 400 Bad Request
    • 该请求不能被服务器解读
  • 404 Not Found
    • 服务器上不存在所请求文档
  • 505 HTTP Version Not Supported

Web 缓存

有两种不同类型的缓存:私有缓存共享缓存

私有缓存

和客户端绑定,一般是浏览器缓存

Cache-Control: private

共享缓存

共享缓存位于客户端和服务器之间,可以存储能在用户之间共享的响应。共享缓存可以进一步细分为代理缓存托管缓存

代理缓存

这通常不由服务开发人员管理,因此必须由恰当的 HTTP 标头等控制。

托管缓存

托管缓存由服务开发人员明确部署,以降低源服务器负载并有效地交付内容。示例包括反向代理、CDN 和 service worker 与缓存 API 的组合。

Cache-Control: no-store

启发式缓存

HTTP 旨在尽可能多地缓存,因此即使没有给出 Cache-Control,如果满足某些条件,响应也会被存储和重用。这称为启发式缓存

例如,采取以下响应。此回复最后一次更新是在 1 年前。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2021 22:22:22 GMT
 
<!doctype html>

试探性地知道,整整一年没有更新的内容在那之后的一段时间内不会更新。因此,客户端存储此响应(尽管缺少 max-age)并重用它一段时间。复用多长时间取决于实现,但规范建议存储后大约 10%(在本例中为 0.1 年)的时间。

启发式缓存是在 Cache-Control 被广泛采用之前出现的一种解决方法,基本上所有响应都应明确指定 Cache-Control 标头。

验证响应

过时的响应不会立即被丢弃。HTTP 有一种机制,可以通过询问源服务器将陈旧的响应转换为新的响应。这称为验证,有时也称为重新验证

验证是通过使用包含 If-Modified-Since 或 If-None-Match 请求标头的条件请求完成的。

If-Modified-Since

以下响应在 22:22:22 生成,max-age 为 1 小时,因此你知道它在 23:22:22 之前是有效的。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2022 22:00:00 GMT
Cache-Control: max-age=3600
 
<!doctype html>

到 23:22:22 时,响应会过时并且不能重用缓存。因此,下面的请求显示客户端发送带有 If-Modified-Since 请求标头的请求,以询问服务器自指定时间以来是否有任何的改变。

GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-Modified-Since: Tue, 22 Feb 2022 22:00:00 GMT

如果内容自指定时间以来没有更改,服务器将响应 304 Not Modified

由于此响应仅表示“没有变化”,因此没有响应主体——只有一个状态码——因此传输大小非常小。

HTTP/1.1 304 Not Modified
Content-Type: text/html
Date: Tue, 22 Feb 2022 23:22:22 GMT
Last-Modified: Tue, 22 Feb 2022 22:00:00 GMT
Cache-Control: max-age=3600

收到该响应后,客户端将存储的过期响应恢复为有效的,并可以在剩余的 1 小时内重复使用它。

Cookie

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态。

Cookie 主要用于以下三个方面:

  • 会话状态管理:如用户登录状态、购物车、游戏分数或其他需要记录的信息
  • 个性化设置:如用户自定义设置、主题和其他设置
  • 浏览器行为跟踪:如跟踪分析用户行为等