PC上浏览器是如何查询DNS 缓存的呢?

通过 ipconfig /displaydns 的显示结果可以获取本机的 DNS 缓存信息,那么浏览器是如何获取本机的 DNS 缓存。

答案是:浏览器获取本机的 DNS 缓存主要是通过操作系统提供的接口来获取,。

具体的获取途径如下:

  1. 先查询自身缓存:浏览器会首先检查自己内部维护的 DNS 缓存。当用户访问一个网站时,浏览器会将域名对应的 IP 地址缓存下来,以便下次访问时快速获取。不同的浏览器对 DNS 缓存的存储时间和策略可能会有所不同,但一般来说,浏览器会在一定时间内保留 DNS 缓存以提高访问速度。例如,谷歌浏览器的 DNS 缓存时间相对较短。
  2. 若浏览器缓存未命中,查询操作系统缓存:如果浏览器自身的缓存中没有找到对应的 DNS 记录,它会向操作系统发出请求,获取操作系统级别的 DNS 缓存。操作系统会维护一个 DNS 缓存,其中存储了最近访问过的域名及其对应的 IP 地址。在 Windows 系统中,可以使用 ipconfig /displaydns 命令查看操作系统的 DNS 缓存,但这只是一种查看方式,浏览器是通过操作系统提供的相关系统调用接口来获取这些缓存信息的。
  3. 读取本地 hosts 文件(若操作系统缓存未命中):如果操作系统的 DNS 缓存中也没有找到所需的 DNS 记录,浏览器会检查本地的 hosts 文件。hosts 文件是一个本地的文本文件,可以手动添加域名和 IP 地址的映射关系。浏览器会按照 hosts 文件中的配置来解析域名,如果找到对应的映射关系,就会使用文件中指定的 IP 地址。
  4. 向 DNS 服务器发起请求(若前面途径都未获取到):如果在前面的步骤中都没有找到对应的 DNS 记录,浏览器会向配置的 DNS 服务器发起请求,获取域名对应的 IP 地址。DNS 服务器会根据域名的层级结构,从根域名服务器开始递归查询,直到找到负责该域名的权威域名服务器。

浏览器获取本机的 DNS 缓存主要是通过操作系统提供的以下几种常见接口来获取:

  1. 系统调用接口:操作系统会提供一系列的系统调用函数,浏览器通过调用这些函数来访问操作系统级别的 DNS 缓存。不同的操作系统有不同的系统调用方式,但通常都是在底层实现了对 DNS 缓存信息的读取操作。例如,在 Windows 系统中,应用程序可以通过相关的系统 API 来获取 DNS 缓存中的记录;在 Linux 系统中,也有对应的系统调用接口可供程序使用。这些接口允许浏览器向操作系统请求特定域名的 IP 地址解析结果,如果在操作系统的 DNS 缓存中有该记录,操作系统会将其返回给浏览器2。
  2. 网络库接口:操作系统通常会提供一些网络相关的库,这些库封装了底层的网络操作,包括对 DNS 缓存的访问。浏览器可以使用这些网络库提供的接口来获取 DNS 缓存信息。例如,在一些操作系统中,网络库会提供函数或方法,让浏览器能够查询特定域名的缓存解析结果。这样,浏览器不需要直接与操作系统的底层系统调用打交道,而是通过相对简单的网络库接口来获取所需的 DNS 缓存数据。

以下分别以几种常见的编程语言结合不同操作系统的常用 API 为例,介绍如何编程实现利用操作系统的 API 获取 DNS 缓存:

Windows 系统(使用 C 语言结合 DnsQuery API)

#include <windows.h>
#include <windns.h>int main() {DNS_STATUS status;PDNS_RECORD pDnsRecord;// 要查询的域名,这里以示例域名为例,实际可替换为其他域名PCSTR domainName = "www.example.com"; // 调用DnsQuery API进行查询,尝试获取DNS缓存或发起新查询status = DnsQuery(domainName, DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, &pDnsRecord, NULL);if (status == ERROR_SUCCESS) {// 如果查询成功,遍历并输出DNS记录信息PDNS_RECORD currentRecord = pDnsRecord;while (currentRecord!= NULL) {// 输出IP地址等相关信息,这里简单示意,可根据实际细化处理printf("IP Address: %s\n", currentRecord->Data.A.IpAddress.String);currentRecord = currentRecord->pNext;}DnsRecordListFree(pDnsRecord, DnsFreeRecordListDeep);} else {// 如果查询失败,输出错误信息printf("DnsQuery failed with error code: %d\n", status);}return 0;
}

