HTTP面试题

Mr.Song2020年8月7日
大约 4 分钟

浏览器输入url后经历的过程

1、首先,在浏览器地址栏中输入url

2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。

3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。

4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。

5、握手成功后,浏览器向服务器发送http请求,请求数据包。

6、服务器处理收到的请求,将数据返回至浏览器

7、浏览器收到HTTP响应

8、读取页面内容,浏览器渲染,解析html源码

9、生成Dom树、解析css样式、js交互

10、客户端和服务器交互

11、ajax查询

其中,步骤2的具体过程是:

浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。

HTTP的缓存机制

HTTP缓存可以分为强缓存与协商缓存

  • 强制缓存
    当缓存数据库中已经有所请求的数据时,客户端直接从缓存数据库中获取数据。
    当缓存数据库中没有要请求的数据时,客户端才会从服务端获取数据,并且服务器会将数据和缓存规则一起返回,缓存规则信息包含在响应头中。
    Expires: 将资源失效的日期告知客户端。Expires是HTTP1.0的产物,先都用Cache-Control代替。
    Cache-Control: 属性很多,用来控制缓存机制。 private:对指定客户端提供缓存
    public:任何客户端与代理服务器都可以缓存
    max-age:缓存内容在t秒之后失效
    no-cache: 需要使用协商缓存来验证缓存数据
    no-store: 所有资源都不缓存

  • 协商缓存
    客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务器端验证是否失效,如果没有失效服务器端会返回304,此时客户端就可以直接从缓存数据库中获取数据。如果标识失效了,服务器会返回更新后的数据。
    Last-Modified(服务器携带): 服务器在响应请求时,会告诉浏览器资源的最后修改时间
    if-Modified-Since(浏览器携带):浏览器再次请求服务器的时候,请求头包含此字段,后面跟着上一次获取资源的时间。(与上面Last-Modified相匹配)
    如果资源在这个时间之后更新过,则响应更新后的资源,返回200 OK ;
    如果资源在这个时间之后没有更新过,则响应一个header,返回304 Not Modified。
    if-UnModified-Since(浏览器携带): 与上面Last-Modified相匹配
    如果资源在这个字段值之后没有更新过,则请求服务器资源,返回 200 OK;
    如果资源在这个字段值之后更新了,则返回 412 Precondition failed(预处理错误)
    Etag(服务器携带): 服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识。服务器为每一份资源分配对应的ETag值,当资源更新时,ETag值也需要更新。
    If-None-Match(浏览器携带):如果If-None-Match与E-tag匹配,则代表内容未变,通知浏览器使用本地缓存。(与上面的Etag相匹配)
    如果同时带有E-tag和Last-Modified,服务端会优先检查E-tag

评论
Powered by Waline v2.6.2