HTTP

HTTP 使用可靠的传输协议,确保在传输过程中不会发生混乱和损坏。它不关心数据传输的具体细节,将联网的细节都交给了通用可靠的 TCP/IP。

TCP

TCP 提供:

  • 无差错的数据传输

  • 按序传输(数据会按顺序到达)

  • 未分段的数据流(可以在任意时刻以任意尺寸将数据传输出去)

URL

URL 告诉你一个资源的位置,以及如何与它交互。它可以通过其他协议来访问因特网上的任意资源。这种访问资源的手段简化了信息访问的过程。

URL 的通用格式:://:@:/path;?#

http://www.hustwenhua.net/ 包括三部分。

第一部分(http)是 URL 方案,告知web客户端如何访问资源(使用HTTP协议)。

第二部分(www.hustwenhua.net)是指服务器位置,告知 web 客户端位于何处。

第三部分(/)是资源路径,说明请求的是哪个资源。

HTTP 报文

常用的 HTTP 方法

方法 描述 是否包含主体
GET 从服务器获取一份文档
HEAD 只从服务器获得文档的首部
POST 向服务器发送需要处理的数据
PUT 将请求的主体部分储存在服务器上
TRACE 对可能经过代理服务器传送到服务器上的报文进行追踪
OPTIONS 决定可以在服务器上执行哪些方法
DELETE 从服务器上删除一份文档

常用状态码

整体范围 已定义范围 分类
100~199 100~101 信息成功
200~299 200~206 成功
300~399 300~305 重定向
400~199 400~415 客户端错误
500~599 500~505 服务器错误

报文的语法包括

  • 方法

  • 请求URL

  • 版本

  • 状态码

  • 原因短语

  • 首部

  • 实体主体部分

HTTP Head

Request Header

HTTP 权威指南读书笔记(一)🚧 - 图1

Response Header

HTTP 权威指南读书笔记(一)🚧 - 图2

连接管理

TCP 连接

输入一个 URL 后的执行过程

  1. 浏览器解析出主机地址

  2. 浏览器查询主机IP地址(DNS)

  3. 浏览器获得端口号(80)

  4. 浏览器发起到202.43.78.3端口80的连接

  5. 浏览器向服务器发送一条 HTTP GET 报文

  6. 浏览器从服务器读取 HTTP 响应报文

  7. 浏览器关闭连接

  • TCP 为 HTTP 提供一条可靠的比特传输管道,TCP 会按顺序无差别的承担 HTTP 数据

  • TCP 流是分段的由 IP 分组传输

HTTP 性能的考虑

HTTP 事务的时延

  1. DNS 解析

  2. 建立新的 TCP 连接

  3. 传输报文和处理报文

  4. Web 服务器返回 HTTP 响应

常见的 TCP 时延

  1. TCP 连接建立握手

  2. TCP 慢启动拥塞控制

  3. 数据聚集的 Nagle 算法

  4. 用于捎带确认的 TCP 延时确认算法

  5. TIME_WAIT 时延和端口耗尽

代理

私有代理和共享代理

单个客户端专有的代理称为私有代理,多个客户端共享的代理称为公共代理。

为什么使用代理

  • 过滤器
  • 文档访问控制
  • Web 缓存
  • 反向代理
  • 内容路由器
  • 转码器
  • 匿名者

代理 URI 与 服务器 URI 的不同

  • 没有设置客户端使用代理时,它会发送部分 URI 来解决这个问题。
  • 设置客户端使用代理时,它会发送完整 URI。

通用代理服务器既能处理代理请求,也能处理服务器请求。它既支持部分 URI,又支持完整 URI。

缓存

缓存无法保存所有的文档副本。已有的副本为这些到达缓存的请求提供服务被称为缓存命中。这些缓存的请求没有副本可用,而被转发给原始服务器,这被称为缓存未命中。

网状缓存

  • 根据 URL 在父缓存或者原始服务器之间进行动态选择。
  • 根据 URL 动态地选择一个特定的父缓存。
  • 前往父缓存之前,在本地缓存中搜索已缓存的副本。
  • 允许其他缓存对其进行缓存的部分内容进行访问,但不允许因特网通过它们的缓存。

缓存的处理步骤

  • 接收:缓存从网络中读取抵达的报文。
  • 解析:对报文进行解析,提取出 URL 和各种首部。
  • 查询:查看是否有缓存副本可用,如果没有,就获取一份·副本。
  • 新鲜度检测:缓存查看已缓存的副本是否新鲜,如果不是,就询问服务器是否有任何更新。
  • 创建响应:用新的首部和已缓存的主体来创建一个响应报文。
  • 发送:缓存通过网络将响应发回给客户端。
  • 日志:创建一个日志文件条目来描述这个事务。

保持副本的新鲜

文档过期

通过特殊的 HTTP 首部 Cache-Control 首部和 Expires 首部,HTTP 让原始服务器向每一个文档附加了一个“缓存日期”。当文档过期时必须与服务器验证文档是否更新,以获得一个新鲜的副本。

使用日期和试用期

Cache-Control:max-age 定义了文档的最大使用期—从文档生成到文档不再新鲜、无法使用为止,最大的合法生存时间(以秒为单位)。
Expires:指定过期日期,如果日期已经过了,说明文档不再新鲜了。

服务再验证

文档到期并不意味着它与服务器活跃状态的文档有区别,只是意味着进行核对的时间了。这种情况被称为“服务器再验证”。如果文档更新,获取新的文件发送给客户端。没有变化,缓存只需要获取新的首部,包括一个新的过期时间,并对缓存的首部更新即可。

用条件方法进行再验证

If-Modified-Since:如果从指定日期之后文档被修改,就执行请求的方法。可以与 Last-Modified 服务器响应头部配合使用,只有在内容被修改之后与已缓存版本有所不同的时候才获取内容。

If-None-Match:服务器可以为文档提供特殊的标签,而不是将其与最近修改日期相匹配,这些标签就像序列号一样。如果标签与服务器文档中标签有所不同。If-None-Match 首部会执行所请求的方法。

强弱验证器

不管相关的实体以何种方式发生变化,强实体标签都要发生变化。而相关实体标签发生了比较重要的变化时,弱实体标签才会发生变化。

控制缓存能力

no-Cache 与 on-Store 相应首部

防止缓存提供未经验证的对象。

max-age 相应首部

参考

【1】HTTP 权威指南 人民邮电出版社