- 网页(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 主要用于以下三个方面:
- 会话状态管理:如用户登录状态、购物车、游戏分数或其他需要记录的信息
- 个性化设置:如用户自定义设置、主题和其他设置
- 浏览器行为跟踪:如跟踪分析用户行为等