为了获取网络适配器信息、删除 DNS 缓存和 IP 地址,并通过 ipconfig /renew6 向 DHCPv6 服务器重新申请IPv6租约,更新 DHCPv6 分配的 IPv6 地址与 DNS;SLAAC 地址不受该命令控制 自动获取 IPv6 地址,可以使用以下步骤和命令。

ipconfig | Microsoft Learn

 

PS C:\WINDOWS\system32> ipconfig /?

用法:
    ipconfig [/allcompartments] [/? | /all |
                                 /renew [adapter] | /release [adapter] |
                                 /renew6 [adapter] | /release6 [adapter] |
                                 /flushdns | /displaydns | /registerdns |
                                 /showclassid adapter |
                                 /setclassid adapter [classid] |
                                 /showclassid6 adapter |
                                 /setclassid6 adapter [classid] ]

其中
ipconfig     adapter             连接名称 (允许使用通配符 * 和 ?,参见示例)

    选项:                     描述:
ipconfig /?       查看 ipconfig 全部帮助文档,列出所有可用参数与简要说明

ipconfig /all        显示完整网络配置信息:网卡 MAC 地址、IP、子网掩码、网关、DNS、DHCP 服务器、主机名、网卡描述等,排查网络基础信息首选

ipconfig /release        释放IPv4地址,向 DHCP 服务器发送释放报文,网卡 IPv4 地址变为 0.0.0.0,断开 DHCP 分配的 IPv4 地址

ipconfig /release6        释放IPv6地址,向 DHCPv6 服务器释放租约,移除 DHCPv6 分配的 IPv6 地址(不影响 SLAAC 自动生成的 IPv6 地址)

ipconfig /renew       重新向 DHCP 服务器请求IPv4地址租约,更新 IPv4 地址、网关、DNS 等 DHCP 下发参数

ipconfig /renew6        向 DHCPv6 服务器重新申请IPv6租约,更新 DHCPv6 分配的 IPv6 地址与 DNS;SLAAC 地址不受该命令控制

ipconfig /flushdns        清空本机 DNS 客户端解析缓存。域名解析异常、DNS 劫持测试、修改 DNS 后刷新缓存常用

ipconfig /registerdns        触发 DNS 客户端,向 DNS 服务器动态注册本机 A 记录(IPv4)与 AAAA 记录(IPv6);AD 域环境更新主机 DNS 记录常用,无需重启

ipconfig /displaydns       查看本机当前 DNS 解析缓存,展示已经解析过的域名、TTL、记录类型、IP,用于排查域名解析缓存污染

ipconfig /showclassid        查看网卡当前的IPv4 DHCP Class ID(类别标识符),DHCP 服务器可根据 ClassID 下发不同策略

ipconfig /setclassid        设置网卡的 IPv4 DHCP Class ID,用于 DHCP 服务器做设备分组、策略分流;不加参数可清空 ClassID

ipconfig /showclassid6        查看网卡当前IPv6 DHCPv6 Class ID

ipconfig /setclassid6        设置网卡 IPv6 DHCPv6 Class ID,用于 DHCPv6 服务器识别客户端分组   

补充备注:

1. 部分命令需要管理员权限;
2. release/renew 仅针对 DHCP 获取地址,静态 IP 不受 release/renew 影响;
3. DNS 缓存是客户端缓存,不是 DNS 服务器缓存,`/flushdns` 只清本机。

默认情况下,仅显示绑定到 TCP/IP 的每个适配器的 IP 地址、子网掩码和默认网关。

对于 Release 和 Renew,如果未指定适配器名称,则会释放或更新所有绑定到 TCP/IP 的适配器的 IP 地址租用。

对于 Setclassid 和 Setclassid6,如果未指定 ClassId,则会删除 ClassId。

