原文链接:https://blog.youkuaiyun.com/qq_39390545/article/details/108755289
以下为复盘学习笔记
UnknownHostException 一般原因
UnknownHostException
是Java编程中常见的一个网络异常,通常在试图通过域名查找并连接到一个主机时抛出。
这个异常的主要原因有以下几点:
原因1:提供的主机名拼写错误或不存在
1、拼写错误 :再检查一遍命令
2、不存在:执行如下命令判断提供的主机名在DNS里是否存在
# Windows
nslookup blog.youkuaiyun.com # 测试默认 DNS 服务器
nslookup blog.youkuaiyun.com 8.8.8.8 # 测试 Google 公共 DNS
nslookup blog.youkuaiyun.com 114.114.114.114 # 114DNS 国内老牌 DNS,解析速度快,兼容性强。
nslookup blog.youkuaiyun.com 223.5.5.5 #阿里 AliDNS
nslookup blog.youkuaiyun.com 183.60.83.19 #腾讯 DNS
nslookup blog.youkuaiyun.com 119.29.29.29 #DNSPod DNS+ 腾讯云旗下服务,优化国内域名解析。
# Linux/macOS 适用
dig blog.youkuaiyun.com +short
原因2:本地hosts文件配置错误
/etc/hosts
文件中配置了错误的主机名与 IP 地址映射。
检查 /etc/hosts
文件(Linux/Mac)或 C:\Windows\System32\drivers\etc\hosts
文件(Windows)。确保主机名与正确的 IP 地址匹配。
原因3:DNS配置问题
1、系统或网络中未正确配置DNS服务器。
以下是不同操作系统下查看 DNS 配置是否正确的方法及验证步骤:
●Windows 系统:Win+R → CMD → ipconfig /all
,或者直接查询 ipconfig /all | findstr "DNS"
●Windows 系统:Win+E → 网络(右键选属性) → 更改适配器设置 → 右键点击当前网络 → 属性 → 双击 IPv4 → 查看 首选 DNS 服务器
●Linux 系统:查看配置文件 cat /etc/resolv.conf
●Linux 系统:使用工具查看 nmcli dev show | grep DNS
2、DNS服务器不可用或响应超时。测试 DNS 是否正常工作
● 场景 1:DNS 解析前中断
现象:
traceroute example.com
失败,提示“unknown host”。
nslookup example.com
失败,提示“no answer”。
traceroute <IP>
成功。
结论:问题出在 DNS 解析阶段。
traceroute 是用于追踪数据包从源主机到目标主机所经过的路由路径,并显示沿途各跳节点的网络延迟和 IP 地址的网络诊断工具。
nslookup 是用于查询域名对应的 IP 地址或反向查询 IP 对应的域名的网络工具,主要用于诊断 DNS 解析问题。
● 场景 2:网络路径中断
现象:
traceroute example.com
和 traceroute <IP>
都失败。
在某跳之后出现 * * *
。
结论:网络路径本身存在问题。清除缓存后重试解析
# Windows:
ipconfig /flushdns
# Linux:
sudo systemd-resolve --flush-caches
原因4:网络连接问题
1、设备没有连接到互联网或目标网络。
●1.1 设备有没有断网
●1.2 查看 IP 地址配置
# Windows
ipconfig
# macOS/Linux
ifconfig # 或 ip addr
●1.2.1 测试本地网络(默认网关)
ping 192.168.1.1
成功:本地网络正常。
失败:检查路由器、防火墙或 IP 冲突。
ping 默认网关用于检测本地设备与网关(即本地网络出口)之间的网络连通性,排查本地网络配置或物理连接是否正常。
●1.2.2 测试互联网连通性
ping 8.8.8.8 # Google DNS
ping 1.1.1.1 # Cloudflare DNS
成功:网络层正常,问题可能在应用层(如浏览器设置)。
失败:检查路由器 WAN 口状态或联系 ISP。
ping DNS 服务器是通过发送网络数据包检测设备与 DNS 服务器的连通性、验证其是否正常响应,以排查网络或域名解析问题的操作。
●1.2.3 测试特定网站
ping example.com # 或直接访问网页
成功:互联网正常。
失败:尝试使用 IP 访问(如 http://93.184.216.34),若成功则为 DNS 问题。
2、防火墙或网络策略阻止了 DNS 查询。
临时禁用防火墙测试,重新执行 nslookup 或 dig,若恢复正常,则证明防火墙是问题根源。
原因5:超时问题
1、DNS 查询超时,可能是由于网络延迟或 DNS 服务器性能问题。
解决方法:
增加 DNS 查询的超时时间(如果支持)。
更换更快的 DNS 服务器。
如何在本地hosts文件配置域名和IP?
在开发环境中,有时可以暂时直接在本地hosts文件
中添加域名
和IP地址
的对应关系以快速测试功能。在服务器发送求时,就会 自动把域名转成IP 进行调用了。
以优快云的域名为例(www.youkuaiyun.com)
第1步:用有互联网的机器 win+r
→ cmd
进入dos窗口
第2步:执行 nslookup www.youkuaiyun.com
命令,获取www.youkuaiyun.com
域名对应的IP
,
C:\Users\zhang>nslookup www.csdn.net
服务器: public1.114dns.com
Address: 114.114.114.114
非权威应答:
名称: 55cb88f4.csdn.net.cname.yunduns.com
Address: 123.129.227.28
Aliases: www.csdn.net
第3步:打开hosts文件
Windows:一般在C:\Windows\System32\drivers\etc\hosts
Linux:一般在/etc/hosts
第4步:修改hosts文件,把域名和IP写到hosts文件中,用于把域名解析成IP
第5步:执行 ipconfig/flushdns
清除DNS缓存
第6步:完成,这样就可以调到优快云域名下的接口了。如https://www.youkuaiyun.com/xxx/login
常见抛此异常场景
场景1:网络请求
发起HTTP/HTTPS请求时,如果DNS无法解析目标域名的IP地址,则会抛出此异常。
URL url = new URL("http://unresolved-domain.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 此处可能会抛出UnknownHostException
场景2:数据库连接
在JDBC中,如果你提供的数据库URL
是一个域名而非IP地址,并且该域名无法被DNS解析,则会抛出此异常。
String url = "jdbc:mysql://unresolved-db-server:3306/mydatabase";
Connection conn = DriverManager.getConnection(url, "username", "password");
// 此处可能会抛出UnknownHostException
场景3:Socket通信
在直接使用Socket进行TCP/IP通信时,如果需要通过域名创建Socket连接,而域名未解析成功,则会抛出此异常。
try {
InetAddress address = InetAddress.getByName("unresolved-domain.com");
} catch (UnknownHostException e) {
System.out.println("Failed to resolve the host.");
}
场景4:服务发现与调用
在微服务架构中,客户端可能依赖于服务注册中心(如Eureka、Consul)获取其他服务的地址,如果获取到的地址是未解析成功的域名,后续进行远程服务调用时也会遇到这个问题。
ping 不通原因
一、网络连接问题
- 物理连接故障
现象:本地设备未连接到网络(如网线松动、Wi-Fi 未连接)。 - 网关或路由器故障
现象:能 ping 通本地设备,但无法 ping 通网关(如 192.168.1.1)→ 说明本地设备与网关(路由器)之间的网络连通性存在问题。
二、DNS 解析失败
- 主机名无法解析为 IP
现象:ping example.com 失败,但ping <IP>
成功。
三、目标主机不可达
-
目标主机离线
现象:目标主机关机、网络接口关闭,或所在网络故障。 -
目标主机防火墙拦截
现象:目标主机开启防火墙并禁用了 ICMP 协议。
四、中间网络设备限制
-
防火墙或路由器过滤 ICMP
现象:本地网络设备(如路由器)或运营商禁用了 ICMP。 -
NAT 或 VPN 配置问题
现象:跨网络或通过 VPN 访问时无法 ping 通。
五、特殊场景
-
移动网络或公共 Wi-Fi
原因:运营商或热点可能限制 ICMP 流量。 -
IPv6 与 IPv4 冲突
现象:同时启用 IPv4 和 IPv6 时可能导致解析混乱。
名词解释
路由(Routing):指将数据包从源地址传输到目标地址的过程。
防火墙:主要负责流量的安全控制,解决“是否允许通过”的问题。
实现方式:
包过滤防火墙:基于 IP 地址、端口号等信息进行过滤。
应用层防火墙:检查应用层协议(如 HTTP、FTP)的内容。
状态检测防火墙:跟踪连接状态,确保流量符合预期。
协同工作:
路由优先于防火墙:数据包首先经过路由处理,确定其目标地址和下一跳,然后才进入防火墙进行安全检查。
集成设备:现代网络设备(如路由器或防火墙)通常集成了路由和防火墙功能,能够同时完成路径选择和安全控制。