http面试相关知识点

http服务过程:

在web浏览器中输出网址,具体会发生什么?

1、 对网址进行DNS域名解析,获取相应的ip地址
2、 根据ip地址,找到相应服务器,发起TCP的三次握手。
3、 建立TCP连接后,发起http请求。
4、服务器响应http请求, 浏览器获取html代码
5、浏览器解析html代码,并请求html中的资源
6、浏览器渲染页面
7、服务器关闭tcp请求


DNS域名解析:

DNS域名解析

1、 首先搜索浏览器自身的DNS缓存。
2、 如果浏览器自身缓存中没有找到,那么浏览器就会搜索系统自身的DNS缓存
3、 如果还没找到,尝试从hosts文件中去查找
4、前面三个过程都没有找到的情况下、就递归去域名服务器中查找


TCP的三次握手和四次挥手:

TCP的三次握手

1、TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

2、TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文。

3、 TCP服务器收到请求报文后,如果同意连接,则发出确认报文。

4、TCP客户进程收到确认后,还要向服务器给出确认。

5、当服务器收到客户端的确认后也进入ESTABLISHED(已确认)状态,此后双方就可以开始通信了。

TCP的四次挥手

1、客户端进程发出连接释放报文,并且停止发送数据。

2、 服务器收到连接释放报文,发出确认报文。

3、 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文。

4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文。

5、客户端收到服务器的连接释放报文后,必须发出确认。

6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。


http缓存控制

web 缓存大致分为 数据库缓存、服务端缓存(代理服务器缓存、CDN缓存)、浏览器缓存。

浏览器缓存也包括很多内容:HTTP缓存、indexDB、cookie、localstorage等等。这里我们只讨论Http缓存相关内容。

在具体了解HTTP 缓存相关内容之前先来明确几个术语:
缓存命中率:从缓存中得到数据的请求数与所有请求数的比率。理想状态是越高越好。
过期内容:超过设置的有效时间,被标记为“陈旧”的内容。通常过期内容不能用于回复客户端的请求,必须重新向源服务器请求新的内容或验证缓存的内容是否仍然有效。
验证:验证缓存中的过期内容是否仍然有效,验证通过的话刷新过期时间。
失效:失效就是吧内容从缓存中移除。当内容发生改变时就必须移除失效的内容。

一、http缓存作用范围?

浏览器第一次请求流程

在这里插入图片描述

浏览器第二次请求流程

在这里插入图片描述

二、http缓存分类

http缓存分为强缓存和协商缓存,浏览器加载一个页面的简单流程如下:

1、浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加载缓存中的资源,并不会将请求发送到服务器

2、如果未命中强缓存,则浏览器会将资源加载请求发送到浏览器。服务器来判断短浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。

3、如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。

强缓存

简单理解就是,浏览器不用发送请求到服务器,就能拿到缓存文件。命中强缓存时,在chrome的开发者工具中可以看到http的返回码是200,在Size列会显示为(from cache)
强缓存时利用http的返回中的Expires或者Cache- Control两个字段来控制的,用来表示自愿的缓存时间。

Expires
缓存过期时间,用来指定组员到期的时间,是服务器端的具体的时间点,也就是说,Expires = max- age + 请求时间,需要和Last-modified结合使用。但在上面我们提到过,cache-conrorl的优先级更高。Expires是wen服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
在这里插入图片描述
该字段会返回一个事件,这个时间代表着这个资源的失效时间。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当客户端本地时间被修改后,服务器与客户端时间偏差变大,会导致缓存混乱。于是发展出了cache-control。

Cache-Control

Cache-Control是一个相对时间,例如Cache-Control:3600,代表资源的有效时间是3600秒。由于是相对时间,并且都与客户端时间比较,所以服务器与客户端时间偏差也不会导致问题。

Cache-Control与Expires可以在服务端配置同时启用或者启用任意一个,同时启用的时候Cache-Control优先级高。

Cache-Control可以由多个字段组合而成,主要有一下几个取值:

1.max-age 指定一个时间长度,在这个时间段内缓存是有效的,单位是s 。 例如设置Cache-Control:max-age=31536000,也就是说缓存有效期为(31536000/24/60*60)天,第一次访问这个资源的时候,服务器端也返回了Expires字段,并且过期时间是一年后。
在这里插入图片描述
2.s-maxage同max-age,覆盖max-age、Expires,但仅适用于共享缓存,在私有缓存中被忽略。
3.public表示响应可以被任何对象(发送请求的客户端、代理服务器等等)缓存。
4.private表示响应只能被单个用户(可能是操作系统用户、浏览器用户)缓存,是非共享的,不能被代理服务器缓存。
5.no-cache 强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。
6.no-store禁止缓存,每次请求都要想服务器重新获取数据。
7.must-revalidate指定如果页面时过期的,则去服务器进行获取。这个指令并不常用,就不做过多的讨论。

协商缓存

若未命中强缓存,则浏览器会将请求发送至服务器。服务器根据http头信息中的Last-Mondify、If-Modify-Since或者Etag/If-None-Match来判断是否命中协商缓存。如果命中,则http返回码为304,浏览器从缓存中加载资源。

Last-Mondify/If-Mondify-Since
浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间。

当浏览器再次请求该资源时,发送请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。

如果命中缓存,则返回http304,并且不会返回资源内容,不会返回Last-Mindufy。由于对比的服务端时间,所以客户端与服务端时间差距不会导致问题。但是有时候通过最后修改时间来判断资源是否修改还是不太准确。于是出现了ETag/If-None-Match

ETag/If-None-Match

与Last-Mondify/If-Modify-Since不同的是,Etag/If-None-Mactch返回的是一个校验码。ETag可以保证每一个资源时唯一的,资源变化都会导致ETag变化。ETag值得变更则说明资源状态已经被修改。服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存。

总结

http缓存控制

1.http缓存能够帮助服务器提高并发性能,很多资源不需要重复请求直接从浏览器中拿缓存。
2.http缓存分类:强缓存 协商缓存
3.强缓存通过expires和cache-control控制;协商缓存通过last-modify和Etag控制
4.为什么有expires又需要cache-control?
因为expires有个服务器和浏览器时间不同步的问题
expires是绝对时间 cache-control是相对时间
5.last-modify和Etag
last-modify 它是有个精度问题,精确到秒。
e-tag 眉头精度问题 是要文件改变 e-tag值就改变。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值