【草稿】DNS配置问题引起的java.net.UnknownHostException

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。

java.net.UnknownHostException异常是Java编程中经常遇到的网络错误之一,该异常在建立网络连接时通常发生,原因是程序无法解析所查询的主机名,即无法找到该主机名对应的IP地址。对于出现java.net.UnknownHostException异常,我们一般需要检查其可能的原因和解决方案。 在本问题中,出现了java.net.UnknownHostException: openapi.alipay.com异常,这是因为程序无法解析openapi.alipay.com这个主机名。针对这个问题,我们需要排查如下几个可能的原因: 1. DNS解析问题:程序可能没有正确配置或无法访问DNS服务器导致无法解析域名为IP地址,需要确认DNS解析是否正常。 2. 网络连接问题:可能存在网络连接问题,比如代理服务器配置不正确、网络不稳定等问题,需要确认网络连接是否正常。 3. 安全相关问题:如果运行程序需要进行安全认证,可能是证书相关问题导致无法建立连接,需要检查证书是否正确。 针对以上可能的原因,我们可以尝试相应的解决方案: 1. DNS解析问题可以尝试更换DNS服务器、在hosts文件中手动添加IP地址等方式解决。 2. 网络连接问题可以尝试更换网络环境,检查代理服务器等。 3. 安全相关问题需要确认证书的正确性,可以参考相应的API文档进行调试和排查。 总之,出现java.net.UnknownHostException异常,需要认真分析可能出现的原因和解决方案,通过正确的调试和排查,才能最终解决问题。针对本问题,需要检查网络连接、DNS解析等方面,如果还不能解决问题,可以查阅相关API文档进行更深入的调试和排查。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值