vlambda博客
学习文章列表

HTTP协议常见面试题二【干货】

当精力有限时,想一下眼下自己最看重什么,有选择性的取舍,将宝贵的时间投入到产出比最大的事情上。

根据计划,第一章节介绍【软件测试理论】部分,目前已输出十篇文章:








下面开始我的第十一篇文章,分享【HTTP协议常见面试题二】(接着上一篇继续)。

六、缓存

  1. 强缓存
    1. 通过设置Expires和Cache-Control实现。强缓存表示在缓存期间不需要发起请求,状态码为200

    2. Expires是HTTP/1的产物,值为缓存的过期时间

    3. Cache-control出现于HTTP/1.1,优先级比Expires高

    4. Expires指定一个绝对的过期时间(GMT格式),这么做会导致至少2个

      1. 客户端和服务器时间不同步导致Expires的配置出现问题

      2. 很容易在配置后忘记具体的过期时间,导致过期来临出现浪涌现象

    5. max-age 指定的是从文档被访问后的存活时间,这个时间是个相对值(比如:3600s),相对的是文档第一次被请求时服务器记录的Request_time(请求时间)

    6. Expires指定的时间可以是相对文件的最后访问时间(Atime)或者修改时间(MTime),而max-age相对对的是文档的请求时间(Atime)

    7. 在Apache中,max-age是根据Expires的时间来计算出来的max-age = expires- request_time:(mod_expires.c)

  2. 协商缓存
    1. 通过设置Last-Modified和ETag实现。如果缓存过期了,就需要发起请求验证资源是否有更新。如果发起请求验证资源没有改变,返回状态304,并且更新浏览器缓存的有效期。

    2. Last-Modified和If-Modified-Since:Last-Modified表示本地文件最后修改日期,If-Modified-Since会将Last-Modified的值发送给服务器,询问该日期之后的资源是否有更新,有就将新资源发送来,没有返回304状态码。

    3. ETag和If-None-Match:ETag出现于HTTP/1.1,他的优先级比Last-Modified高。ETag类似于文件的指纹,If-None-Match会将ETag发送给服务器,询问该ETag是否变动,有变动的话就将获取新的资源。

    4. Last-Modified 的问题在于它的精度在秒(s)的级别,比较适合不太敏感的静态资源。

    5. Nginx 官方默认的 ETag 计算方式是为"文件最后修改时间16进制-文件长度16进制"。

    6. Express 框架使用了 serve-static 中间件来配置缓存方案,使用了一个叫 etag 的 npm 包来实现 etag 计算

      1. 使用文件大小和修改时间

      2. 使用文件内容的hash值和内容长度

  3. F5与Ctrl+F5的区别
    1. F5:跳过强缓存,但会检查协商缓存

    2. Ctrl+F5:直接从服务器加载,跳过强缓存和协商缓存

  4. Cache-Control
    1. 如果我们给我们的cache-control设置了no-cache以后,每次浏览器发起设置了cache-control资源请求的时候,都会到服务器端进行资源的验证,验证完了以后,如果确定这个资源可以使用缓存,才会读取本地的缓存。

    2. no-store 完全不使用缓存


七、安全

  1. XSS:攻击者通过页面注入可执行的代码的攻击方式,防御方法:
    1. 将用户输入的内容,进行转义,过滤标签和标签属性

    2. 使用CSP告诉浏览器限制外部资源可以加载和执行,开启CSP有两种方式:

      1. 设置HTTP-Header中的Content-sesurity-Policy

      2. 设置标签的方式

  2. CSRF:跨站请求伪造,如获取cookie伪造用户登陆状态,防御方法:
    1. 设置cookie的SameSite

    2. 验证Referer

    3. 登陆后服务器下发一个随机token,之后的请求带上


八、三次握手


三次是最小的安全次数,为了让客户端和服务端都能确定彼此发起和响应的能力是否靠谱
  1. 客户端发送SYN包

  2. 服务端接收到SYN包之后将SYN+ACK包发送给客户端

  3. 客户端接收到SYN+ACK包之后,向服务器发送确认包ACK

  4. 服务端接收到之后连接成功,开始传输数据


九、四次挥手

关闭连接是双向的,客户端和服务器都可以提出,四次挥手是为了不让关闭太仓促,保证可靠性
  1. 客户端发送一个FIN,用来关闭客户到服务器的数据传送。

  2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。

  3. 服务器关闭客户端的连接,发送一个FIN给客户端。

  4. 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。