在上述代码中:

  1. 首先引入了必要的头文件 <windows.h> 和 <windns.h>,它们包含了在 Windows 环境下进行 DNS 查询相关操作所需的函数声明、结构体定义等内容。
  2. 在 main 函数里,定义了变量用于存储 DNS 查询的状态以及查询结果的记录指针等。
  3. 通过 DnsQuery 函数传入要查询的域名(示例中为 "www.example.com" )、记录类型(这里选择 DNS_TYPE_A 表示查询 IPv4 地址对应的记录)以及其他相关查询参数,尝试从本地 DNS 缓存获取记录,如果缓存没有则可能向外部 DNS 服务器发起查询。
  4. 根据查询结果进行不同处理,如果查询成功就遍历并输出获取到的 IP 地址等相关 DNS 记录信息,若失败则输出相应的错误代码提示信息。

Linux 系统(使用 C 语言结合 getaddrinfo API)

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <arpa/inet.h>int main() {struct addrinfo hints, *result, *rp;int s;// 要查询的域名,可按需替换const char *domain = "www.example.com"; memset(&hints, 0, sizeof(struct addrinfo));hints.ai_family = AF_UNSPEC;  // 支持IPv4和IPv6hints.ai_socktype = SOCK_STREAM;  // TCP类型的套接字// 调用getaddrinfo API进行查询,先查看本地DNS缓存s = getaddrinfo(domain, NULL, &hints, &result);if (s!= 0) {fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));return 1;}// 遍历查询结果并输出相关IP地址信息for (rp = result; rp!= NULL; rp = rp->ai_next) {void *addr;char *ipver;if (rp->ai_family == AF_INET) {struct sockaddr_in *ipv4 = (struct sockaddr_in *)rp->ai_addr;addr = &(ipv4->sin_addr);ipver = "IPv4";} else {struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)rp->ai_addr;addr = &(ipv6->sin6_addr);ipver = "IPv6";}char ipstr[INET6_ADDRSTRLEN];inet_ntop(rp->ai_family, addr, ipstr, sizeof(ipstr));printf("IP Address (%s): %s\n", ipver, ipstr);}freeaddrinfo(result);return 0;
}

  1. 包含了多个必要的头文件,如 <stdio.h> 用于标准输入输出操作、<stdlib.h> 用于内存管理相关操作、<netdb.h> 和 <arpa/inet.h> 用于网络地址相关的处理以及 DNS 查询功能实现。
  2. 在 main 函数中,先对 hints 结构体进行初始化,设置了地址族(支持 IPv4 和 IPv6)以及套接字类型等参数,然后调用 getaddrinfo 函数传入要查询的域名、相关参数提示信息以及用于存储结果的指针变量,该函数会先查看本地 DNS 缓存获取记录,若没有再按流程向外部 DNS 服务器查询。
  3. 根据 getaddrinfo 的返回结果进行处理,如果成功就遍历返回的地址信息列表,判断是 IPv4 还是 IPv6 地址并进行相应的格式转换后输出,若失败则输出对应的错误提示信息,最后释放申请的内存资源。

macOS 系统(使用 Objective-C 语言结合 CFHostCreateWithName API)

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {NSString *domain = @"www.example.com";CFStringRef domainCF = (__bridge CFStringRef)domain;// 使用CFHostCreateWithName API创建主机对象,过程中会检查本地DNS缓存CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, domainCF);if (host!= NULL) {// 尝试获取主机的IP地址信息if (CFHostStartInfoResolution(host, kCFHostAddresses, NULL) == kCFHostStartInfoResolutionSuccess) {CFArrayRef addresses = CFHostGetAddressing(host, NULL);if (addresses!= NULL) {CFIndex count = CFArrayGetCount(addresses);for (CFIndex i = 0; i < count; i++) {struct sockaddr_storage *addr = (struct sockaddr_storage *)CFArrayGetValueAtIndex(addresses, i);char ipstr[INET6_ADDRSTRLEN];if (addr->ss_family == AF_INET) {struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr;inet_ntop(AF_INET, &(ipv4->sin_addr), ipstr, sizeof(ipstr));NSLog(@"IP Address (IPv4): %s", ipstr);} else if (addr->ss_family == AF_INET6) {struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)addr;inet_ntop(AF_INET6, &(ipv6->sin6_addr), ipstr, sizeof(ipstr));NSLog(@"IP Address (IPv6): %s", ipstr);}}}}CFRelease(host);}}return 0;
}

