当前位置: 首页 > news >正文

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

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

开局一张图

img

来自: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服务器没有答案,它必须不断地自行寻找答案,直到得到答案,然后它回复客户端。

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

DNS zone

img

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 作为缓存 ttltry {String tmpString = Security.getProperty(cachePolicyProp);if (tmpString != null) {return Integer.valueOf(tmpString);}} catch (NumberFormatException ignored) {// Ignore}// 读取启动参数 sun.net.inetaddr.ttl 作为缓存 ttltry {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 默认10stry {String tmpString = Security.getProperty(negativeCachePolicyProp);if (tmpString != null) {return Integer.valueOf(tmpString);}} catch (NumberFormatException ignored) {// Ignore}// 读取 sun.net.inetaddr.negative.ttltry {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

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

相关文章:

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

DNS 充当地址簿。它将人类可读的域名 (google.com) 转换为机器可读的 IP 地址 (142.251.46.238)。 开局一张图 来自&#xff1a;https://xiaolishen.medium.com/the-dns-lookup-journey-240e9a5d345c 寻址流程 查询浏览器缓存&#xff1a;当你输入一个域名后&#xff0c;浏览…...

《吐血整理》高级系列教程-吃透Fiddler抓包教程(21)-如何使用Fiddler生成Jmeter脚本-上篇

1.简介 我们知道Jmeter本身可以录制脚本&#xff0c;也可以通过BadBoy&#xff0c;BlazeMeter等工具进行录制&#xff0c;其实Fiddler也可以录制Jmter脚本&#xff08;而且有些页面&#xff0c;由于安全设置等原因&#xff0c;使用Jmeter直接无法打开录制时&#xff0c;这时就…...

vim中出现复制不对齐-乱码问题

不对齐解决&#xff1a; 使用纯文本模式粘贴&#xff1a;在进入 Vim 编辑器后&#xff0c;先按下 :set paste 进入插入模式&#xff0c;然后再进行粘贴操作。这样可以确保粘贴的文本以纯文本格式插入&#xff0c;而不会触发自动缩进或其他格式化操作 中文乱码问题&#xff1a;…...

华为OD机考真题--单词接龙--带答案

2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09;or2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 题目描述&#xff1a; 单词接龙的规则是&#xff1a; 用于接龙的单词首字母必须要前一个单词的尾字母…...

排序进行曲-v3.0

文章目录 小程一言归并排序步骤举例总结时间复杂度分析&#xff1a;空间复杂度分析&#xff1a;注意 应用场景总结 实际举例Other 代码实现结果解释 小程一言 这篇文章是在排序进行曲2.0之后的续讲&#xff0c; 这篇文章主要是对归并排序进行细致分析&#xff0c;以及操作。 希…...

编辑列表操作时的一些思考,关于全量和增量操作

假设我有一个这样的页面&#xff0c;需要对用户的信息做编辑操作 角色下面有一些菜单项&#xff0c;通过一张角色-菜单关系表来维护&#xff0c;那么我要在编辑用户后也要对用户角色关系表做修改&#xff0c;是经过两次比较分别计算出需要增加或者删除的角色用户关系&#xff0…...

【python】Python tkinter库实现重量单位转换器的GUI程序

文章目录 前言学到什么?导入模块和库创建一个GUI窗口定义函数 from_kg()创建标签、输入框、文本框和按钮设置组件的布局运行窗口循环完整代码运行效果结束语 前言 这段代码是一个简单的重量单位转换器的 GUI 程序&#xff0c;使用了 Python 的 tkinter 库来创建图形界面。该程…...

CVPR2023新作:源数据集对迁移学习性能的影响以及相应的解决方案

Title: A Data-Based Perspective on Transfer Learning (迁移学习的基于数据的观点) Affiliation: MIT (麻省理工学院) Authors: Saachi Jain, Hadi Salman, Alaa Khaddaj, Eric Wong, Sung Min Park, Aleksander Mądry Keywords: transfer learning, source dataset, dow…...

《TCP IP 网络编程》第十五章

第 15 章 套接字和标准I/O 15.1 标准 I/O 的优点 标准 I/O 函数的两个优点&#xff1a; 除了使用 read 和 write 函数收发数据外&#xff0c;还能使用标准 I/O 函数收发数据。下面是标准 I/O 函数的两个优点&#xff1a; 标准 I/O 函数具有良好的移植性标准 I/O 函数可以利用…...

新特性解读 | MySQL 8.0 字段信息统计机制

作者通过一个案例详细说明了 MySQL 8.0 字段信息统计机制的相关参数和使用方式。 作者&#xff1a;杨奇龙 网名“北在南方”&#xff0c;资深 DBA&#xff0c;主要负责数据库架构设计和运维平台开发工作&#xff0c;擅长数据库性能调优、故障诊断。 本文来源&#xff1a;原创投…...

基于Java+Swing实现超级玛丽游戏

基于JavaSwing实现超级玛丽游戏 一、系统介绍二、功能展示三、其他系统 一、系统介绍 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断…...

Day12-1-Webpack前端工程化开发

Webpack前端工程化 1 案例-webpack打包js文件 1 在index.html中编写代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…...

JUnit教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立&#xff0c;逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。JUnit是由 Erich Gamma 和…...

Hive 安装介绍

介绍 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了hive可以理解为一个将SQL转换为Ma…...

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法 1、问题描述2、解决方法 1、问题描述 由于之前电脑系统的原因&#xff0c;电脑重置了一下&#xff0c;之前安装的环境都没了&#xff0c;然后在重新安装node.js后在使用npm安装时总是报如下错误&#xff1a…...

redis 高级篇4 分布式锁

一 redis架构图 1.1 redis的架构图 1.2 分布式锁满足条件 1.独占性&#xff1b;2.高可用&#xff1b;3.防死锁&#xff1b;4.不乱抢&#xff1b;5.重入性 二 分布式锁的案例情况 2.1 分布式锁1:单机分布式部署 描述&#xff1a; 使用lock锁和synchronized&#xff0c;单机…...

TPU-NNTC 编译部署LPRNet 车牌识别算法

TPU-NNTC 编译部署LPRNet 车牌识别算法 注意&#xff1a; 由于SOPHGO SE5微服务器的CPU是基于ARM架构&#xff0c;以下步骤将在基于x86架构CPU的开发环境中完成 初始化开发环境(基于x86架构CPU的开发环境中完成)模型转换 (基于x86架构CPU的开发环境中完成) 处理后的LPRNet 项…...

在线/开源GNSS处理软件/平台介绍

当前&#xff0c;存在较多的GNSS开源/免费软件&#xff0c;可用于质量检核、RTK解算和PPP解算等&#xff0c;本文总结了部分常用的处理软件&#xff0c;其详细信息如表1和表2所示。 表1 常用GNSS预处理&#xff08;格式转换、质量检核&#xff09;软件&#xff1a; 软件名称 …...

SpringBoot集成企业微信群聊机器人消息

目录 参考文档概述一、功能作用二、应用场景三、 群机器人发送限制四、创建机器人1、添加2、群机器人Webhook地址 五、发送消息1、文本 text请求体 图文连接 news 参考文档 官方文档 企业微信群机器人应用 概述 现在很多企业都在使用企业微信进行工作交流&#xff0c;自从企…...

​五、驱动 - ​音频系统硬件电路

文章目录 1. 音频系统硬件电路结构2. 蓝牙音频2.1 音乐播放2.2 VoIP通话2.3 4G通话3. 其他3.1 什么是S/PDIF1. 音频系统硬件电路结构 录音放音设备:mic、speaker、耳机、听筒这些带有录音放音功能的设备(因为录放设备可能是模拟设备也可能是数字设备,所以接口可能是模拟接口…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...