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/news/886903.shtml

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

相关文章

【新人系列】Python 入门(十一):控制结构

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

【CVPR2024】2024年CVPR的3D 目标检测的综述(还在补充中)

透视单目DETR 2D 透视单目DETR 2D的。对于DETR系列消除了 NMS的2D目标检测,RT-DETR[8]设计了一个高效的混合编码器,通过解耦尺度内交互和跨尺度融合来提高速度。采用不确定性最小查询选择,为解码器提供高质量的初始查询,从而提高准确率。 透视单目3D 透视单目3D。MonoCD…

VideoCrafter模型部署教程

一、介绍 VideoCrafter是一个功能强大的AI视频编辑和生成工具&#xff0c;它结合了深度学习和机器学习技术&#xff0c;为用户提供了便捷的视频制作和编辑体验。 系统&#xff1a;Ubuntu22.04系统&#xff0c;显卡&#xff1a;4090&#xff0c;显存&#xff1a;24G 二、基础…

Python自动化测试实践中pytest用到的功能dependency和parametrize

Python自动化测试中pytest用到的功能 1、pytest之@pytest.mark.dependency装饰器设置测试用例之间的依赖关系 1.1说明: 1、这是一个pytest第三方插件,主要解决用例之间的依赖关系。如果依赖的上下文测试用例失败后续的用例会被标识为跳过执行,相当于执行了 pytest.mark.s…

Ubuntu Linux使用前准备动作 安装VMware Tools工具

Ubuntu Linux 能够安装开源的 VMware tools 工具&#xff0c;即 Open VM Tools。具体安装步骤如下 1&#xff09;打开终端&#xff1a;可以通过按下 Ctrl Alt T 组合键来打开终端。 2&#xff09;安装 Open-VM-Tools 软件包 在终端中输入以下命令来更新软件包列表并安装 O…

Harmony鸿蒙类似与Android中broadcast广播的api使用及释义

EventHub模块提供了事件中心&#xff0c;提供订阅、取消订阅、触发事件的能力。 这里需要注意&#xff0c;该模块接口仅可在Stage模型下使用。且Api>9 EventHub.on on(event: string, callback: Function): void; 订阅指定事件。&#xff08;接收广播&#xff09; 参…

机器翻译基础与模型 之二: 基于CNN的模型

一、CNN网络 相比于全连接网络&#xff0c;卷积神经网络最大的特点在于具有局部连接&#xff08;Locally Connected&#xff09;和权值共享&#xff08;Weight Sharing&#xff09;的特性。 1.1 卷积核与卷积操作 1.2 步长与填充 1.3 池化 以上关于CNN的基础概念和技术就不…

嵌入式Linux的RTC读写操作应用

嵌入式Linux的RTC读写操作应用 一、前提二、头文件引用三、设置RTC时间四、读取RTC当前时间 一、前提 嵌入式开发中经常有碰到读取和修改时间的需求&#xff0c;所以会经常用到RTC这个功能。首先保证你的开发板上具有RTC这个模块和支持RTC且能正常工作&#xff0c;然后再进行应…

Vue 3集成海康Web插件实现视频监控

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;组件封装篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来组件封装篇专栏内容:Vue 3集成海康Web插件实现视频监控 引言 最近在项目中使用了 Vue 3 结合海康Web插件来实…

最少前缀操作问题--感受不到动态规划,怎么办怎么办

题目&#xff1a; 标签&#xff1a;动态规划&#xff08;应该是双指针的&#xff0c;不理解&#xff09; 小U和小R有两个字符串&#xff0c;分别是S和T&#xff0c;现在小U需要通过对S进行若干次操作&#xff0c;使其变成T的一个前缀。操作可以是修改S的某一个字符&#xff0…

【Maven】nexus 配置私有仓库配置【转】

介绍&#xff1a;【Maven】Nexus几个仓库的介绍-CSDN博客 一、仓库类型 proxy 远程仓库的代理&#xff0c;比如说nexus配置了一个central repository的proxy,当用户向这个proxy请求一个artifact的时候&#xff0c;会现在本地查找&#xff0c;如果找不到&#xff0c;则会从远程…

Python学习------第十天

数据容器-----元组 定义格式&#xff0c;特点&#xff0c;相关操作 元组一旦定义&#xff0c;就无法修改 元组内只有一个数据&#xff0c;后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…

Spring Web入门练习

加法计算器 约定前后端交互接⼝ 约定 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API&#xff08;Application Programming Interface), 我们⼀般讲到接⼝或者 API&#xff0c;指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…

uniapp微信小程序接入airkiss插件进行WIFI配网

本文可参考uniapp小程序插件 一.申请插件 微信公众平台设置页链接&#xff1a;微信公众平台 登录您的小程序微信公众平台&#xff0c;进入设置页&#xff0c;在第三方设置->插件管理->添加插件中申请AiThinkerAirkissforWXMini插件&#xff0c;申请的插件appId为【wx6…

蓝队技能-应急响应篇日志自动采集日志自动查看日志自动化分析Web安全内网攻防工具项目

知识点&#xff1a; 1、应急响应-系统日志收集-项目工具 2、应急响应-系统日志查看-项目工具 3、应急响应-日志自动分析-项目工具 演示案例-蓝队技能-工具项目-自动日志采集&自动日志查看&自动日志分析 系统日志自动采集-观星应急工具(Windows系统日志) SglabIr_Co…

类和对象——static 成员,匿名对象(C++)

1.static成员 a&#xff09;⽤static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成员变量⼀定要在类外进行初始化。 b&#xff09;静态成员变量为所有类对象所共享&#xff0c;不属于某个具体的对象&#xff0c;不存在对象中&#xff0c;存放在静态区。 …

node.js中express的基本了解

定义 Express是基于Node.js平台&#xff0c;快速、开放、极简的Web开发框架。 本质 Express是一个npm上的第三方包&#xff0c;提供了快速创建Web服务器的便捷方法。 作用 与Node.js内置的http模块类似&#xff0c;Express也是专门用来创建Web服务器的&#xff0c;但它极大地简…

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑&#xff0c;并设计用户界面。下面是一步一步的简要说明&#xff1a; 目录&#xff1a; QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…

JavaScript 高级—求数组的最大值与最小值

JavaScript 数组操作&#xff1a;求数组的最大值与最小值 在编程中&#xff0c;处理数组是一个常见的任务。JavaScript 提供了一些内建的方法和技巧&#xff0c;可以方便地找到数组中的最大值和最小值。今天&#xff0c;我们就来详细探讨一下如何使用 JavaScript 来实现这一功…

【C语言】C语言代码的编写规范、注释规范

【C语言】C语言代码规范 文章目录 [TOC](文章目录) 前言一、编写规范a、MISRA-C1、背景与目的2、发展历程3、准则内容4、应用与优势 b、华为 二、注释规范1.文件头注释2.函数头注释3.代码行注释4.特殊注释 三、参考资料总结 前言 提示&#xff1a;以下是本篇文章正文内容&#…