在这段 Objective-C 代码中:

  1. 首先引入了 <Foundation/Foundation.h> 头文件,它提供了在 macOS 系统下进行基础开发的诸多类和函数等。
  2. 在 main 函数里,定义了要查询的域名字符串,并通过类型转换将其转换为 CFStringRef 类型,因为 CFHostCreateWithName 函数需要该类型的参数。
  3. 使用 CFHostCreateWithName 函数创建一个主机对象,在这个过程中,系统会先查看本地 DNS 缓存来获取对应的 IP 地址解析记录。如果创建成功,接着尝试启动信息解析获取主机的 IP 地址信息,若解析成功,获取到地址数组后,遍历该数组,根据地址的类型(IPv4 或 IPv6)进行相应的格式转换并输出 IP 地址信息,最后释放创建的主机对象占用的资源。

需要注意的是,以上代码示例只是简单演示如何利用对应操作系统的相关 API 获取 DNS 缓存相关信息,实际应用中可能需要根据具体需求进一步完善功能、添加错误处理以及适配更多复杂场景等。

参考内容:

浏览器获取本机的 DNS 缓存有多种途径。首先,可以通过开发者工具查看谷歌浏览器的 DNS 缓存,按下 F12 键打开开发者工具,切换到 “Application” 选项卡,在左侧导航栏的 “Storage” 选项中可查看相应缓存数据。此外,在 Windows 操作系统中,谷歌浏览器的缓存文件路径通常为 C:\Users\{用户名}\AppData\Local\Google\Chrome\User Data\Default\Cache,但直接打开该文件夹看到的是二进制文件,需借助特定工具才能查看具体内容。火狐浏览器可在地址栏中输入 about:cache,点击 disk→list cache entries 查看缓存信息。微软 Edge 浏览器输入 edge://net-internals/#dns 可查看与 DNS 相关的缓存信息,但此功能可能需要手动开启记录到本地磁盘才能正常查看具体内容,也可通过开发者工具查看缓存。

关于本机的 DNS 缓存获取,在 Windows 系统中可以使用 cmd 命令 ipconfig /displaydns 查看操作系统的 DNS 缓存。浏览器也会按照一定的频率缓存 DNS 记录,例如 chrome://net-internals/#dns 可以查看 Chrome 浏览器的 DNS 缓存。浏览器获取本机 DNS 缓存的途径并非单一,不同浏览器有不同的查看方式,同时也可以通过系统命令来查看操作系统层面的 DNS 缓存。

综上所述,浏览器获取本机 DNS 缓存可以通过自身的特定方式以及系统命令等多种途径来实现。

谷歌浏览器获取本机 DNS 缓存途径

在谷歌浏览器中,可以通过在地址栏输入 “chrome://net-internals/#dns” 来查看本机的 DNS 缓存。访问该页面后,会显示当前所有 DNS 缓存,通过点击 “Clear host cache”,可以清空所有 DNS 缓存。有时候此方法可能不能立刻生效,可以使用另外一个设置,在地址栏中输入 “chrome://settings/” 并回车,通过搜索 “预测网络操作” 找到配置项 “预测网络操作,以提高网页加载速度”,去掉前面的勾即可。此外,谷歌浏览器对每个域名会默认缓存 60s,但现在需要手动开启记录到本地磁盘才能正常查看具体内容。例如,当在谷歌浏览器的 url 地址栏输入 “chrome://net-internals/#dns” 后,页面会显示诸如 “Resolved lP addresses of ‘www.baidu.com’:(‘112.80.248.75’, ‘112.80.248.76’).No data on which protocols are supported.Host resolver cache” 的信息,这里的 “Host resolver cache” 就是主机解析器缓存,可以点击 “Clear host cache” 清除缓存记录。

火狐浏览器获取本机 DNS 缓存途径

在火狐浏览器中,可以在地址栏中输入 “about:config” 并回车,可能会出现一个警告信息,直接点击按钮进入,会出现火狐的所有配置信息。通过搜索 “dns” 进行过滤,可以看到一项名为 “network.dnsCacheExpirationGracePeriod” 项,它对应的值就是 DNS 缓存的时间,双击此项,会出现修改的提示框,填入 0(不缓存 DNS)即可。Firefox 有 dns 缓存功能,但是默认缓存时间只有 1 分钟,可以通过修改该默认值加快 DNS 解析速度,方法如下:打开一个新的窗口,地址栏输入 “about:config”,回车,进入设置界面。然后搜索 “network.dnsCacheExpiration”,把原来的 60 改成 6000(表示缓存 6000 秒),再搜索 “network.dnsCacheEntries” 把默认的 20 改成 1000(表示缓存 1000 条)。如果没有上面两个项目,可以在地址栏中输入 “about:cache” 并回车,点击 “disk(磁盘)→list cache entries(缓存条目列表)”,即可看到火狐浏览器的缓存信息,包括缓存文件的大小、类型、存储路径等。

