# Windows 刷新 DNS 缓存：ipconfig /flushdns 用法

在 Windows 10 或 Windows 11 上刷新 DNS，打开命令提示符或终端运行 `ipconfig /flushdns` 就行，PowerShell 里用 `Clear-DnsClientCache` 效果一样，微软的 [cmdlet 文档](https://learn.microsoft.com/en-us/powershell/module/dnsclient/clear-dnsclientcache) 写明运行它等同于运行 `ipconfig /flushdns`。

刷新只清掉一层，也就是 Windows 的 DNS 客户端缓存，路由器、DNS 服务商、浏览器自己的 DNS 缓存和网卡都不受影响，所以它能修好一个过期的域名解析，别的基本修不了。下面讲清楚什么时候问题真的出在这一层，怎么查看里面存了什么，大家常跟它搭配的那几条更重的重置命令，以及每条命令各改了什么。

## DNS 客户端缓存里存了什么

应用连到 `example.com` 之前，Windows 得先把这个域名换成 IP 地址，DNS Client 服务会把已经拿到的结果存下来，同一个域名再查时就不用每次都走网络。微软的 [ipconfig 文档](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/ipconfig) 说这份缓存既有从本地 Hosts 文件预载的条目，也有这台电脑最近解析过的域名记录，并且服务会「在查询已配置的 DNS 服务器之前」先用它。

每条记录按该域名 DNS 服务器给的生存时间（TTL）保留，到期再重新获取。失败的结果也会被缓存，同一份文档提到 `/flushdns` 可以「丢弃否定缓存条目」，也就是那些说某个域名不存在的回答，这就是为什么一个网站失败过一次后，可能在一台电脑上一直打不开，其他设备却都正常。

想看缓存里有什么、又不改动任何东西：

```cmd
ipconfig /displaydns
```

或者在 PowerShell 里只看某一个域名：

```powershell
Get-DnsClientCache -Entry example.com
```

[`Get-DnsClientCache`](https://learn.microsoft.com/en-us/powershell/module/dnsclient/get-dnsclientcache) 可以按记录类型、状态（`Success`、`NotExist` 或 `NoRecords`）和 TTL 筛选，比 `ipconfig` 那一长串好读得多，一个本该能用的域名如果显示 `NotExist`，就是缓存住的失败结果。

## 什么时候刷新 DNS 有用

| 情况 | 刷新为什么有用 |
|---|---|
| 网站或服务器换了新地址，这台电脑还连到旧地址 | 旧记录还没从本地缓存里过期 |
| 你在设置里改了 DNS 服务器 | 上一个服务器给的结果还在缓存里 |
| 改了 hosts 文件，改动好像没生效 | 缓存里有从 hosts 文件预载的条目，还有这个域名之前的解析结果 |
| 开关过 VPN 或代理，有些域名仍然解析到另一边 | 经另一条路径拿到的记录还在缓存里 |
| 本地开发用的域名改指向了新地方 | 缓存的结果，或缓存的「不存在」，还在被复用 |
| 某个域名在这里打不开，同一网络下的手机却正常 | 失败的解析可能被存成了否定条目 |

这几种情况的办法都一样，先刷新，再看 Windows 现在解析出来的是什么（见下面的确认一节），然后重试应用。浏览器要退出再重新打开，不要只刷新标签页，原因在下一节。

## 什么时候刷新 DNS 没用

域名可以在好几个地方被应答，Windows 缓存只是其中一处，刷新也只动这一处。

- **网络服务商或网站本身挂了。** 如果所有网站都打不开，或者同一网络下的其他设备也打不开，问题在上游，刷新改变不了什么。
- **路由器或 DNS 服务商手里是旧记录。** 它们也会缓存结果，本地刷新没法让它们早点去拿新记录，只能等它们那份到期。
- **浏览器自己解析域名。** Chrome 的[帮助页面](https://support.google.com/chrome/answer/10468685?hl=en&co=GENIE.Platform%3DDesktop)说安全 DNS 默认以自动模式开启，基于 Chromium 的浏览器还有自己的主机解析缓存。Chromium 的 net-internals 页面在 "Host resolver cache" 下有个 "Clear host cache" 按钮（[源码](https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/resources/net_internals/index.html)），在 Chrome 里打开 `chrome://net-internals/#dns`，在 Edge 里打开 `edge://net-internals/#dns`，点一下就行。同一页面的 Sockets 部分还有 "Flush socket pools"，Chromium 给它标了 "May break pages with active connections"，用之前先把重要的标签页关掉。
- **DNS 服务器设置本身就错了。** 如果 Windows 指向的服务器给错误结果或干脆不回应，刷新只是再问一遍同一个服务器。去设置 › 网络和 Internet › WLAN › 管理已知网络（或以太网）里检查，选中你的网络，再点 IP 分配旁边的「编辑」。微软的[网络设置页面](https://support.microsoft.com/en-us/windows/essential-network-settings-and-tasks-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9)说自动（DHCP）会从路由器或接入点获取 DNS 服务器地址，也推荐用这个。公司电脑如果连着 VPN，改这里可能让内网域名失效，先问管这台电脑的人。
- **网页只是慢，并没有打不开。** 解析结果之所以缓存，正是因为复用起来很快，下载慢或视频卡顿很少是 DNS 的问题，缓存清空后接下来几次解析反而会稍微慢一点，不会更快。

## 刷新和查看缓存的命令

在命令提示符或终端里：

```cmd
ipconfig /flushdns
ipconfig /displaydns
```

在 PowerShell 里：

```powershell
Clear-DnsClientCache
Get-DnsClientCache
```

微软这两份文档都没说这些命令需要管理员权限，Mole for Windows 也是在普通、未提权的进程里做同样的刷新。如果受管理的电脑报了拒绝访问，就以管理员身份打开终端或命令提示符再运行。刷新不会删除磁盘上的任何东西，也不用重启，应用再去解析域名时缓存会自己填回来。

别把刷新做成计划任务，也别当提速技巧塞进开机脚本，热缓存才是快的那条路，刷新只在某条记录确实错了的时候有用。

## 先查 hosts 文件，再怪缓存

hosts 文件里列出的域名会绕过 DNS。微软的 [hosts 重置文章](https://support.microsoft.com/en-us/windows/experience/how-to-reset-the-hosts-file-back-to-the-default)给出的文件夹是 `%WinDir%\System32\Drivers\Etc`，通常就是 `C:\Windows\System32\drivers\etc`，文件名叫 `hosts`，没有扩展名。按那篇文章的说法，默认文件里只有以 `#` 开头的注释行，以及 `localhost` 的环回映射。

开发工具、广告拦截器和一些老教程有时会往这里加几行，用完也不删。如果出问题的域名出现在这个文件里，它解析成那样就是这一行造成的。要改的话先留一份备份（微软的文章是把旧文件改名成 `Hosts.old`），用以管理员身份运行的编辑器只改需要的那一行，保存时别加上 `.txt` 扩展名，然后运行 `ipconfig /flushdns`，让缓存不再留着旧的预载条目。不要删除这个文件，也不要改它的权限。

## 更重的重置命令各改了什么

微软的 [Wi-Fi 故障排除文章](https://support.microsoft.com/en-us/windows/experience/connectivity-networking/fix-wi-fi-connection-issues-in-windows)把这几条命令列在一起，要在管理员命令提示符里按这个顺序运行：

```cmd
netsh winsock reset
netsh int ip reset
ipconfig /release
ipconfig /renew
ipconfig /flushdns
```

它们做的事差别很大，只有最后一条跟 DNS 有关：

- **`ipconfig /release`** 会发出 DHCP 释放，按 [ipconfig 文档](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/ipconfig)的说法，还会停用设为自动获取地址的网卡上的 TCP/IP，在 `/renew` 拿到新地址之前你都是断网的，所以别在远程桌面会话里单独运行它。
- **`ipconfig /renew`** 向 DHCP 请求一份新配置，只对设为自动获取地址的网卡有效。
- **`netsh winsock reset`** 把 Winsock 目录恢复到干净状态，移除自定义的分层服务提供程序（[netsh winsock](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netsh-winsock)），有些 VPN 客户端和安全软件会装这类提供程序，运行后记得检查一下这些应用。
- **`netsh int ip reset`** 会覆盖注册表里 TCP/IP 和 DHCP 的参数键，微软的 [TCP/IP 重置文章](https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/reset-tcp-ip-net-shell)说效果等同于卸载再重装 TCP/IP。它需要管理员权限和重启，文中的示例日志显示静态 IP 地址、网关和 DNS 服务器都会被重置，如果这些是你手动设的，先记下来。
- **网络重置**在设置 › 网络和 Internet › 高级网络设置 › 网络重置里，会移除所有网卡及其设置，电脑重启后再按默认值重新安装。微软的 Wi-Fi 文章提醒，你可能需要重新安装并配置 VPN 客户端软件或 Hyper-V 虚拟交换机，已知网络也可能被设成公用网络配置文件。

如果唯一的症状是某个域名解析到旧地址或解析不出来，这些都用不上。它们是给整体连不上网的情况准备的，而且要在刷新、检查过 DNS 服务器和 hosts 文件都解释不了之后再用。

## 确认问题解决了

1. 只问缓存，看看 Windows 手里这个域名存的是什么：

   ```powershell
   Resolve-DnsName example.com -CacheOnly
   ```

   [`Resolve-DnsName`](https://learn.microsoft.com/en-us/powershell/module/dnsclient/resolve-dnsname) 加上 `-CacheOnly` 会「只用本地缓存解析这次查询」。刷新后马上运行一次，应用重试后再运行一次，就能看到缓存的是哪个结果。

2. 正常解析一次，再跳过 hosts 文件解析一次，对比两者：

   ```powershell
   Resolve-DnsName example.com
   Resolve-DnsName example.com -NoHostsFile
   ```

   如果两个结果不一样，原因就在 hosts 文件的某一行。

3. 直接问 DNS 服务器。按 [nslookup 文档](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/nslookup)，第二个参数是要查询的服务器，不写的话 nslookup 用默认的 DNS 名称服务器。

   ```cmd
   nslookup example.com
   nslookup example.com 1.1.1.1
   ```

   如果你配置的服务器返回旧地址，另一台服务器返回新地址，说明旧记录还缓存在上游，等就行了。如果两边都返回旧地址，说明这条记录还没改。

4. 退出并重新打开出问题的浏览器或应用，如果是 Chrome 或 Edge，再清一下它的主机缓存。

## Mole 能做什么

Mole for Windows 在优化里的网络与搜索分组中有一项「刷新 DNS 缓存」，它调用 Windows 的 `DnsFlushResolverCache` 函数，清的就是 `ipconfig /flushdns` 清的那份 Windows DNS 客户端缓存，而且不弹管理员提示。[Windows 帮助页面](/zh/windows/help)把它和优化里的其他维护项列在一起，[Windows 优化都做了什么](/zh/windows/blog/what-windows-optimization-does)讲了每项任务对应什么症状。

Mole 的网络修复就这么多，它不重置 Winsock 或 TCP/IP，不释放或续订地址，不重装网卡，也不碰 VPN 连接、静态地址、hosts 文件或浏览器自己的主机缓存，这些请用上面的命令。如果你是因为浏览器变慢而不是某个域名打不开才找过来的，浏览器存储的问题在 [Windows 缓存指南](/zh/windows/blog/windows-cache-cleanup)里讲过。

## 常见问题

### Windows 11 怎么刷新 DNS？

在命令提示符或终端里运行 `ipconfig /flushdns`，或者在 PowerShell 里运行 `Clear-DnsClientCache`，两者都立即生效，不用重启。

### 刷新 DNS 会清掉 Chrome 或 Edge 的 DNS 缓存吗？

不会。打开 `chrome://net-internals/#dns` 或 `edge://net-internals/#dns`，点 "Clear host cache"，再重新打开浏览器。

### 刷新 DNS 缓存安全吗？

安全，它只丢掉缓存的解析结果，下次请求时 Windows 会重新获取。常跟它列在一起的那些重置命令，比如 `netsh int ip reset` 或网络重置，改动大得多，可能会清掉静态设置或 VPN 网卡。

### 为什么刷新后网站还是去旧地址？

检查 hosts 文件、浏览器自己的缓存，再看看用 `nslookup` 问你的 DNS 服务器是不是还返回旧地址。如果服务器或路由器手里还是旧记录，本地刷新改变不了，只能等那份到期。


Canonical: https://mole.fit/zh/windows/blog/flush-dns-windows
