前端开发也要知道的 DNS

  • DNS是什么
  • DNS的解析过程
  • 本地DNS服务器配置
  • DNS的缓存策略分析
    • 浏览器缓存dns策略
      • chrome浏览器
        • 缓存时间
        • 缓存清理
      • firefox浏览器
        • 缓存时间
        • 缓存清理
      • ie浏览器
        • 缓存时间
        • 缓存清理
    • host文件缓存
      • 缓存时间
      • 缓存查看
      • 缓存清理
    • 本地缓存
      • 缓存查看
      • 缓存时间
      • 缓存清理
  • DNS一对多情况下的浏览器的处理
    • 测试前置工作
      • 测试一、每个浏览器解析一个新域名
      • 测试二、浏览器的DNS选择
  • 总结

DNS是什么

关于这个,网上的说明非常多。通俗一点。DNS其实就是一个电话本翻译系统,用来把域名解析成对应的IP地址;


对于前端来说,DNS就是从浏览器输入域名后,浏览器与DNS服务器交互,最终浏览器向DNS解析返回的IP地址建立TCP连接的过程;

DNS的解析过程

这里网络教程也非常多。这里一张图说明。总结一下:

从输入域名到返回结果,经历的每一步,都可能有缓存。如果有缓存,就不会进行下一步,直到达到全球只有13台的跟域名服务器;

大部分开发能接触到的,只有到本地DNS服务器这一层。针对前端开发来说,也只需要了解到这一层即可。本篇幅重点讨论这几个流程间的交互;

本地DNS服务器配置

使用window Server可以轻易的配置本地DNS服务器。如果你想自己动手试试,可以参考这里

DNS的缓存策略分析

浏览器缓存dns策略

为了测试各个浏览器的DNS缓存,通过如下方式实现;

  • 1、dns服务器添加一个新域名
  • 2、本地浏览器访问域名
  • 3、清除本地缓存(后续会说明如何清除)
  • 4、继续访问该域名,查看什么时候不能访问

chrome浏览器

版本 :100.0.4896.88

缓存时间
项目 缓存时间
关闭浏览器后立即打开 20分钟+
在页面f5刷新 20分钟+
在页面ctrl+f5(强制)刷新 20分钟+
新开标签页复制地址enter 20分钟+
缓存清理

网上的方案如下:

在地址栏输入以下地址回车,点击 Clear host cache 即可:

chrome://net-internals/#dns

然而20分钟过去了。浏览器依旧能够访问删除的DNS地址;

于是我加上了 ctrl+shift+delete,删除浏览器缓存,才恢复了正常;

firefox浏览器

版本:99.0.1

缓存时间
项目 缓存时间
关闭浏览器后立即打开 0
在页面f5刷新 10分钟
在页面ctrl+f5(强制)刷新 0
新开标签页复制地址enter 10分钟
缓存清理

方案如下:

Firefox 之前有几个扩展非常方便,可惜都已经下线了 (SYSIN):dns-flusher、clear-dns-cache
现在实现方法如下:
在地址栏输入:about:config,回车,“接受风险并继续”,然后搜索 f,出现如下 3 项:

  • network.dnsCacheEntries 400
  • network.dnsCacheExpiration 60
  • network.dnsCacheExpirationGracePeriod 60
    将数值都修改为 0 即可。

注意:

修改后为禁用 DNS 缓存 (SYSIN)。
该操作对网络浏览体验可能有一定影响,仅用于调试。
如果有新的扩展出现,使用扩展更佳。

补充:修改上述数组实测浏览器缓存DNS策略不变;

ie浏览器

缓存时间
项目 缓存时间
关闭浏览器后立即打开 0
在页面f5刷新 20分钟+
在页面ctrl+f5(强制)刷新 20分钟+
新开标签页复制地址enter 0
缓存清理

需要写注册表。参见 https://www.muzijie.com/a1/v09l1m70.html。我没有尝试过

host文件缓存

在操作系统缓存中,包含了host文件的读取。即,如果你的host文件配置了域名,那么匹配上之后,永远不会进行下一步查询(优先级最高);