示例:
     ipconfig                       ... 显示信息
     ipconfig /all                  ... 显示详细信息
     ipconfig /renew                ... 更新所有适配器
     ipconfig /renew EL*            ... 更新所有名称以 EL 开头 的连接
     ipconfig /release *Con*        ... 释放所有匹配的连接,例如“有线以太网连接 1”或“有线以太网连接 2”
     ipconfig /allcompartments      ... 显示有关所有隔离舱的信息
     ipconfig /allcompartments /all ... 显示有关所有隔离舱的详细信息

 

PS C:\Users\Administrator> ipconfig /?

用法:
    ipconfig [/allcompartments] [/? | /all |
                                 /renew [adapter] | /release [adapter] |
                                 /renew6 [adapter] | /release6 [adapter] |
                                 /flushdns | /displaydns | /registerdns |
                                 /showclassid adapter |
                                 /setclassid adapter [classid] |
                                 /showclassid6 adapter |
                                 /setclassid6 adapter [classid] ]

其中
    adapter             连接名称 (允许使用通配符 * 和 ?,参见示例)

    选项:
      ipconfig  /?               显示此帮助消息
     ipconfig   /all             显示完整配置信息。
     ipconfig   /release         释放指定适配器的 IPv4 地址。
     ipconfig   /release6        释放指定适配器的 IPv6 地址。
     ipconfig   /renew           更新指定适配器的 IPv4 地址。
     ipconfig   /renew6          更新指定适配器的 IPv6 地址。
     ipconfig   /flushdns        清除 DNS 解析程序缓存。
     ipconfig   /registerdns     刷新所有 DHCP 租用并重新注册 DNS 名称
    ipconfig    /displaydns      显示 DNS 解析程序缓存的内容。
    ipconfig    /showclassid     显示适配器允许的所有 DHCP 类 ID。
    ipconfig    /setclassid      修改 DHCP 类 ID。
    ipconfig    /showclassid6    显示适配器允许的所有 IPv6 DHCP 类 ID。
    ipconfig    /setclassid6     修改 IPv6 DHCP 类 ID。


默认情况下,仅显示绑定到 TCP/IP 的每个适配器的 IP 地址、子网掩码和默认网关。

对于 Release 和 Renew,如果未指定适配器名称,则会释放或更新所有绑定到 TCP/IP 的适配器的 IP 地址租用。

对于 Setclassid 和 Setclassid6,如果未指定 ClassId,则会删除 ClassId。

示例:
    > ipconfig                       ... 显示信息
    > ipconfig /all                  ... 显示详细信息
    > ipconfig /renew                ... 更新所有适配器
    > ipconfig /renew EL*            ... 更新所有名称以 EL 开头的连接
    > ipconfig /release *Con*        ... 释放所有匹配的连接,例如“有线以太网连接 1”或“有线以太网连接 2”
    > ipconfig /allcompartments      ... 显示有关所有隔离舱的信息
    > ipconfig /allcompartments /all ... 显示有关所有隔离舱的详细信息

 


为了获取网络适配器信息、删除 DNS 缓存和 IP 地址,并通过 ipconfig /renew6 自动获取 IPv6 地址,可以使用以下步骤和命令。

1. 获取网络适配器信息

首先,查看网络适配器信息:

cmdCopy Code
ipconfig /all

2. 删除 DNS 缓存

清除 DNS 缓存的命令是:

cmdCopy Code
ipconfig /flushdns

3. 释放当前的 IP 地址

释放当前的 IP 地址:

cmdCopy Code
ipconfig /release

4. 通过 DHCP 重新获取 IPv6 地址

使用以下命令获取新的 DHCP IPv6 地址:

cmdCopy Code
ipconfig /renew6

5. 自动化命令

你可以将这些命令组合成一个批处理文件(.bat),这样每次只需运行这个文件即可完成所有操作。以下是一个示例批处理文件内容:

batCopy Code
@echo off
echo 获取网络适配器信息...
ipconfig /all

echo 清除 DNS 缓存...
ipconfig /flushdns

