HTTP 一些知识点的总结
三次握手和四次挥手
请求类型
SYN :请求建立
ACK :请求确认
FIN :请求关闭
三次握手
- 1:客户端发送一个 SYN
- 2:服务端收到 SYN,返回一个 SYN 和 ACK
- 3:客户端返回一个 ACK,此时建立连接。
为什么三次?
我的理解是,防止客户端发送 SYN 后,过来很久时间服务端才收到,若此时客户端不再需要建立连接,服务端建立连接会导致资源的浪费,所以需要再次返回一个 SYN 和 ACK。
四次挥手
- 1:客户端发送 FIN
- 2:服务端收到 FIN,返回 ACK
- 3:服务端关闭连接后返回 FIN
- 4:客户端收到 FIN,返回 ACK
为什么 2、3 不一起返回?
我的理解是,当服务端收到 FIN 后,会关闭连接,但关闭是一个异步的操作,需要时间去关闭,这个时间不确定,如果花了很长时间才关闭,客户端就会等很久,但客户端其实不需要关心你那边有没有关闭,所以服务端会先返回一个 ACK,告诉客户端我知道了,正在关,客户端收到后可以去先执行其他事务,而服务端等到关闭后,再发送一个 FIN,此时客户端收到后,会返回一个 ACK 表示明白。
HTTP 状态码
100、200:状态
- 100:消息处理,继续请求
- 200:成功请求
300+ 资源更改
比如链接重定向、缓存已修改,常见为:
- 300:重定向多个链接,服务器根据用户请求来进行跳转
- 301:永久重定向
- 302:临时重定向
- 303:其他 URL 位置可以找到这个请求
- 304:文件未修改,可以继续使用(HTTP 缓存使用的),只返回 header 所以更快
400+ 请求错误
常见为:
- 400:无法理解的请求
- 401:请求页面需要账号和密码,也就是访问受限,和登陆接口 token 过期一样
- 403:页面请求被禁止
- 404:页面不存在
500+ 服务端错误
常见为:
- 500:服务器发生了一个不可预知的错误,通常就是没有进行错误处理,导致代码出现问题。。
- 501:服务器不支持所请求的功能
- 502:错误网关,服务器作为网关或代理,从上游服务器收到无效响应,比如这个请求的代码去请求了另一个 api,这个 api 挂掉了。
- 503:服务器暂时无法使用,超载或宕机。。
- 504:网关超时,服务器作为网关或代理,从上游服务器收到无效响应,比如这个请求的代码去请求了另一个 api,这个 api 超时了。
HTTP 的持续连接
- HTTP1.0:轮询请求,持续请求保持不断开,比较消耗资源
- HTTP1.1:在请求头带上 Connection: keep-alive,可以保持连接
HTTP 缓存
首先浏览器的缓存可以理解为在浏览器内部有一个小型的缓存数据库,某键对应某文件。
而页面在加载的时候,会根据要求把文件放入缓存,也会根据需求去读取使用,具体分为两种类型:
- 强制缓存
- 协商缓存
强制缓存
假设文件为强制缓存,流程如下:
- 1:读取缓存数据库的数据,有数据进入下一步,无数据进入第 3 步。
- 2:检查数据是否到期,到期进入下一步,未到期则使用。
- 3:请求数据使用并缓存到本地缓存数据库中。
是否强制缓存根据相应头上的一个字段判断,根据 HTTP 的版本不同,有不同为不同的字段:
HTTP1.0:Expires 字段代码其到期时间。
HTTP1.1:Cache-Control 字段控制,其可选值如下:
- private:前端保存
- public:前后端都保存
- max-age:缓存的内容将在 n 秒后失效
- no-store:有内容都不会缓存
- no-cache:需要使用对比缓存来验证缓存数据
协商缓存
假设文件为协商缓存,流程如下:
- 1:读取缓存数据库的数据,有数据进入下一步,无数据进入第 3 步。
- 2:发送请求,确认数据是否修改,修改则进入下一步,未修改则使用。
- 3:请求数据使用并缓存到本地缓存数据库中。
分开说一下 HTTP1.0 和 HTTP2.0 的区别。
HTTP1.0
在文件的第一次请求时,响应头会返回一个字段:Last-Modified,代表此资源的最后修改时间,浏览器保留此值。
在后面的请求中,请求头中会存在 If-Modified-Since 的字段,值为第一次的 Last-Modified 的值。
服务器以此进行比较,判断最后返回 200 或 304,若是 200 的话,取响应头的 Last-Modified 值更新本地保存的。
PS:这样比较的话,如果文件仅仅是 ctrl + s 一下,也会进行更新。
HTTP1.1
在文件的第一次请求时,响应头会返回一个字段:Etag,代表服务器以此资源而生成一个 id 标志,浏览器保留此值。
在后面的请求中,请求头中会存在 If-None-Match 的字段,值为第一次的 Etag 的值。
服务器以此进行比较,判断最后返回 200 或 304,若是 200 的话,取响应头的 Etag 值更新本地保存的。
PS:这样比较的话,文件内容不变是不会更新的。