Web

Web,或万维网(World Wide Web),是一个互联网应用。

它本质上是一个信息空间,在其中,文档和其他 Web 资源通过统一资源定位符(Uniform Resource Locator, URL)来标识,借助超文本链接(hypertext links)相互关联,并且可以通过互联网进行访问。

网页(web page):即文档,包括一个基础 HTML 文件与若干被 URL 标识的对象。

URL:

  • 协议(scheme):https
  • ://
  • 主机(host)域名或 IP:thisisxxz.com
  • 路径(path):/wiki/note-networks/web-http.html

HTTP/1.X

Web 的应用层协议是超文本传输协议(Hypertext Transfer Protocol, HTTP)。是用户-服务器模型。其中:

  • 用户程序:浏览器,HTTP 请求(request),获取并渲染 Web 资源
  • 服务器程序:Web 服务器,HTTP 响应(response),发送 Web 资源

HTTP 本身是无状态协议(stateless protocol),意味着在协议层面 HTTP 服务器不保存任何关于客户端的信息。HTTP 服务器始终运行,并且有固定的 IP 地址。

HTTP/1.0:非持久(non-persistent)连接。请求一个对象就要开一个 TCP 连接。
HTTP/1.1:持久(persistent)连接。多个对象甚至网页都能通过单条持久 TCP 连接传输。HTTP 服务器会在连接一段时间内未使用后将其关闭。

HTTP 请求消息:

  • 请求行(request line):GET, POST, HEAD, PUT, DELETE [path] [scheme]
  • 头(headers)
  • 请求体(entity body):给 POST,PUT 用于上传

HTTP 响应消息:

  • 状态行(status line):200 OK, 301 Moved Permanently, 400 Bad Request, 403 Forbidden, 404 Not Found, 500 Internal Server Error, 505 HTTP Version Not Supported
  • 头(headers)
  • 响应体:发送 Web 资源

Cookies

我们都爱魔法饼干!

Cookies 在无状态的 HTTP 上构建一个用户会话层(user session layer)。Cookie 首先在服务器端生成,存储在后端数据库里,并向用户端浏览器中 Set。用户端浏览器在 Cookie 文件中记录该 Cookie,在每次向服务器端发送请求时附上 Cookie 头。

  • HTTP 响应消息中的一行 Cookie 头 Set-cookie
  • HTTP 请求消息中的一行 Cookie 头 Cookie
  • 存放在用户端系统上,由浏览器管理的 Cookie 文件(主机名是键,Cookie 是值)
  • 服务器端的后端数据库(Cookie 是键,服务器状态等是值)

代理服务器

代理服务器(proxy server),又称 Web 缓存(Web caching)。

代理服务器是源 Web 服务器(origin Web server)的缓存,它有自己的磁盘存储,在其中保存最近请求过的对象副本,以更迅速的满足 HTTP 请求。客户端与代理服务器间通常存在高速连接。

代理服务器通常由 ISP 购买并部署。

内容分发网络(Content Delivery Network, CDN)是一套分布式的全球代理服务器网络。本站的所有图片资源均采用公共 CDN jsDelivr 进行加速!

conditional GET 是代理服务器确认其储存的对象副本是否过时的方式,通过在 GET 请求中加入 If-Modified-Since 的头实现。

HTTP/2.0

HTTP/1.1 单条持久 TCP 连接的问题:队头阻塞(Head of Line, HOL)。假设某网页包含一个 HTML 基础页面,一段大型视频片段,许多小对象;并且客户端与服务器间的路径上有一段低速瓶颈。位于队头的视频片段会占据单条 TCP 连接,阻塞其后的小对象,使得用户感知的时延(user-perceived delay)巨大,这就是 HOL。

此外,TCP 拥塞控制机制使共享同一瓶颈链路的每条 TCP 连接均分带宽份额,通过为传输单个 Web 页面打开多条 TCP 连接,浏览器可以「作弊」占用更大份额的链路带宽!

HTTP/2 的目标:消除,或至少是减少为传输单个 Web 页面所建立的并行 TCP 连接数量;同时缓解 HOL。

HTTP/2 的分帧子层(framing sub-layer)

  • 将每条 HTTP 响应拆分为多帧,并交错(interleaved)着通过单条持久化 TCP 连接发送出去(把「深度发送」变为「宽度发送」,减少用户感知时延)。
  • 拆帧后还会进行二进制编码,易于高效解析与错误恢复。
  • 帧到达客户端后在分帧子层重组为原始响应再交由浏览器处理。

HTTP/2 的消息优先级(message prioritization):客户端并发的向服务器发送请求时会附上权重;服务器按照该权重优先发送高优先级响应的各帧。

HTTP/2 的服务器推送(server push):服务器能够解析基础 HTML 文件,识别出所需的对象,并在客户端发起对这些对象的显示请求之前就向它推送。

HTTP/3.0

2022 年 7 月标准化。

QUIC,基于 UDP 的多工传输协议。