echo 释放当前 IP 地址...
ipconfig /release

echo 通过 DHCP 重新获取 IPv6 地址...
ipconfig /renew6

echo 完成!
pause

运行批处理文件

  1. 将上述代码复制到文本编辑器中,保存为 reset_network.bat。
  2. 右键点击该文件,选择“以管理员身份运行”。

这样就能自动执行所有步骤,完成对 DNS 缓存的清除、IP 地址的释放和 IPv6 地址的获取。

整套批处理命令逐条拆解:底层原理|依赖文件|依赖关系|配套链|逻辑链路

执行脚本清单
cmd
echo 清除 DNS 缓存...
ipconfig /flushdns

echo 释放当前 IP 地址...
ipconfig /release

echo 通过 DHCP 重新获取 IPv6 地址...
ipconfig /renew6
通用前置结论:
 
ipconfig.exe 仅为命令行控制前端程序,自身不会收发任何网络报文;所有实际网络交互、缓存管理、租约维护由后台服务承载;调用核心库:iphlpapi.dll、dnsapi.dll,跨进程依靠 rpcrt4.dll 完成 IPC 通信。

一、ipconfig /flushdns

底层原理

调用 dnsapi.dll 导出函数 DnsFlushResolverCache(),通过本地 RPC 通知 Dnscache(DNS Client,dnscache.dll) 清空内存中全部 DNS 解析缓存(A/AAAA 记录、CNAME、NXDOMAIN 负缓存)。
 
⚠️ 仅清理本机客户端缓存;不修改 hosts、不清理 Windows DNS 服务器 (dns.exe) 缓存;对 nslookup 无效(nslookup 绕过 Dnscache)。
 
纯本地操作,无网络报文产生。

依赖文件

  1. 主程序:ipconfig.exe
  2. API 库:dnsapi.dll、rpcrt4.dll、kernel32.dll
  3. 后台模块:svchost.exe -k netsvcs 加载 dnscache.dll(Dnscache 服务)

依赖关系

✅ 硬性依赖:Dnscache(DNS Client)服务必须处于运行状态
 
服务停止 → 命令报错:无法刷新 DNS 解析缓存。
 
无需网络连通;不需要 Dhcp 服务。

逻辑链路

plaintext
ipconfig.exe → dnsapi.dll → RPC通道 → svchost(Dnscache/dnscache.dll)
                                  ↓
                         清空内存DNS缓存 → 返回结果给控制台

配套链

  1. PowerShell 等效:Clear-DnsClientCache
  2. 查看缓存:ipconfig /displaydns / Get-DnsClientCache
  3. 排错观测:Microsoft-Windows-DNS-Client/Operational 事件日志

二、ipconfig /release

底层原理

针对适配器 IPv4 DHCP 租约;下发指令给 Dhcp Client,构造并发送 DHCPRELEASE(UDP 68→67) 报文通知 DHCPv4 服务器归还 IPv4 地址;执行后网卡 IPv4 地址置为 0.0.0.0。
 
仅作用 IPv4;不会释放 IPv6 地址。

依赖文件

  1. 主程序:ipconfig.exe
  2. API 库:iphlpapi.dll、rpcrt4.dll、ws2_32.dll
  3. 后台模块:svchost.exe -k netsvcs 加载 dhcpcsvc.dll(Dhcp IPv4 客户端)
  4. 配置持久化:注册表
     
    HKLM\SYSTEM\CurrentControlSet\Services\Dhcp\Parameters\Adapters\{网卡GUID}

依赖关系

✅ 硬性依赖:Dhcp(DHCP Client)服务运行
 
✅ 目标网卡 IPv4 设置为「自动获取 (DHCP)」;静态 IP 网卡执行无效。
 
⚠️ 网络中断场景:报文发送失败,本地依然清空 IPv4 地址。

逻辑链路