host文件配置地址:C:\Windows\System32\drivers\etc

配置方式文件内已经给了说明:

# localhost name resolution is handled within DNS itself.
100.100.100.1 console.demo.com

缓存时间

永久(配置后永久生效)

缓存查看

本地host文件

缓存清理

删除对应映射即可。

本地缓存

缓存查看

ipconfig /displaydns

建议通过 查看

ipconfig /displaydns > C:\Users\dnscache.txt

缓存时间

在测试DNS服务器上创建一个新的域名 指向 200.xx.xx.131,发现默认缓存时间是1h(通过不断打印缓存查看)

但是,这个时间受到各种因素影响;例如当我实测禁用/启用本地网卡时,缓存会被重新更新(猜测应该是重新轮询了本地DNS服务器);

缓存清理

通过如下指令可以强制清除本地DNS缓存

ipconfig /flushdns

可以发现清理后,使用缓存查看指令,只能看到如下一些记录:


这部分就是host文件记录的优先级最高的DNS记录了!所以对于host文件记录的内容,不会受缓存刷新影响,也应证了host文件的最高优先级

host文件:

DNS一对多情况下的浏览器的处理

DNS可以实现一对多。即一个域名对应多个IP。这种情况对于网站保活容灾具有相当的应用价值;
例如我同一个域名,常备4台服务器。常态只有一台服务器活着,其他ip无法ping通。此时dns解析就会优先选择能通的服务器Ip作为解析结果;

但是如果4个ip都通,那么浏览器解析规则是什么呢?接下来我们进行测试;

测试前置工作

为了避免浏览器缓存和本地缓存的影响,我们每次测试使用一个新的域名;每个域名均对应2个不同的ip地址(2个ip均可访问,是相同的产品,部署在不同服务器);

测试一、每个浏览器解析一个新域名

5个域名解析结果(IPA 记为 A ,IPB记为B);

是否受本地缓存影响 指不清除操作系统本地缓存下,纯粹通过刷新浏览器,清除DNS缓存,清除缓存等方式,使IP解析结果发生变化;

浏览器 首次打开解析地址(5次) 改变解析地址需要努力 是否受本地缓存影响 解析改变后是否改变本地缓存
Firefix A B B A B 折腾5分钟
IE B B A A B 15分钟无果
chrome A A A B B 15分钟无果
edge B B A A B 15分钟无果

结论

  • 当域名对应多个IP时,浏览器每次随机解析,几乎50%;
  • 浏览器存在缓存,一旦缓存解析结果,则解析地址不受系统本地缓存影响,且较难改变;

另外在测试过程中发现一点规律:

每次新开一个浏览器解析一个新的域名,windows本地缓存都会发生变化。且解析域名的排列顺序,总是浏览器实际解析出来的域名排在第一个,结合上述数据,证明本地缓存是每次重新解析DNS(向DNS服务器发起请求)后生成的。解析完成后顺便把第一个地址给浏览器;

如下图,108 IP总是新的浏览器解析的ip地址。

测试二、浏览器的DNS选择

浏览器解析域名是否会根据根据服务器的状态选择性使用某台服务器?答案是会的:

验证:新开一个域名对应2个IP地址(ip1,ip1),测试浏览器端访问结果。如果访问到ip1的服务器,则将ip1服务器nginx容器kill掉,亲测浏览器会解析到ip2;

如下图:

由于客户端先前DNS解析到131,故kill掉131后,刷新浏览器,在与131服务器建链失败后(推测是收到了[RST ACK]头),尝试与80(正常服务器)进行通讯,建立client hello;

但是经过我的这篇文章的验证。在一对多域名解析情况下,浏览器进行轮询遍历,此时浏览器只能够识别服务器最基本的端口状态,如果端口完全不存在,才会进行下一个IP的尝试,直到找到一个成功的ip并进行解析;

总结

DNS解析流程在浏览器和客户端层面都有涉及。作为前端开发应该了解其基本原理和缓存机制,方便后续定位解决问题。

2022.6.3日:打个广告,苏州华为终端BG面向社会招聘人才,Java /C C++ / Python / Javascript 。有兴趣来苏州的同学们 可以加我V 15850277051 ,有问必答!

