图解系列 DNS查找过程和DNS缓存

这篇具有很好参考价值的文章主要介绍了图解系列 DNS查找过程和DNS缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DNS 充当地址簿。它将人类可读的域名 (google.com) 转换为机器可读的 IP 地址 (142.251.46.238)。

开局一张图

图解系列 DNS查找过程和DNS缓存,《???图解技术??》,缓存,dns

来自:https://xiaolishen.medium.com/the-dns-lookup-journey-240e9a5d345c

寻址流程

  1. 查询浏览器缓存:当你输入一个域名后,浏览器会首先检查自己的缓存,看是否已经解析过该域名的IP地址。
  2. 查询操作系统的DNS缓存:如果在浏览器缓存中找不到对应的IP地址,浏览器会向操作系统发出DNS解析请求。操作系统会检查自己的DNS缓存,看是否已经解析过该域名。
  3. 查询OS的hosts文件:如果在操作系统的DNS缓存中找不到对应的IP地址,操作系统会检查自己的hosts文件,看是否有该域名的映射信息。hosts文件是一个本地的文本文件,可以手动添加域名和IP地址的映射关系。
  4. 查询家庭路由器缓存:如果在操作系统的hosts文件中找不到对应的IP地址,操作系统会将DNS解析请求发送给家庭路由器。家庭路由器也有一个DNS缓存,用于存储最近解析过的域名和IP地址。
  5. 查询ISP的DNS服务器:如果在家庭路由器的缓存中找不到对应的IP地址,家庭路由器会将DNS解析请求发送给配置的ISP的DNS服务器。
  6. 查询ISP缓存:ISP的DNS服务器收到解析请求后,会检查自己的DNS缓存,看是否已经解析过该域名。
  7. DNS服务器递归查询:如果在ISP的缓存中找不到对应的IP地址,ISP的DNS服务器会根据域名的层级结构,从根域名服务器开始递归查询,直到找到负责该域名的权威域名服务器。(这里也有可能是迭代查询
    1. 解析器向根名称服务器询问域名,假设它是example.com
    2. 根名称服务器知道所有TLD(顶级域)名称服务器。由于我们附带了.com域,因此它将我们的查询转发到处理.com域的 TLD 名称服务器。
    3. .com TLD 名称服务器知道存储example.com域的 DNS 记录的权威名称服务器,因此它会提前转发查询。
    4. 权威名称服务器响应映射到域名的A 记录(地址记录,即 IP 地址)。
  8. 然后,IP 地址一路传回我们的浏览器,中间每个拥有 DNS 缓存的浏览器都会在途中缓存它,因此下次当我们或其他人询问 example.com 时,会更快的响应。
  9. 浏览器打开与 IP 地址(即托管example.com的服务器的地址)的 TCP/IP 连接,然后发送 HTTP 请求。如果服务器已启动并正在运行,它会将 HTTP 响应发送回我们的浏览器。

DNS 查询类型

递归查询 - 客户端向 ISP DNS 服务器发送请求后,它必须响应客户端请求的答案,即: www.example.com 的 IP 地址。如果ISP的DNS服务器没有答案,它必须不断地自行寻找答案,直到得到答案,然后它回复客户端。

图解系列 DNS查找过程和DNS缓存,《???图解技术??》,缓存,dns

迭代查询 - 当ISP DNS服务器向远程DNS服务器发送请求后,远程DNS服务器不需要响应应答,它可以响应另一个DNS服务器的IP地址来进行引用。 ISP DNS 服务器查看响应并向另一台服务器重新发出新请求。它不断重复这个过程,直到找到答案。

图解系列 DNS查找过程和DNS缓存,《???图解技术??》,缓存,dns

DNS zone

图解系列 DNS查找过程和DNS缓存,《???图解技术??》,缓存,dns

DNS缓存

  • 浏览器DNS缓存

    在 Chrome 浏览器中,您可以转到 chrome://net-internals/#dns 查看 DNS 缓存的状态。

  • 本地DNS缓存

    在 Windows 中查看 DNS 缓存条目 ipconfig /displaydns

    刷新 DNS 缓存ipconfig /flushdns

    并非所有 Linux 发行版都启用或默认安装 DNS 缓存

    Debian 或 Ubuntu 系统,则 DNS 缓存文件存储在目录中 /var/cache/nscd/hosts

    sudo strings /var/cache/nscd/hosts

  • hosts文件

  • 路由器DNS缓存

  • ISP(运营商)DNS缓存

  • Java DNS Cache

高级

Java DNS Cache

相关代码在InetAddressCachePolicy.java

public final class InetAddressCachePolicy {

    // 成功寻址的缓存策略
    // 安全属性
    private static final String cachePolicyProp = "networkaddress.cache.ttl";
    // 系统属性
    private static final String cachePolicyPropFallback =
        "sun.net.inetaddr.ttl";

    // 失败寻址的无效缓存策略
    // 安全属性
    private static final String negativeCachePolicyProp =
        "networkaddress.cache.negative.ttl";
    // 系统属性
    private static final String negativeCachePolicyPropFallback =
        "sun.net.inetaddr.negative.ttl";

    public static final int FOREVER = -1;
    public static final int NEVER = 0;

    /* default value for positive lookups */
    public static final int DEFAULT_POSITIVE = 30;

解析成功缓存策略

        Integer tmp = java.security.AccessController.doPrivileged(
          new PrivilegedAction<Integer>() {
            public Integer run() {
                	// 读取参数 networkaddress.cache.ttl 作为缓存 ttl
                try {
                    String tmpString = Security.getProperty(cachePolicyProp);
                    if (tmpString != null) {
                        return Integer.valueOf(tmpString);
                    }
                } catch (NumberFormatException ignored) {
                    // Ignore
                }
				// 读取启动参数 sun.net.inetaddr.ttl 作为缓存 ttl
                try {
                    String tmpString = System.getProperty(cachePolicyPropFallback);
                    if (tmpString != null) {
                        return Integer.decode(tmpString);
                    }
                } catch (NumberFormatException ignored) {
                    // Ignore
                }
                return null;
            }
          });

        if (tmp != null) {
            cachePolicy = tmp < 0 ? FOREVER : tmp;
            propertySet = true;
        } else {
			// 如果以上参数均未读取到,并且未开启 SecurityManager,则会使用默认值 30s.
            if (System.getSecurityManager() == null) {
                cachePolicy = DEFAULT_POSITIVE;
            }
            // 否则使用初始值 -1,表示永久生效
        }
  1. 如果开启了 SecurityManager,优先从 ${java.home}/jre/lib/security/java.security 中读取参数 networkaddress.cache.ttl,单位为秒。
  2. 如果未读取到,则会读取启动参数 sun.net.inetaddr.ttl 作为缓存 ttl.
  3. 如果以上参数均未读取到,并且未开启 SecurityManager,则会使用默认值 30s.(默认是未启用,即默认是30s有效期
  4. 否则使用初始值 -1,表示永久生效。

SecurityManager是一个允许应用实现一种安全策略的类。应用在执行一个安全或敏感的操作之前,可以明确此操作是否在一个安全的上下文中被执行。

默认是未启用状态

1.系统启动开启

JVM参数-Djava.security.manager

2.程序手动开启

// 创建SecurityManager实例
SecurityManager securityManager = new SecurityManager();
// 设置启动
System.setSecurityManager(securityManager);

寻址失败无效的DNS缓存时间

        tmp = java.security.AccessController.doPrivileged (
          new PrivilegedAction<Integer>() {
            public Integer run() {
                // 读取 networkaddress.cache.negative.ttl 默认10s
                try {
                    String tmpString = Security.getProperty(negativeCachePolicyProp);
                    if (tmpString != null) {
                        return Integer.valueOf(tmpString);
                    }
                } catch (NumberFormatException ignored) {
                    // Ignore
                }
  				 // 读取 sun.net.inetaddr.negative.ttl
                try {
                    String tmpString = System.getProperty(negativeCachePolicyPropFallback);
                    if (tmpString != null) {
                        return Integer.decode(tmpString);
                    }
                } catch (NumberFormatException ignored) {
                    // Ignore
                }
                return null;
            }
          });

        if (tmp != null) {
            negativeCachePolicy = tmp < 0 ? FOREVER : tmp;
            propertyNegativeSet = true;
        }

当DNS解析无效的时候,默认10S,目的是为了帮助提升性能

总结

可查看源码InetAddress 和 InetAddressCachePolicy

  • java dns解析缓存之源码解析
    • 如果打开Java中的SecurityManagerDNS缓存将不会失效。
    • 否则,可访问的DNS解析缺省缓存30秒,不可访问的DNS解析缺省缓存10秒。
  • 关于jvm dns cache(域名缓存时间),给出“对于多条A记录是采用什么策略返回IP的结论:
    • 在缓存有效期内,取到的IP永远是缓存中全部A记录的第一条,并没有轮循之类的策略。
    • 缓存失效之后重新进行DNS解析,因为每次域名解析返回的A记录顺序会发生变化(nslookup www.google.com测试可见),所以缓存中的数据顺序也变了,取到的IP也变化。

如何设置 JVM TTL

要修改 JVM 的 TTL,请设置 networkaddress.cache.ttl 属性值。根据您的需求,使用下列方法之一:

  • 全局 (针对所有使用 JVM 的应用程序)networkaddress.cache.ttl在 Java 8 $JAVA_HOME/jre/lib/security/java.security 的文件或适用于 Java 11 或更高版本$JAVA_HOME/conf/security/java.security的文件中设置:

    networkaddress.cache.ttl=60
    
  • 仅针对应用程序,在应用程序的初始化代码中设置 networkaddress.cache.ttl文章来源地址https://www.toymoban.com/news/detail-622924.html

    java.security.Security.setProperty("networkaddress.cache.ttl" , "60");
    

到了这里,关于图解系列 DNS查找过程和DNS缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DNS:自动化配置 主/从/缓存 DNS服务器

    学习遇到 DNS 自动化部署的一个 Ansible 剧本,这里分享给小伙 部署使用 Bind9 ,包括主从 DNS 构建,缓存 DNS 构建,缓存使用 unbound 剧本相对简单 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它

    2024年02月13日
    浏览(42)
  • 什么是DNS的缓存?

    DNS 缓存是一个临时的数据库,存储在计算机或网络设备(如路由器)上,用于保存最近的 DNS 查询结果。这种缓存机制可以加速后续的相同查询,因为设备可以直接从缓存中提取先前的查询结果,而不需要再次到外部的 DNS 服务器去查询。 DNS 缓存有以下特点: 加速 DNS 解析

    2024年02月13日
    浏览(31)
  • 怎么查看本地DNS缓存?

    在Windows操作系统中,可以使用以下命令来查看当前电脑的DNS缓存: 打开命令提示符:在Windows搜索框中输入“cmd”,然后点击“命令提示符”或“管理员命令提示符”。 1.输入以下命令并按回车键:ipconfig /displaydns 2.稍等片刻,系统会列出当前电脑的DNS缓存记录。 如果需要清

    2024年02月11日
    浏览(42)
  • MacOS刷新DNS缓存

    当你在浏览网站或者使用网络服务时,你的 MacOS 系统会自动保存(缓存)DNS 查询结果,以加速后续的访问。但是,有时候,DNS 缓存可能会造成问题,例如网站已经迁移到新的服务器,而你的系统仍然在尝试访问旧的地址。在这种情况下,你可能需要刷新(清空)你的 DNS 缓

    2024年02月20日
    浏览(35)
  • DNS协议 是什么?说说DNS 完整的查询过程?

    DNS(Domain Names System),域名系统,是互联网一项服务,是进行域名和与之相对应的 IP 地址进行转换的服务器 简单来讲, DNS 相当于一个翻译官,负责将域名翻译成 ip 地址 IP 地址:一长串能够唯一地标记网络上的计算机的数字 域名:是由一串用点分隔的名字组成的 Internet 上

    2024年03月26日
    浏览(44)
  • MacOS13刷新DNS缓存

    当你在浏览网站或者使用网络服务时,你的 MacOS 系统会自动保存(缓存)DNS 查询结果,以加速后续的访问。但是,有时候,DNS 缓存可能会造成问题,例如网站已经迁移到新的服务器,而你的系统仍然在尝试访问旧的地址。在这种情况下,你可能需要刷新(清空)你的 DNS 缓

    2024年02月06日
    浏览(37)
  • Linux 如何刷新 DNS 缓存

    Linux 如何刷新 DNS 缓存 全文:如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接:https://sysin.org/blog/how-to-flush-dns-cache/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 刷新或者清除

    2024年02月13日
    浏览(31)
  • 如何使用命令清除DNS缓存(图文)

    有时候大家可能会遇到这样的情况,电脑突然上不了网,或者存在某些网站打不开的情况,但别的网站又可以打开。对于这种情况很多是DNS缓存延时导致。 使用命令清理DNS缓存方法 1、由于需要用到命令,因为我们首先要调出电脑的命令对话框,方法是使用组合快捷键:Win

    2024年02月05日
    浏览(36)
  • DNS缓存病毒防护43.227.220

    DNS缓存病毒又称DNS欺骗,是一种通过查找并利用DNS系统中存在的漏洞,将流量从合法服务器引导至虚假服务器上的攻击方式。 在实际的DNS解析过程中,用户请求某个网站,浏览器首先会查找本机中的DNS缓存,如果DNS缓存中记录了该网站和IP的映射关系,就会直接将结果返回给

    2024年02月15日
    浏览(32)
  • mac清除dns缓存指令 mac清除缓存怎么清理

    你是否曾经被要求清理dns缓存并刷新?清理dns缓存一般是由于修改了主机文件,或者想排除一些网络上的故障。在Mac上清除dns缓存需要使用命令行来实现。在本文中,软妹子将向大家介绍mac清除dns缓存指令,并展示mac清除缓存怎么清理。 一、mac清除dns缓存指令 dns缓存就像保

    2024年04月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包