plaintext
ipconfig.exe → iphlpapi.dll → RPC → svchost(dhcpcsvc.dll)
                                  ↓
                         ws2_32构造DHCPRELEASE报文
                         UDP 68→67 发送至DHCPv4服务器
                         网卡IPv4地址清零

配套链

  1. IPv4 续租配套:ipconfig /renew
  2. IPv6 释放配套:ipconfig /release6
  3. 抓包过滤:udp.port == 67 or udp.port == 68
  4. PowerShell:Remove-NetIPAddress -AddressFamily IPv4

三、ipconfig /renew6

底层原理

触发 DHCPv6 租约续租;客户端向 DHCPv6 服务器发送 RENEW 请求(UDP 546 ↔ 547),更新 DHCPv6 分配的 IPv6 地址、DNS、租期等参数。
⚠️ 重要边界:
 
renew6 仅针对【有状态 DHCPv6 分配地址】;无法刷新 SLAAC 自动生成的 IPv6 地址(SLAAC 不依赖 DHCPv6)。
 
上一条命令 ipconfig /release 只释放 IPv4,不影响 IPv6 租约,二者相互独立。

依赖文件

  1. 主程序:ipconfig.exe
  2. API 库:iphlpapi.dll、rpcrt4.dll、ws2_32.dll
  3. 后台模块:svchost.exe -k netsvcs 加载 dhcpcsvc6.dll(DHCPv6 客户端)

依赖关系

✅ 硬性依赖:Dhcp(DHCP Client)服务运行(dhcpcsvc6.dll 隶属于该服务)
 
✅ 网络环境存在 DHCPv6 服务器,网卡启用 DHCPv6 有状态获取。
 
⚠️ 纯 SLAAC 网络下,此命令无实质效果。

逻辑链路

plaintext
ipconfig.exe → iphlpapi.dll → RPC → svchost(dhcpcsvc6.dll)
                                  ↓
                         ws2_32构造DHCPv6 RENEW报文
                         UDP 546→547 和DHCPv6服务器交互
                         更新IPv6租约与相关网络参数

配套链

  1. IPv6 释放配套:ipconfig /release6
  2. 抓包过滤:udp.port == 546 or udp.port == 547
  3. 事件日志:Microsoft-Windows-Dhcp-Client/Operational

整套脚本存在的关键运维问题(重点提醒)

cmd
ipconfig /release        # 释放IPv4
ipconfig /renew6         # 仅续租IPv6
  1. IPv4 地址释放后,不会自动重新获取 IPv4!
     
    脚本只释放 IPv4,缺少 ipconfig /renew,执行完成后电脑没有 IPv4 地址,断 IPv4 网络。
  2. IPv4 DHCP 与 IPv6 DHCP 两套独立协议、两套独立客户端模块,互不影响。
  3. 优化修正版本(如需同时恢复 IPv4 + 刷新 IPv6):
cmd
echo 清除 DNS 缓存...
ipconfig /flushdns

echo 释放IPv4地址并重新获取IPv4
ipconfig /release
ipconfig /renew

echo 刷新DHCPv6地址
ipconfig /renew6

服务依赖总览

命令 依赖后台服务 协议端口
ipconfig /flushdns Dnscache 本地 IPC,无端口
ipconfig /release Dhcp(dhcpcsvc.dll) DHCPv4 UDP 67/68
ipconfig /renew6 Dhcp(dhcpcsvc6.dll) DHCPv6 UDP 546/547

 

ipconfig /displaydns 

一句话定性:它不是直接读取磁盘文件,是用户态工具,通过 Win32 API + LPC/RPC 跨进程读取 Dnscache(DNS Client)服务内存里的全局 DNS 解析缓存,再格式化文本输出;缓存全部驻留内存,不持久化落盘

一、底层原理

