Java面试之TCP三次握手与四次挥手
发布时间 - 2026-01-23 00:00:00 点击率:次Java中TCP三次握手由内核完成,new Socket()失败时抛ConnectException或SocketTimeoutException;四次挥手由close()触发FIN,主动方进入TIME_WAIT致端口复用失败,需系统参数优化。
Java面试里问TCP三次握手和四次挥手,不是考你背流程,而是看你会不会把网络底层和Java应用行为联系起来——比如Socket连接建立失败时抛什么异常、close()调用后连接状态怎么变、为什么TIME_WAIT会导致端口无法重用。
三次握手在Java里怎么体现?
Java本身不直接发SYN包,但所有基于Socket的连接(如new Socket(host, port))都依赖内核完成三次握手。这个过程对Java代码是透明的,但失败时会暴露细节:
-
ConnectException: Connection refused:服务端没监听,或防火墙拦截,对应第二次握手(SYN-ACK)没回来 -
SocketTimeoutException:客户端设置socket.connect(addr, timeout)后超时,通常是第一次SYN发出后没收到任何响应(网络不通或服务端丢包) - 握手成功后,
socket.isConnected()返回true,但socket.isClosed()仍为false——这两个状态互不干扰,别混淆
四次挥手谁先触发?Java代码怎么影响它?
谁先调用close()谁就是主动方,触发FIN。Java里常见两种场景:
- 客户端主动断开:
socket.close()→ 内核发FIN,进入FIN_WAIT_1状态 - 服务端主动断开(如Tomcat处理完HTTP请求后关闭连接):调用
Socket.close()或ServerSocket.close()都会触发对应连接的挥手 - 注意:
socket.shutdownOutput()只发FIN,不关闭Socket对象,还能读数据;而close()既发FIN又释放资源
TIME_WAIT为什么让Java程序“端口被占用”?
主动关闭方最后进入TIME_WAIT(持续2MSL,通常60秒),期间该四元组(源IP+端口+目标IP+端口)不能复用。Java里最典型的表现:
- 频繁创建短连接的客户端(如每秒new一个
Socket),很快耗尽本地端口,抛BindException: Address already in use - 服务端用固定端口(如8080)重启时,如果上次有连接处于
TIME_WAIT,新进程可能bind失败 - 解决方向不是Java层改代码,而是系统级调整:
net.ipv4.tcp_tw_reuse = 1(允许复用TIME_WAITsocket,需时间戳支持)或缩短net.ipv4.tcp_fin_timeout
面试真题常挖的坑点
别只答“三次握手建立连接,四次挥手断开连接”。面试官盯着的是边界情况:
- 为什么不是三次挥手?因为TCP全双工,双方要各自确认“我发完了”和“我收到了你发完的信号”
-
close()调用后,Java线程立刻返回,但内核可能还在发FIN或等ACK——所以socket.isClosed()为true不代表网络上挥手已完成 - 如果服务端在
ESTABLISHED状态直接kill -9进程,客户端read()会立即返回-1(对端关闭),但write()可能等到下一次发包才报IOException: Broken pipe
真正卡住人的从来不是流程图,而是看到Connection reset异常时,能不能快速判断是对方RST了还是自己FIN后还写了数据;或者线上服务重启失败,能不能想到去ss -tan state time-wait | wc -l看看是不是TIME_WAIT堆满了。
# java
# 防火墙
# 端口
# tomcat
# ai
# connection reset
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在建站主机中优化服务器配置?
JS弹性运动实现方法分析
如何快速搭建二级域名独立网站?
Laravel如何使用Sanctum进行API认证?(SPA实战)
LinuxCD持续部署教程_自动发布与回滚机制
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel怎么实现模型属性的自动加密
微信小程序制作网站有哪些,微信小程序需要做网站吗?
使用C语言编写圣诞表白程序
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
长沙做网站要多少钱,长沙国安网络怎么样?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
如何快速搭建虚拟主机网站?新手必看指南
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
长沙企业网站制作哪家好,长沙水业集团官方网站?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
QQ浏览器网页版登录入口 个人中心在线进入
Laravel怎么使用artisan命令缓存配置和视图
如何打造高效商业网站?建站目的决定转化率
原生JS获取元素集合的子元素宽度实例
如何在服务器上配置二级域名建站?
如何快速搭建自助建站会员专属系统?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
如何在阿里云服务器自主搭建网站?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何快速生成可下载的建站源码工具?
昵图网官方站入口 昵图网素材图库官网入口
如何用腾讯建站主机快速创建免费网站?
如何将凡科建站内容保存为本地文件?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
javascript中闭包概念与用法深入理解
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
历史网站制作软件,华为如何找回被删除的网站?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
在centOS 7安装mysql 5.7的详细教程
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
网站图片在线制作软件,怎么在图片上做链接?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
Laravel如何自定义错误页面(404, 500)?(代码示例)
什么是javascript作用域_全局和局部作用域有什么区别?
Bootstrap CSS布局之列表


