HTTP 请求流程
- 构建请求
- 查找缓存
- 准备 IP 地址和端口
- 等待 TCP 队列
- 建立 TCP 连接
- 发起 HTTP 请求
- 发送请求行
- 发送请求头
- 服务器处理请求
- 服务器返回请求行
- 服务器返回响应头
- 服务器返回响应体
- 断开 TCP 连接
浏览器缓存
强缓存
不会向服务器发送任何请求,直接从本地缓存中读取并且返回状态码:200 OK。
200 from memory cache:缓存在内存中,从内存中读取,浏览器关闭则丢失。
200 from disk cache:缓存在磁盘中,从磁盘中读取,浏览器关闭仍然存在。
优先级:memory cache > disk cache > network
协商缓存
向服务器发送请求,服务器根据这个请求头部中的一些参数判断是否命中协商缓存,如果命中,则返回 304 状态码,并带上新的响应头部通知浏览器从缓存中读取资源。
Last-Modifed/If-Modified-Since 和 Etag/If-None-Match 是分别成对出现的,呈一一对应关系。“/”之前的字段是在响应头中的,“/”之后的字段是请求头中的。当响应被缓存时,浏览器根据缓存中对应资源的的响应头中的 Etag 和 Last-Modifed 字段判断是否在请求头中附加 If-Modified-Since 和 If-None-Match 字段。
Etag:
Etag是属于HTTP 1.1属性,它是由服务器(Apache 或者其他工具)生成返回给前端,用来帮助服务器控制 Web 端的缓存验证。 Apache 中,Etag 的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
If-None-Match:
当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器请求时带上请求头 If-None-Match(值是 Etag 的值)。服务器收到请求进行比对,决定返回 200 或 304。
Last-Modified: 源服务器认为资源最后的修改时间
If-Modified-Since: 当资源过期时(浏览器判断 Cache-Control 标识的 max-age 过期),发现响应头具有 Last-Modified 声明,则再次向服务器请求时带上头 If-Modified-Since,表示请求时间。服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),若最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;若最后修改时间较旧(小),说明资源无新修改,响应HTTP 304 走缓存。
- Last-Modifed/If-Modified-Since 的时间精度是秒,而 Etag 可以更精确。
- Etag优先级是高于Last-Modifed 的,所以服务器会优先验证 Etag
- Last-Modifed/If-Modified-Since 是http1.0的头字段
DNS
HTTP 协议是基于 TCP/IP 的,建立 TCP 连接需要 IP 地址,对于用户而言代表网络资源的 URL 中提供的都是便于记忆的域名,所以就需要 DNS 将域名转换成 IP,浏览器提供 DNS 缓存。
最大连接数
同一个域名下最多拥有 6 个已建立的 TCP 连接。多出的请求会排队等待,直至有可用的连接。
请求行格式
HTTP 请求行
请求方法 | 请求URL | 协议版本 |
---|---|---|
GET | /library?search=news | HTTP/1.1 |
HTTP 响应行
协议版本 | 状态码 |
---|---|
HTTP/1.1 | 200 OK |