Windows 有两级 DNS 缓存:

  1. 进程内 Winsock 缓存(ws2_32.dll):每个应用私有,短暂存活,ipconfig /displaydns 看不到
  2. 系统全局 Resolver 缓存(Dnscache 服务内存):/displaydns 读取的数据源,本机所有程序共用;包含正向缓存(A/AAAA/CNAME/MX)、负缓存(NXDOMAIN,域名不存在)

核心 API:DnsGetResolverCache()(dnsapi.dll 导出)

  • 作用:从 Dnscache 服务拉取全部缓存条目结构体数组
  • 对比:ipconfig /flushdns 调用 DnsFlushResolverCache(),写操作清空内存缓存
  • PowerShell 等价:Get-DnsClientCache,同源数据,只是输出格式不同

关键区分:

  • nslookup 直接调用 DNS 协议查询上游 DNS,绕过 Dnscache,结果不会写入这个全局缓存,也不会被 displaydns 看到
  • hosts 文件解析优先级高于 Dnscache,hosts 结果不写入 Dnscache 缓存,displaydns 永远看不到 hosts 条目

二、依赖文件清单

文件 路径 角色
ipconfig.exe %SystemRoot%\System32\ipconfig.exe 主程序,解析命令行参数/displaydns,格式化输出文本
dnsapi.dll System32 核心 API 库,导出 DnsGetResolverCache、DnsFlushResolverCache,封装 RPC 调用
rpcrt4.dll System32 RPC/LPC 本地跨进程通信,ipconfig.exe ↔ svchost.exe (Dnscache)
iphlpapi.dll System32 IP Helper,网卡、网络配置辅助接口(ipconfig 基础依赖)
dnscache.dll 加载进 svchost.exe (netsvcs) Dnscache 服务核心模块,内存缓存管理、TTL 老化、NRPT 策略匹配
kernel32.dll System32 进程加载、内存、基础系统调用
advapi32.dll System32 服务控制、权限、注册表读取
tcpip.sys 内核驱动 TCP/IP 协议栈,DNS UDP 报文收发(不是 displaydns 直接调用,是 Dnscache 服务依赖)
dnsclient.sys 内核驱动 DNS 客户端内核组件,报文处理、EDNS0、DoH 底层收发

服务载体:svchost.exe -k netsvcs,托管 Dnscache(DNS Client)服务。 ⚠️ 若 Dnscache 服务停止,ipconfig /displaydns 直接报错,无法读取缓存。

三、调用链(时序,自上而下)

CMD/PowerShell 启动 ipconfig.exe
    ↓
ipconfig.exe 识别参数 /displaydns
    ↓
ipconfig.exe 加载 dnsapi.dll,调用 DnsGetResolverCache()
    ↓
dnsapi.dll → rpcrt4.dll 建立本地LPC/RPC通道
    ↓
RPC请求发送到 svchost.exe(netsvcs) 内的 dnscache.dll
    ↓
dnscache.dll 遍历自身内存哈希表(DNS缓存库)
    ↓
Dnscache把缓存条目结构体数组通过RPC回传给dnsapi.dll
    ↓
dnsapi.dll返回数据给ipconfig.exe
    ↓
ipconfig.exe 循环解析每条记录(Name/Type/TTL/Data),格式化文本输出到控制台

四、逻辑链(DNS 解析全链路,和 displaydns 的关系)

  1. 应用请求域名解析 → 优先读 hosts 文件(hosts 不走 Dnscache)
  2. hosts 不命中 → 查询 Dnscache 内存缓存(就是 displaydns 读取的数据集)
    • ✅ 命中且 TTL 未过期:直接返回 IP,不访问网络 DNS 服务器
    • ❌ 未命中 / TTL 过期:Dnscache 发起 UDP53 查询上游 DNS 服务器
  3. 收到上游应答:
    • 正向应答:写入 Dnscache 内存缓存,按应答 TTL 计时;displaydns 可见
    • NXDOMAIN(域名不存在):写入负缓存 NegativeCache,默认 300s,displaydns 也会列出负缓存记录
  4. TTL 倒计时归零 → Dnscache 自动从内存删除条目;重启 Dnscache 服务,全部缓存清空