微软 Edge 浏览器获取本机 DNS 缓存途径

在微软 Edge 浏览器中,可以输入 “edge://net-internals/#dns” 可查看与 DNS 相关的缓存信息,但此功能可能需要手动开启记录到本地磁盘才能正常查看具体内容。类似于谷歌浏览器,也可以通过开发者工具查看缓存。按下 F12 打开开发者工具,切换到 “Application” 选项卡,在 “Storage” 下查看 “Cookies”“Local Storage”“Session Storage” 等缓存数据。

Windows 系统通过 cmd 命令获取 DNS 缓存

在 Windows 系统中,可以通过 cmd 命令来获取和操作 DNS 缓存。首先按下快捷键 “win+r” 调出运行窗口,在窗口处输入 “cmd”。打开 “命令提示符” 窗口后,在窗口处输入命令 “ipconfig /displaydns” 来进行查看系统内的 DNS 缓存。如果要清空 DNS 缓存,可以执行命令 “ipconfig /flushdns” 命令。再次输入命令 “ipconfig /displaydns” 来确认是否清空了 DNS 缓存。成功后,系统将返回相应消息,如 “Windows IP Configuration Successfully flushed the DNS Resolver Cache.”。

浏览器获取本机 DNS 缓存的原理

浏览器获取本机 DNS 缓存是为了提高网页加载速度。不同的浏览器有不同的缓存机制和获取途径。一般来说,浏览器会优先检查自身的缓存,如果未命中则会进一步查询操作系统的缓存、hosts 文件等。例如,谷歌浏览器会先查询自身的 DNS 缓存,若未找到则会继续查询操作系统缓存等。火狐浏览器通过特定的配置项和命令来查看和操作 DNS 缓存。微软 Edge 浏览器则可以通过特定的地址和开发者工具来查看相关缓存信息。而 Windows 系统通过 cmd 命令可以直接查看和清空系统内的 DNS 缓存。这些方法都是为了提高网络访问的效率,减少 DNS 查询的时间,从而提升用户的上网体验。

浏览器获取本机 DNS 缓存的途径多种多样,不同的浏览器和操作系统提供了不同的方法。用户可以根据自己的需求和使用习惯选择合适的方式来查看和管理 DNS 缓存。无论是谷歌浏览器、火狐浏览器还是微软 Edge 浏览器,都在不断优化自身的缓存机制,以提供更快速、高效的网络访问体验。同时,Windows 系统的 cmd 命令也为用户提供了一种直接管理 DNS 缓存的方式,方便用户在需要时进行操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

26-ES集群搭建、身份认证配置

虚机搭建 添加es用户 elasticsearch 默认不允许root用户启动&#xff0c;所以需要创建es用户 useradd elasticsearch passwd elasticsearch 解压安装包 #解压es tar -xvzf elasticsearch-7.14.2-linux-x86_64.tar.gz 将文件夹赋予es用户权限 #将文件夹赋予es用户权限 sud…

BuyPass SSL证书:申请免费可用多域名SSL证书6个月180天

目录 一、前沿 二、条件 三、申请流程 四、注意事项 五、总结 一、前沿 找到一个6个月180天的免费证书&#xff0c;目前 BuyPass 提供了类似ZerSSL 等基于 ACME/Certbot 的证书自动签发服务 - BuyPass GO Free SSL&#xff0c;完全免费&#xff0c;只支持单域名、多域名&am…

OpenHarmony的公共事件

OpenHarmony的公共事件 公共事件简介 CES&#xff08;Common Event Service&#xff0c;公共事件服务&#xff09;为应用程序提供订阅、发布、退订公共事件的能力。 公共事件分类 公共事件从系统角度可分为&#xff1a;系统公共事件和自定义公共事件。 系统公共事件&#…

【AlphaFold3】开源本地的安装及使用

文章目录 安装安装DockerInstalling Docker on Host启用Rootless Docker 安装 GPU 支持安装 NVIDIA 驱动程序安装 NVIDIA 对 Docker 的支持 获取 AlphaFold 3 源代码获取基因数据库获取模型参数构建将运行 AlphaFold 3 的 Docker 容器 参考 AlphaFold3: https://github.com/goo…

npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)

您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的&#xff0c;用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式&#xff1a; npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…

