当前位置: 首页 > 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、耳机、听筒这些带有录音放音功能的设备(因为录放设备可能是模拟设备也可能是数字设备,所以接口可能是模拟接口…...

【仅限首批认证用户开放】Polars 2.0企业清洗最佳实践白皮书(含GDPR脱敏DSL语法速查表)

第一章&#xff1a;Polars 2.0企业级数据清洗能力全景概览Polars 2.0 将数据清洗从“脚本式修补”推向“工程化流水线”&#xff0c;依托零拷贝内存模型、并行执行引擎与声明式 API&#xff0c;原生支持高吞吐、低延迟、强一致性的清洗任务。其核心能力不再依赖 Pandas 风格的链…...

OpenClaw备份恢复:千问3.5-35B-A3B-FP8配置迁移指南

OpenClaw备份恢复&#xff1a;千问3.5-35B-A3B-FP8配置迁移指南 1. 为什么需要备份OpenClaw配置 上周我的开发机突然硬盘故障&#xff0c;不得不重装系统。当我准备重新部署OpenClaw时&#xff0c;突然意识到一个严重问题——过去三个月精心调试的千问3.5模型配置、飞书机器人…...

Geoserver空间查询全解析:从基础bbox到高级CQL_FILTER的完整指南

Geoserver空间查询全解析&#xff1a;从基础bbox到高级CQL_FILTER的完整指南 当你面对海量地理空间数据时&#xff0c;如何快速准确地提取所需信息&#xff1f;Geoserver作为开源地理信息系统&#xff08;GIS&#xff09;的中枢神经&#xff0c;其强大的空间查询能力往往被开发…...

Qwen3.5-9B-AWQ-4bit企业应用落地:电商商品图智能解析与文字提取实战

Qwen3.5-9B-AWQ-4bit企业应用落地&#xff1a;电商商品图智能解析与文字提取实战 1. 电商场景下的图片理解挑战 在电商运营中&#xff0c;每天需要处理海量商品图片。传统的人工审核和标注方式面临三大痛点&#xff1a; 效率瓶颈&#xff1a;人工处理一张商品图平均需要3-5分…...

零基础入门Python爬虫:借助快马AI生成你的第一个可运行爬虫脚本

今天想和大家分享一下我作为Python爬虫新手的学习经历。刚开始接触爬虫时&#xff0c;面对各种库和概念真的有点懵&#xff0c;直到发现了InsCode(快马)平台&#xff0c;它让我用自然语言描述需求就能生成可运行的代码&#xff0c;大大降低了入门门槛。 爬虫的基本原理 爬虫就像…...

浅谈MIKEURBAN计算进度条停止的解决方法

01 问题昨天晚上&#xff0c;一个同事拿着笔记本对着我说&#xff0c;为什么我的MIKE URBAN计算进度条一直停滞在5%&#xff0c;停止了。我说是不是兼容问题&#xff0c;要不重新安装下软件吧。最终还是很感谢某同事找到了解决方法。02 解决方法MIKE URBAN低版本的通常分为了32…...

利用快马平台十分钟快速构建开源项目网站原型:以openclaw101为例

作为一个经常参与开源项目的开发者&#xff0c;我深知快速验证想法的重要性。最近在尝试为开源项目openclaw101搭建网站时&#xff0c;发现InsCode(快马)平台能完美解决从零搭建的繁琐过程。下面分享如何用十分钟完成一个具备完整功能的项目网站原型。 明确需求与功能规划 首先…...

开源吐槽大会:技术圈的幽默自省

开源项目吐槽大会技术文章大纲主题与目的开源项目吐槽大会旨在通过幽默、犀利的视角&#xff0c;揭示开源生态中的常见问题&#xff0c;促进开发者反思与改进。文章将从技术、社区、维护等角度展开&#xff0c;兼顾娱乐性与建设性。核心内容结构技术层面的经典槽点 依赖地狱&am…...

RAG系统的需求分析

这个是一个基于私有知识库的智能对话平台&#xff0c;允许用户上传文档构建专属知识库&#xff0c;并通过自然语言交互的方式查询和获取知识。它结合了大语言模型和向量检索技术&#xff0c;让用户通过对话的形式与自己的知识库进行高效交互应用场景个人用户场景:学习助手&…...

FastAPI + SQLite:从基础CRUD到安全并发的实战指南

核心摘要本文将带你超越FastAPI SQLite的基础CRUD搭建&#xff0c;聚焦于安全防护&#xff08;认证、授权、输入验证&#xff09;与并发处理&#xff08;数据库连接池、异步优化&#xff09;两大实战痛点。你会获得一套可直接复用的项目骨架&#xff0c;并理解其背后的设计逻辑…...