配套控制:NRPT(名称解析策略表),Dnscache 内置匹配引擎,可强制域名走指定 DNS/DoH,匹配结果同样存入缓存,displaydns 可见。 注册表控制项:HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters

  • MaxCacheEntryTtlLimit:全局 TTL 上限(默认 86400s=1 天)
  • NegativeCacheTime:负缓存时长,默认 300 秒博客园

五、配套链(周边组件,协同但非直接调用)

  1. 网卡 + TCPIP 协议栈 (tcpip.sys):Dnscache 用来向外发送 DNS UDP 报文;ipconfig.exe 读取网卡 DNS 服务器地址(iphlpapi)
  2. Hosts 文件 C:\Windows\System32\drivers\etc\hosts:解析优先级更高,但不进 Dnscache 缓存,displaydns 看不到
  3. Winsock ws2_32.dll:应用层域名解析入口,每个进程私有小缓存,独立于 Dnscache 全局缓存
  4. 浏览器内置 DNS 缓存(Chrome/Edge/Firefox):独立缓存,完全脱离 Dnscache,displaydns 看不到浏览器缓存
  5. 上游递归 DNS 服务器:Dnscache 缓存 miss 时才去查询;上游 DNS 缓存本机命令无法查看、无法刷新

六、边界(限制、误区、失效场景)

✅ 能力边界

  1. 只读取Dnscache 全局内存缓存,不读磁盘文件;重启 Dnscache / 主机,缓存全部丢失
  2. 可展示:A、AAAA、CNAME、MX、SRV、PTR、TXT、负缓存 (NXDOMAIN)
  3. 只读取本机系统级 DNS Client 缓存;看不到进程私有 ws2_32 缓存、浏览器缓存、hosts、上游 DNS 服务器缓存
  4. 缓存 TTL 受注册表MaxCacheEntryTtlLimit封顶,即使 DNS 应答 TTL 很大,最多按注册表上限保存

❌ 失效 / 不生效边界

  1. Dnscache 服务(DNS Client)停止 → 命令直接失败,无法读取
  2. 注册表设置MaxCacheEntryTtlLimit=0 → 全局缓存关闭,displaydns 几乎无记录
  3. nslookup 的查询结果不会写入 Dnscache 缓存,查完域名,displaydns 看不到该条目(高频踩坑点)
  4. hosts 匹配的域名解析,不会存入 Dnscache 缓存,displaydns 看不到 hosts 映射
  5. 负缓存:NXDOMAIN 会缓存,会造成 “域名改解析后,本机依然报不存在”,需要ipconfig /flushdns清除负缓存
  6. 缓存有容量上限,条目过多,旧条目会被 LRU 淘汰,不等 TTL 到期就消失

⚠️ 运维边界

  • 管理员权限不是必须,普通用户即可执行ipconfig /displaydns;但/flushdns需要管理员权限
  • 大缓存条目,输出文本极长,建议管道过滤:
ipconfig /displaydns | findstr "Record Name"

七、对比:/displaydns vs /flushdns

命令 操作类型 API 动作
ipconfig /displaydns 读 DnsGetResolverCache RPC 读取 Dnscache 内存缓存,格式化输出
ipconfig /flushdns 写 DnsFlushResolverCache RPC 通知 Dnscache 清空全部内存缓存

ipconfig /flushdns 完整解构

一句话定性:ipconfig /flushdns 是 Windows 用户态工具,通过 dnsapi.dll 导出 API,经由 RPC/LPC 跨进程通知 svchost 托管的 Dnscache(DNS Client)服务,清空内存内的全局 DNS 解析缓存;不会修改 hosts、不会重置网卡 DNS、不会清理上游 DNS 服务器缓存。

一、底层原理