React状态管理之Redux

React状态管理之Redux 在React应用中&#xff0c;状态管理是一个至关重要的概念。随着应用规模的扩大&#xff0c;组件之间的状态共享和更新变得愈发复杂。Redux作为一个专门用于JavaScript应用&#xff08;尤其是React应用&#xff09;的状态管理库&#xff0c;提供了一种可预…

Spring Boot框架:电商系统的技术革新

4 系统设计 网上商城系统的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没有经过全…

layui.all.js:2 Uncaught Error: Syntax error, unrecognized expression

报错内容&#xff1a; layui.all.js:2 Uncaught Error: Syntax error, unrecognized expression: input[name"image1UploadTime"language] 错误代码&#xff1a; $(input[name"imagejUploadTime"language]).val(currentDateTime); 因为 language 是个变…

Scala的set

//Set的特点&#xff1a;唯一&#xff08;元素不相同&#xff09;&#xff1b;无序 case class Book(var bookName:String,var author:String,var price:Double){} object test27 {def main(args: Array[String]): Unit {//定义一个可变setval set1 scala.collection.mutable…

【数据分享】中国对外投资合作发展报告(2013-2023)

数据介绍 绪 论............................................................................................................................. 1 对外投资合作高质量发展迈出新步伐................................................................... 2 第一篇 发…

【深度学习】LSTM、BiLSTM详解

文章目录 1. LSTM简介&#xff1a;2. LSTM结构图&#xff1a;3. 单层LSTM详解4. 双层LSTM详解5. BiLSTM6. Pytorch实现LSTM示例7. nn.LSTM参数详解 1. LSTM简介&#xff1a; LSTM是一种循环神经网络&#xff0c;它可以处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM通…

leetcode hot100【LeetCode 236.二叉树的最近公共祖先】java实现

LeetCode 236.二叉树的最近公共祖先 题目描述 给定一个二叉树, 找到该树中两个给定节点的最近公共祖先。 节点可以表示为它在树中的路径&#xff0c;其中路径的第一个节点是根节点&#xff0c;每个后续节点是其父节点的直接子节点。 示例 1: 输入: root [3,5,1,6,2,0,8,n…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

跟李笑来学美式俚语(Most Common American Idioms): Part 02

Most Common American Idioms: Part 02 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…

Molecular signatures database (MSigDB) 3.0

文献翻译和解读&#xff08;解读在最后&#xff09; 摘要 动机&#xff1a; 良好注释的基因集代表了生物学过程的全貌&#xff0c;对于大规模基因组数据的有意义和深入解读至关重要。分子特征数据库&#xff08;MSigDB&#xff09;是最广泛使用的此类基因集资源库之一。 结果…

【Hadoop】【hdfs】【大数据技术基础】实验三 HDFS 基础编程实验

实验三&#xff1a; HDFS Java API编程实践 实验题目 HDFS Java API编程实践 实验目的 熟悉HDFS操作常用的Java API。 实验平台 操作系统&#xff1a;Linux Hadoop版本&#xff1a;2.6.0或以上版本 JDK版本&#xff1a;1.6或以上版本 Java IDE&#xff1a;Eclipse 实验…

Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)

案例地址&#xff1a;xupengboo-flowable-example Flowable 构建后端服务&#xff08;后端以及数据库搭建&#xff09; 以 Spring Boot 项目为例&#xff1a; 引入 Flowable 必要依赖。 <!-- flowable 依赖 --> <dependency><groupId>org.flowable</gr…

2022 年 9 月青少年软编等考 C 语言二级真题解析

目录 T1. 统计误差范围内的数思路分析 T2. 全在其中思路分析 T3. Lab 杯思路分析 T4. 有趣的跳跃思路分析 T5. 反反复复思路分析 T1. 统计误差范围内的数 统计一个整数序列中与指定数字 m m m 误差范围小于等于 x x x 的数的个数。 时间限制&#xff1a;1 s 内存限制&#…

ssm114基于SSM框架的网上拍卖系统的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;商品拍卖当然也不能排除在外&#xff0c;随着商品拍卖管理的不断成熟&#xff0c;它彻底改变了过去传统的经营管理方式&#xff0c;不仅使商品…

智慧农业的前世今生

智慧农业是将现代信息技术与传统农业相结合的新型农业生产方式&#xff0c;其发展历程如下&#xff1a; 20世纪70年代末&#xff0c;以美国为代表的欧美国家率先开始农业信息化、智能化的应用研究&#xff0c;以农业专家系统为代表的农业信息化应用开始在农业生产领域萌芽。我…