title: 常见状态码
categories: 计算机网络
tag:
- 计算机网络
date: 2021-12-14 10:05:34
状态码
HTTP 响应状态代码指示特定[HTTP](https://developer.mozilla.org/zh-cn/HTTP) 请求是否已成功完成。响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)。详情见MDN 官方文档
304 状态码详细
自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。
304 状态码不应该认为是一种错误,而是浏览器有缓存的情况下服务器的一种响应。
关于 304 状态码,就需要说一下当我们输入 URL 会发生什么了。(掘金:神三元)
首先会构建请求
查找强缓存
先检查强缓存,如果命中直接使用,否则进行下一步。DNS 解析
由于我们输入的是域名,而数据包是通过IP地址传给对方的。因此我们需要得到域名对应的IP地址。这个过程需要依赖一个服务系统,这个系统将域名和 IP 一一映射,我们将这个系统就叫做DNS(域名系统)。得到具体 IP 的过程就是DNS解析。
当然,值得注意的是,浏览器提供了DNS 数据缓存功能。即如果一个域名已经解析过,那会把解析的结果缓存下来,下次处理直接走缓存,不需要经过DNS解析。
另外,如果不指定端口的话,默认采用对应的 IP 的 80 端口。建立 TCP 连接
这里要提醒一点,Chrome 在同一个域名下要求同时最多只能有 6 个 TCP 连接,超过 6 个的话剩下的请求就得等待。发送 HTTP 请求
请求响应

强缓存
根据下图。从上图可以看到,当初次请求时,浏览器会向服务器发起请求,服务器接收到浏览器的请求后,返回资源并返回一个 Cache-Control 给客户端,该 Cache-Control 一般设置缓存的最大过期时间。max-age

此时浏览器已经接收到 cache-control 的值,那么这个时候浏览器再次发送请求时,它会先检查它的 cache-control 是否过期,如果没有过期则直接从本地缓存中拉取资源,返回到客户端,而无需再经过服务器。

如果缓存过期了的话。强制缓存有过期时间,那么就意味着总有一天缓存会失效。那么假设某一天,客户端的 cache-control 失效了,那么它就没办法从本地缓存中拉取资源。于是它会像第一张图一样,重新向服务器发起请求,之后服务器会再次返回资源和 cache-control 的值。

Cache-Control
Cache-Control 是什么?
- 存在于响应头 Response Headers 中;
- 控制强制缓存的逻辑;
- 例如:
Cache-Control: max-age = 31536000(单位是秒)。
Cache-Control 的值
| Cache-Control 值 | 含义 |
|---|---|
| max-age | 设置缓存的最大过期时间 |
| no-cache | 不用本地缓存,正常的向服务端请求,服务端怎么处理我们不用管 |
| no-store | 简单粗暴,直接从服务端拉取缓存 |
| private | 只能允许最终用户做缓存,最终用户即电脑、手机等等 |
| public | 允许中间路由或中间代理做缓存 |
关于 Expires
- 同在
Response Headers中 - 同为控制缓存的过期时间(早期使用)
- 如果
cache-control 与 expires同时存在的话,cache-control的优先级高于expires
协商缓存
协商缓存是什么?
- 协商缓存,也叫对比缓存。
- 它是一种服务端的缓存策略,即通过服务端来判断某件事情是不是可以被缓存。
- 服务端判断客户端的资源,是否和服务端资源一样,如果一致则返回
304,反之返回200和最新的资源。
图示说明:
首先,如果客户端是第一次向服务器发出请求,则服务器返回资源和相对应的资源标识给浏览器。该资源标识就是对当前所返回资源的一种唯一标识,可以是 Etag 或者是 Last-Modified,之后如果浏览器再次发送请求时,浏览器就会带上这个资源标识。此时,服务端就会通过这个资源标识,可以判断出浏览器的资源跟服务端此时的资源是否一致,如果一致,则返回 304,即表示 Not Found 资源未修改。如果判断结果为不一致,则返回 200,并返回资源以及新的资源标识。至此就结束了协商缓存的过程。

假如我们使用 Last-Modified

假设此时我们的协商缓存用 Last-Modified 来判断。当浏览器第一次发送请求时,服务器返回资源并返回一个 Last-Modified 的值给浏览器。这个 Last-Modified 的值给到浏览器之后,浏览器会通过 If-Modified-Since 的字段来保存 Last-Modified 的值,且 If-Modified-Since 保存在请求头当中。
之后当浏览器再次发送请求时,请求头会带着 If-Modified-Since 的值去找服务器,服务器此刻就会匹配浏览器发过来的 If-Modified-Since 是否和自己最后一次修改的 Last-Modified 的值相等。如果相等,则返回 304 ,表示资源未被修改;如果不相等,则返回 200,并返回资源和新的 Last-Modified 的值。
如果使用的是 ETag

假设此时我们的协商缓存用 Etag 来判断。当浏览器第一次发送请求时,服务器返回资源并返回一个 Etag 的值给浏览器。这个 Etag 的值给到浏览器之后,浏览器会通过 If-None-Match 的字段来保存 Etag 的值,且 If-None-Match 保存在请求头当中。
之后当浏览器再次发送请求时,请求头会带着 If-None-Match 的值去找服务器,服务器此刻就会匹配浏览器发过来的 If-None-Match 是否和自己最后一次修改的 Etag 的值相等。如果相等,则返回 304 ,表示资源未被修改;如果不相等,则返回 200 ,并返回资源和新的 Etag 的值。

ETag 是怎么加密的?
base64 是编码格式,不是加密算法!!!!!!
我们需要的 ETag 可以总结为以下三点
- 相同的文档应该总是返回相同的 ETag
- 文档中的任何变化导致的 ETag 改变
- ETag 的数据应该正好贴合 HTTP 头
根据需求,我们使用的我觉得应该是以下两种
MD5:MD5 其实是一种哈希算法,它实质上是对一段信息产生信息摘要,以防止信息被篡改。严格来说 MD5 不是一种加密算法而是一种摘要算法。无论是多长的字符串,MD5 都会输出长度为 128 字节的一个字符串,转换成 16 进制就是 32 个字符。
SHA-1: SHA-1 算法是和 MD5 一样流行的消息摘要算法,但是 SHA-1 比 MD5 的安全性更强。SHA-1 会产生一个 160 位的消息摘要,16 进制下就 40 位字符,因此 SHA1 是目前最安全的摘要算法
常见的加密算法
1、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在 21 世纪 AES 标准的一个实现是 Rijndael 算法;
2、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
3、3DES(Triple DES):是基于 DES 的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
4、RC2 和 RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
5、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
6、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法;
7、DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法;
8、MD5:严格来说不算加密算法,只能说是摘要算法。
两者对比
- 在
精准度上,ETag优于Last-Modified。优于 ETag 是按照内容给资源上标识,因此能准确感知资源的变化。而 Last-Modified 就不一样了,它在一些特殊的情况并不能准确感知资源变化,主要有两种情况:
- 编辑了资源文件,但是文件内容并没有更改,这样也会造成缓存失效。
- Last-Modified 能够感知的单位时间是秒,如果文件在 1 秒内改变了多次,那么这时候的 Last-Modified 并没有体现出修改了。
- 在性能上,
Last-Modified优于ETag,也很简单理解,Last-Modified仅仅只是记录一个时间点,而Etag需要根据文件的具体内容生成哈希值。
另外,如果两种方式都支持的话,服务器会优先考虑ETag。