Windows 的系统全局 DNS 缓存由 Dnscache 服务(dnscache.dll)维护,全部驻留在内存,无持久化磁盘文件。 ipconfig /flushdns 的本质:发起 RPC 指令,让 Dnscache 服务执行缓存哈希表的清理操作。

  • 核心 API:DnsFlushResolverCache()(dnsapi.dll 导出)
  • 作用:请求 Dnscache 清空所有全局 Resolver 缓存,包含两类:
    1. 正向缓存(A/AAAA/CNAME/MX/TXT 等正常解析记录)
    2. 负缓存(NXDOMAIN 域名不存在、应答失败的负向缓存)

重要区分:

  1. 仅清空 Dnscache 全局内存缓存;进程私有 Winsock 缓存(ws2_32)、浏览器内置 DNS 缓存不受影响
  2. hosts 文件不进 Dnscache 缓存,flushdns不会刷新 hosts
  3. nslookup 绕过 Dnscache,它的查询结果不写入 Dnscache,flushdns 对 nslookup 本身查询逻辑无影响
  4. 上游 DNS 服务器(公共 DNS / 企业 DNS)的缓存,本机完全无法清除

二、依赖文件清单

文件 路径 角色说明
ipconfig.exe %SystemRoot%\System32\ipconfig.exe 主程序,解析命令行参数 /flushdns,调用 dnsapi.dll
dnsapi.dll System32 核心 DNS 客户端 API 库,导出 DnsFlushResolverCache,封装 RPC 请求
rpcrt4.dll System32 RPC/LPC 本地跨进程通信组件,ipconfig.exe ↔ svchost (Dnscache)
iphlpapi.dll System32 IP Helper API,ipconfig 基础依赖(网卡信息读取,本次 flushdns 不核心调用)
dnscache.dll 加载于 svchost.exe -k netsvcs Dnscache 服务核心模块,维护 DNS 缓存哈希表,执行清空动作
kernel32.dll System32 进程加载、基础系统调用
advapi32.dll System32 权限校验、服务相关辅助接口
tcpip.sys / dnsclient.sys 内核驱动 Dnscache 向外查询 DNS 报文依赖;flushdns 不直接调用内核驱动

服务载体:svchost.exe 托管 Dnscache(DNS Client)。 如果 Dnscache 服务停止,ipconfig /flushdns 会报错:无法刷新 DNS 解析缓存。

三、调用链(时序,自上而下)

CMD/PowerShell 启动 ipconfig.exe
    ↓
ipconfig.exe 识别命令行参数 /flushdns
    ↓
ipconfig.exe 加载 dnsapi.dll,调用导出函数 DnsFlushResolverCache()
    ↓
dnsapi.dll 通过 rpcrt4.dll 建立本地LPC/RPC通道
    ↓
发送RPC控制请求到 svchost.exe(netsvcs) 内的 dnscache.dll
    ↓
dnscache.dll 收到指令:
        遍历内存中的DNS缓存哈希表
        释放全部缓存条目内存、清空正向缓存+负缓存
        重置缓存LRU链表
    ↓
Dnscache 返回操作成功/失败状态码,沿RPC原路回传
    ↓
dnsapi.dll 将结果返回ipconfig.exe
    ↓
ipconfig.exe 打印文本:成功刷新DNS解析缓存

四、逻辑链(DNS 缓存生命周期 + flushdns 介入时机)

  1. 应用请求域名解析 → 优先读取 hosts(不走 Dnscache)
  2. hosts 未命中 → 查询 Dnscache 内存缓存
    • 命中且 TTL 有效 → 直接返回 IP,不访问网络 DNS
    • 未命中 / TTL 过期 → Dnscache 向上游 DNS 服务器发起查询
  3. 上游 DNS 返回应答:
    • 正常应答 → 写入 Dnscache 内存缓存,附带 TTL
    • NXDOMAIN(域名不存在)→ 写入负缓存,默认 300s
  4. 两种清除缓存方式:
    • 被动:TTL 倒计时结束 / LRU 淘汰,自动删除条目
    • 主动:ipconfig /flushdns → 强制清空整张缓存表,不分 TTL 是否到期,正向、负缓存全部清除
  5. 缓存清空之后:下一次域名解析请求,Dnscache 会重新向上游 DNS 查询,重新写入缓存

