网络异常那些事

本文详细解析了Java中常见的网络异常原因,包括路由设置问题导致的hostunreachable和networkunreachable异常,主机查找失败引起的Unabletoconnecttoremotehost异常,以及连接超时、Socketread timeout、Connectionrefused和Connectionresetbypeer等异常的详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java里经常爆出的网络异常都是啥原因引起来得呢?其实java本身没做什么,只是如实上报了系统反馈的异常。

一张简图:

 1.host unreachable,network unreachable 两个异常出现的原因是因为路由设置有问题:

a. 当向某一个目标IP发送数据包时,首先检查一下路由表,看看是否有和目标IP完全匹配的路由记录(网络id和主机id都相同),如果有,则将数据包发送到下一个路由节点或者直接发送到某一个网络接口上。如果没有匹配的则进入下一步。

b. 查看是否有和目标IP中网络ID部分相匹配的路由记录,如果存在,则将数据包发送到下一个路由节点或者直接发送到某一个网络接口上。如果不存在进入下一步。

c. 在路由表中查询默认的路由跳转记录,如果存在,则将数据包发送到默认的路由出口上。

d. 如果以上的操作都失败了,则会抛出以上的异常。

2.Unable to connect to remote host 异常的出现是因为找不到相应的主机:

第一个的异常是找到目标IP在本地的出口,这个异常将目标IP层转换成具体网络地址时出现的异常(咱们的网卡有一个48的MAC地址,属于第二层的内容)。在将IP包封装成网络包是,首先发ARP广播,类似这样的信息:who-has 192.168.1.2 tell 192.168.1.3,如果本地网络没有节点回应,则会出现这个异常,表明本地网络中没有机器配置了192.168.1.2这个ip。

3.Connection timeout

服务端由于资源的原因,例如server端服务的文件数已满、内存已满、磁盘已满等情况,造成连接无法建立。

4.Socket read timeout

server端因为长时间计算或者资源阻塞等,造成不能向客户端返回结果。此时客户端设置了读取超时时间,会抛出此异常。

5.Connection refused

server端相应端口的服务没有启动,即端口没有被占用,会返回此异常。

6.Connection reset by peer

server端以R位的形式(TCP协议包里的一位),告诉client端链接已经不存在了。例如,client端连接着server端,server端因为某些原因重启了(没来得及关闭链接),然后服务也起来了,这时候client端以为链接还在,再次向服务端发送请求时,就会触发这个错误。(TCP是双向链接,想想为啥是四次挥手)

7.Broken pipe

主要出现在tomcat等容器当中,client由于某些原因,通过非合法手段,直接关闭了链接,例如浏览器异常退出。server端在向client回写数据时,由于链接已经单向关闭,会抱这个错误。(其实跟上边儿是一个原因,都是半链接的问题)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值