DNS解析是什么意思?网址敲完回车到网页弹出来,中间这几步我拿nslookup跑了一遍

上个月我把路由器的DNS改成了223.5.5.5,教程收尾一步让我敲ipconfig /flushdns。这条命令我敲过不下十回,每一回都是照抄,从没想过它清的是什么。上礼拜同事问我「为啥我改完DNS,网页还是老样子打不开,过了五六分钟自己好了」,我卡壳了。为了把这事说清楚,我拿nslookup把自己网站的解析全过程跑了一遍,顺手把缓存和TTL这笔账算明白了。
先说清楚DNS在翻译什么
电脑联网只认IP地址,IP是什么我写过一篇,这里只说一句:机器认49.51.202.150这种号码,人只记得住www.shunot.com这种名字。DNS干的就是翻译——你敲网址,它查出对应的IP,浏览器再拿着IP去连服务器。相当于打电话前的114查号台,你报名字,它报号码。
最早没有DNS的时候,全互联网的「通讯录」是一个hosts文件,所有域名和IP写在一个文本里,靠人工下载同步。这文件现在还躺在你电脑里:C:\Windows\System32\drivers\etc\hosts,记事本打开能看到一行127.0.0.1 localhost。我第一次碰它是在学校机房,当年不少事就是靠改这一行文件办成的。它的规矩到今天没变:hosts里有的,系统直接用,压根不去问DNS。所以排查DNS问题时先翻一眼这文件,看有没有被人塞进奇怪的行——有些破解软件就爱往里写东西,写一行,某个网站就在你电脑上永久「查无此人」。
一次解析到底问了谁
你的电脑自己不去满世界问,它只问一个「递归解析器」——默认是运营商自动下发的DNS,因为DHCP发地址的时候顺手把DNS地址一起发了,这事我写DHCP那篇时拆开讲过。我家路由器里填的是223.5.5.5,全屋设备的DNS查询最后都归它接。
你问它一次,它必须交出一个最终答案,这叫递归查询。至于它自己怎么跑腿,你不用管:它先去问根服务器「谁知道.com」,根说「这归.com那批服务器管」;它再问.com「谁知道shunot.com」,.com说「去问这个域名的权威服务器」;权威服务器最后把IP交出来。一级一级问、每一级只告诉你「下一步问谁」,这种方式叫迭代查询。全球13组根服务器,每个顶级域一批服务器,每个域名后面挂着自己的权威DNS,三层问下来通常几十毫秒收工。
递归、迭代这俩词第一次听着都拗口,我给你个记法:递归是你甩手掌柜只问一次,迭代是解析器一级级跑腿问路。你跟递归解析器打交道只有一问一答,跑腿的辛苦全在它那头。还有个冷知识:这一问一答走的是UDP 53端口,一个来回不过几十字节,DNS绝大多数时候用UDP不用TCP,就是因为包小、一问一答,握手三次太浪费。视频会议、游戏那些讲究可靠传输的才走TCP,查个门牌号,丢了大不了重问一遍。
验证这步有现成命令:nslookup www.shunot.com 223.5.5.5,意思是「别用默认的那台,指定问223.5.5.5」。返回结果最上头两行写着你问的是哪台服务器,下面的Address就是答案。nslookup最常用的玩法就是指定不同服务器各查一遍,对比答案。
答案不是每次都现问:三层小本本
要是每开一个网页都跑一遍根、顶级域、权威三层,再快的网也扛不住。所以答案会被记在小本本上,一共三层:浏览器有自己的缓存;系统有自己的缓存,ipconfig /displaydns能整个翻出来,域名、IP一条条列着;最外头,223.5.5.5那台递归解析器持着一个最大的本子,所有问过的人共用。
每条记录旁边跟着一个TTL(Time To Live),单位秒,是域名主人在自己DNS后台设的「保鲜期」。我实测自己网站的TTL是120秒——答案最多被缓存两分钟,倒计时归零就得重新去问权威。盯这个数字特别有意思:我连着查了两次,第一次返回TTL是95,隔十秒再查,返回的却是120。95说明缓存里那份还剩95秒;十秒后旧账过期,解析器重新问了权威,拿回来一份满血的120。一个数字的跳动,把「缓存」和「倒计时」两件事全说明白了。
换着服务器查www.qq.com更有意思:223.5.5.5给我TTL 44,119.29.29.29给86,8.8.8.8给120。同一个域名,三台解析器倒计时各不相同——因为它们各自在不同时刻把答案抄进了自己的本子,你查到的永远是「我这份还剩几秒」。有次同事拿两个工具查出对不上的时间,以为哪家DNS坏了,其实只是各家缓存的新旧不一样,都在正常干活。
顺带一个日常能感知的现象:清完缓存后头一次开网页,总比平时慢半拍才出字,第二下就快了。这不是错觉,是本机小本本空了,这次真得跑到解析器那层去拿答案;拿回来记下,后面几刀全是本子命中。想亲眼看看自己电脑记了多少条,敲ipconfig /displaydns,我那台老笔记本一屏都翻不完,全是这几天逛过的网站名字和它们剩下的秒数,跟一抽屉过期的便利贴似的。
为什么改了DNS不马上生效
回到同事那个问题,他改完DNS过了五六分钟才见效,卡的就是缓存。改DNS只是换了「以后问谁」,不清「已经记住的答案」。三层本子各有各的命:
- 系统这层最好办,
ipconfig /flushdns一敲就清空,这就是教程让你敲它的原因; - 浏览器这层最倔,新版Chrome连清缓存的入口都收起来了,最省事的办法是整个退出再开;
- 解析器那层你够不着,223.5.5.5本子里存的旧答案只能等它自己的TTL归零——这就是「等几分钟自己好了」的全部真相。
改完想确认生效没生效,别盯着网页瞎等,还是nslookup:敲nslookup www.shunot.com(不带第二个参数),看最上面「服务器」那两行显示的是谁。显示成你新填的地址,说明系统这层已经换人了;显示的还是老地址,多半是网卡没重新拿配置,断开重连一次WiFi就好。我给同事远程弄的那次,他就卡在这——DNS改了,电脑还捧着旧配置问老服务器。
还有个容易漏的:微信、QQ这类App不走系统那套缓存,自己另记一份。有时候网页全好了就它转圈,重启App比什么都管用。顺带说个经典症状——微信能发消息、网页打不开,八成就是DNS病:微信的服务器地址它自己记着,不靠现查;网页靠现查,查不到才转圈。丢包和DNS怎么分辨我写过,一句话版:ping公网IP通、ping域名不通,DNS的锅跑不了。
两台电脑查出不一样的IP,不是劫持
我查www.qq.com时还撞上一件事:223.5.5.5返回两个IP(121.14.77.221和121.14.77.201),119.29.29.29也返回这两个,顺序却是反的。这不是谁被劫持,是大站的CDN玩法——一个域名后头挂多台服务器,DNS按「谁离你近」排顺序,设备一般拿第一个用。你家和我家查同一个视频网站查出不同IP,再正常不过,先别急着报警。
真劫持长另一个样:查出来的IP根本打不开,或者一进去全是广告页。验证还是靠nslookup,指定问8.8.8.8和问运营商的各查一遍,两边答案差得离谱才有嫌疑。这背后还有个「运营商抢答UDP 53端口」的老话题——你明明问的是8.8.8.8,运营商在半路替它答了,我在光猫改DNS那篇里踩过完整的坑。另外要是你路由器里的DNS三天两头被改回去,那得先怀疑机器被人动过,被黑自查那篇里有份清单。
什么症状该怀疑DNS,按这个顺序来
| 症状 | 是不是DNS的事 | 先动什么 |
| 微信能发,网页全转圈 | 八成是 | nslookup指定223.5.5.5查一遍,通就把DNS改掉,怎么配看这篇 |
| 个别网站打不开,别的都好 | 有可能 | 先敲flushdns清本机,再指定8.8.8.8单查这个域名 |
| 网页全打不开,微信也发不出 | 多半不是 | 那是断网,按断网的排查顺序走 |
| 网页慢,但都能打开 | 关系不大 | DNS只管「找到门牌」那一下,快慢是带宽和延迟的事,延迟我单独写过 |
收尾顺序给你排好:网页打不开,先ping网关再ping公网IP,分清是断网还是DNS病;nslookup指定223.5.5.5查一遍;通了就flushdns清本机缓存;还不行进路由器后台把DNS改掉,我家小米那台在31.1里改;再不行就查光猫那一层。对了,IPv6也有自己的一套DNS查询,查的是AAAA记录,v6地址那篇里讲过它俩并存的模样。这套走完,DNS的坑基本能自己踩平。

发表评论