NRPT(名称解析策略表):flushdns不会修改 / 清空 NRPT 策略;NRPT 是规则,不是缓存。 注册表参数 HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters:MaxCacheEntryTtlLimit、NegativeCacheTime 这些参数不会被 flushdns 修改,只是控制缓存规则。

五、配套链(协同组件,非直接调用)

  1. hosts 文件 C:\Windows\System32\drivers\etc\hosts:优先级高于 Dnscache;flushdns不操作 hosts,修改 hosts 后不需要 flushdns 生效。
  2. ws2_32.dll Winsock 进程私有缓存:每个应用独立缓存,和 Dnscache 全局缓存隔离;flushdns无法清理,需要重启对应进程。
  3. 浏览器 DNS 缓存(Chrome/Edge/Firefox):浏览器独立缓存,完全脱离 Dnscache;flushdns 无效,需要浏览器内部清除缓存或重启浏览器。
  4. 网卡 DNS 服务器配置:ipconfig /flushdns不会修改网卡静态 / 自动 DNS 地址;修改网卡 DNS 不需要 flushdns。
  5. 上游递归 DNS 服务器:本机 flushdns 仅清本机 Dnscache;上游 DNS 服务器缓存,本机无权限操作。

六、边界(能力边界、限制、失效场景、权限边界)

✅ 能力边界

  1. 只清空Dnscache 服务内存全局 DNS 缓存,正向 + 负缓存全部一次性清除。
  2. 不修改任何注册表、网卡配置、hosts 文件。
  3. 不重启 Dnscache 服务,服务进程 svchost 继续运行,只是缓存内存被清空。

🔐 权限边界

ipconfig /flushdns 需要管理员权限 普通用户执行会直接报错:请求的操作需要管理员权限 对比:ipconfig /displaydns 普通用户即可运行,仅读缓存,不需要管理员。

❌ 失效 / 不生效边界

  1. Dnscache(DNS Client)服务停止 → RPC 无法连接,刷新失败。
  2. 注册表设置 MaxCacheEntryTtlLimit=0:全局缓存关闭,本来就没有缓存,执行 flushdns 提示成功但无实质动作。
  3. 只能清本机 Dnscache 缓存:
    • 无法清除进程 Winsock 私有缓存
    • 无法清除浏览器内置 DNS 缓存
    • 无法清除网关、上游 DNS 服务器缓存
  4. hosts 文件变更:不需要 flushdns,hosts 实时读取;很多运维踩坑误区,改 hosts 执行 flushdns 属于无效操作。
  5. nslookup:本身绕过 Dnscache,flushdns 对 nslookup 查询行为无影响。

⚠️ 运维边界

  • 执行 flushdns 不会断开已建立 TCP 连接;已建立的 Socket 连接不会重新做域名解析。
  • 对于长连接业务(数据库、API 长连接),旧连接继续使用旧 IP;新建连接才会重新 DNS 查询。

七、ipconfig /flushdns vs ipconfig /displaydns 对照

命令 操作类型 API 权限 行为
ipconfig /displaydns 读 DnsGetResolverCache 普通用户 RPC 读取 Dnscache 内存缓存并输出
ipconfig /flushdns 写(清空) DnsFlushResolverCache 管理员 RPC 通知 Dnscache 清空全部内存缓存

八、补充:替代方案(同底层 API)

PowerShell:

Clear-DnsClientCache

底层调用的就是同一个 DnsFlushResolverCache API,等价于 ipconfig /flushdns,同样需要管理员权限。


 

posted @ 2024-09-24 02:38  suv789  阅读(837)  评论(0)    收藏  举报