前端开发也要知道的 DNS相关推荐

  1. C#开发人员应该知道的13件事情

    C#开发人员应该知道的13件事情 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问 ...

  2. Java开发人员应该知道的5大Spring Boot功能

    您可能已经听说过Spring Boot,这是用不到140个字符创建一个Spring Web应用程序的神奇力量,可以在一条推文中编写这些字符,但这到底意味着什么? 哪些功能可以使Spring Boot具 ...

  3. 主干开发前要知道的,4错误认识+3优势

    摘要:在这里聊一聊主干开发你需要知道的7件事. 现在各大公司流行主干开发,什么是主干开发,什么是分支开发.具体定义.流程是啥,这里不做知识普及,想要了解的童鞋到网上去搜一搜,再来读本文.作者本人经历过 ...

  4. C# Development 13 Things Every C# Developer Should Know--C#开发人员应该知道的13件事情

    原文链接:https://dzone.com/refcardz/csharp 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方 ...

  5. php开发手册要看完吗,9个开发人员应该知道的PHP库

    9个开发人员应该知道的PHP库大多都是国外的资源,不过有了这些PHP库的支持,大家今后进行开发一定能加快速度,不会进行简单的重复劳动. 1. ReCAPTCHA The reCAPTCHA 库让你可以 ...

  6. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  7. 前端,你要知道的SEO知识

    大家好,我是若川.三天假期总是那么短暂,明天就要上班了.今天推荐一篇相对简单的文章. 点击下方卡片关注我.加个星标 之前有同学在前端技术分享时提到了SEO,另一同学问我SEO是什么,我当时非常诧异,作 ...

  8. WMS开发前要知道的10大关键点

    导语 大家好,我是智能仓储物流技术研习社的社长,你的老朋友,老K. 知识星球 * 原创电子书 * 深海社区 * 微信群 现代供应链需求对仓库管理系统(WMS)形成了一系列复杂而又严格的要求,并且面临的 ...

  9. 10个前端开发人员必须知道的CSS框架

    对于UI / UX设计人员而言,要制作一个在每个浏览器上都看起来不错的漂亮网站不是一件容易的事.在创建网站布局并使其美观时,开发人员必须考虑所有Web浏览器和移动视图. 恐惧始终存在于内部,如果设计在 ...

最新文章

  1. c文本框只能输入数字_VBA代码限制文本框的输入
  2. 企业中常用的几种文件传输方法介绍
  3. java jdk1.5 对for循环遍历的优化
  4. 树结构之树和二叉树的概念以及如何用面向对象思想进行结构定义01
  5. php怎么引入外部css文件,js如何引入css外部文件
  6. 理解浏览器和nodeJs中的事件循环(Event Loop)
  7. 抗压力就是一切!!!
  8. kotlin中文开发文档
  9. 成功软文营销经典案例-案例分享
  10. 工控组态编程相关知识点介绍
  11. html svg图片不显示,html/css svg怎么显示不出来?
  12. 拼多多-桌上暖垫排行榜-好评榜调研
  13. 云原生kubernetes五 :pod创建流程
  14. 蓝屏终止代码:WHEA INTERNAL ERROR
  15. 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si
  16. DialogBox Function
  17. Android解析JSON,你真的需要三方库?
  18. IP地址最后一位自动增加为3位的EXCEL脚本
  19. 希腊字母的 LaTeX 语言、音标、大小写、以及对应的真实读音
  20. 2022二建建筑实务考试综合测试题目与答案

热门文章

  1. 当远程工作成为未来的工作方式......
  2. 数据挖掘相关的10个问题
  3. 微信小程序实现缓存过期时间
  4. css超出两行省略号没效果,Css 设置超过再两行显示省略号
  5. java版我的世界光追,光追有多神奇?我的世界VS别人的世界
  6. 微信扫码小绿盒支持支付宝+微信收款教程
  7. WSTMart商城系统数据字典
  8. Android 编译优化
  9. 一看就懂系列:java8流的扁平化/什么是扁平化流(图解)
  10. websocket连接不上