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_WAIT socket,需时间戳支持)或缩短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布局之列表