HTTP 一些知识点的总结

322 阅读4分钟

三次握手和四次挥手

请求类型

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缓存

首先浏览器的缓存可以理解为在浏览器内部有一个小型的缓存数据库,某键对应某文件。

而页面在加载的时候,会根据要求把文件放入缓存,也会根据需求去读取使用,具体分为两种类型:

  • 强制缓存
  • 协商缓存

强制缓存

假设文件为强制缓存,流程如下:

  • 1:读取缓存数据库的数据,有数据进入下一步,无数据进入第3步。
  • 2:检查数据是否到期,到期进入下一步,未到期则使用。
  • 3:请求数据使用并缓存到本地缓存数据库中。

是否强制缓存根据请求 header 上的一个字段判断:

Cache-Control 字段控制,其可选值如下:

  • private:前端保存
  • public:前后端都保存
  • max-age:缓存的内容将在n秒后失效
  • no-store:有内容都不会缓存
  • no-cache:需要使用对比缓存来验证缓存数据

协商缓存

假设文件为协商缓存,流程如下:

  • 1:读取缓存数据库的数据,有数据进入下一步,无数据进入第3步。
  • 2:发送请求,确认数据是否修改,修改则进入下一步,未修改则使用。
  • 3:请求数据使用并缓存到本地缓存数据库中。

在文件的第一次请求时,文件会返回两个字段:

  • Etag:此资源在服务器上的一个id
  • Last-Modified:此资源的最后修改时间

用一句来形容就是:Etag资源在服务器上最后一次修改时间为Last-Modified

这两个字段会同文件一起存入缓存数据库中,当使用使用时取出这个两个字段的数据,发送一个检测请求, header 上会带上这两个字段,只不过字段名不同,为:

  • If-None-Match:此资源在服务器上的一个id
  • If-Modified-Since:此资源上次读取时的最后修改时间

用一句来形容就是:If-None-Match资源在上次读取时的修改时间为If-Modified-Since

服务器在收到这个检查请求后,会进行对比,若有更新,则返回200,若未更新,则返回304。