1.问题描述
需求:使用内网域名调用接口。
问题:从浏览器能够正常访问,但Java客户端调用报错"java.net.UnknownHostException",命令行也ping不通“ping: cannot resolve xx.xx.com: Unknown host”。
2.解决过程
检查DNS配置,发现总共配置了三个DNS:
192.168.xx.xxx
114.114.114.114
8.8.8.8
1.删去了后两个,只保留内网DNS,即本地域名服务器(Local Name Server),发现问题神奇地消失了。(迷惑)
2.我又将后两个DNS加了进去,重新从Java Client和Terminal访问,居然正常了。(更加迷惑)
3.过了一会又访问不通了,回到了问题的起点。(到底是什么原因呢?)
4.又过了一会又访问通了,仿佛背后有鬼魅之力在作怪,但其实是由于自己的计算机网络知识比较欠缺,才看不清问题的本质。(相信自己一定能捉住那个鬼)
5.在问题反复出现、反复消失之后,脑海里出现一个词“缓存”。有没有可能是缓存引起的?然后当问题重现时,我手动清除了DNS缓存,发现问题解决了。这样重复解决了多次之后,我确定清除缓存是解决办法之一。(知道了鬼的脾性,但还没捉住)
#MacOS清除DNS缓存命令
sudo dscacheutil -flushcache;
sudo killall -HUP mDNSResponder
6.后来又遇到清楚缓存也不管用的情况,然后删除后两个DNS,只保留本地DNS,就好了。(真是活见鬼)
3.问题分析
一会正常,一会异常,可能是本地域名服务器不稳定导致的。
目前能够正常使用,暂不深究,也没什么思路了,所以继续去解决其他问题,本问题暂且搁置。
4.知识点
域名到IP地址的解析过程
- 当某一个应用进程需要把主机名解析为IP地址时,该应用进程就调用解析程序(resolver),并成为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器(使用UDP是为了减少开销)。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用进程获得目的主机的IP地址后即可进行通信。若本地域名服务器不能回答该请求,则此域名服务器就暂时成为DNS中的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。[1]
- 每一个拥有域名的组织都必须有DNS服务器,以提供自己域内的域名到IP地址的映射服务。例如,××大学的DNS服务器的IP地址为202.101.0.12,它负责进行× ×.edu.cn域内的域名和IP地址之间的转换。在设定IP网络环境时,都要指出进行本主机域名映射的DNS服务器的IP地址。[2]
- 当客户端需要将某主机域名转换成IP地址时,就询问本地DNS。若数据库中有该域名记录,DNS服务器就会直接做出回答。如果没有查到,本地DNS就向根DNS服务器发出查询请求。域名解析采用自顶向下的算法,从根服务器开始,直到树叶上的服务器。[2]
DNS缓存
- 为了提高DNS查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存(有时也称为高速缓存域名服务器)。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。[1]
- 为了提高名字解析的效率,在DNS服务器和客户机上普遍采用了缓存机制,允许把刚刚解析过的数据(也可能附带一些相关数据)在本机进行缓存,这样在该域名或相关域名再次需要解析的时候直接由本机提供缓存的结果,大大地提高了名字解析的效率。[3]
- 不但在本地域名服务器中需要高速缓存,在主机中也很需要。许多主机在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机,应该定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删掉无效的项。[1]
- 如果在不久前已经有用户查询过域名为y.abc.com的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc.com的IP地址,而是直接把高速缓存中存放的上次查询结果(即y.abc.com的IP地址)告诉用户。[1]
本地名称服务器
- 这里所说的“本地名称服务器”不是指用户局域网中的名称服务器,而是用户端操作系统所配置的、由本地ISP提供的名称服务器(也就是本地DNS服务器)。它是离用户最近的互联网名称服务器。用户发出的DNS域名解析请求,首先到达的就是本地名称服务器。如果本地名称服务器解析不了用户所请求的域名,那么这个本地名称服务器就会直接向所配置的根名称服务器发出解析请求,由根名称服务器告知它该向哪个顶级名称服务器查询。如果顶级名称服务器还不能解析,则顶级名称服务器会向本地名称服务器告知要向哪个权威名称服务器发出请求,然后本地名称服务器继续向对应权威名称服务器请求解析。如果权威名称服务器还不能解析的话,则这次DNS域名解析请求失败。[4]
参考资料
[1] 谢希仁.计算机网络(第6版)[M].北京:电子工业出版社,2013.
[2] 刘申菊.计算机网络:项目教学版[M].北京:北京理工大学出版社,2019.
[3] 王新良.计算机网络(第2版)[M].北京:机械工业出版社,2020.
[4] 王达.深入理解计算机网络[M].北京:机械工业出版社,2013.
域名系统DNS (Domain Name System)的因特网标准RFC 1034,1035。