Interview AiBoxInterview AiBox 实时 AI 助手,让你自信应答每一场面试
请详细描述TCP三次握手和四次挥手的过程
题型摘要
TCP三次握手是建立连接的过程:1)客户端发送SYN;2)服务器回复SYN+ACK;3)客户端发送ACK。四次挥手是断开连接的过程:1)客户端发送FIN;2)服务器回复ACK;3)服务器发送FIN;4)客户端回复ACK并进入TIME_WAIT状态。三次握手确保双方序列号同步和收发能力正常,四次挥手确保数据完整传输和可靠关闭连接.
TCP三次握手和四次挥手详解
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP通信中,连接的建立和终止分别通过三次握手和四次挥手来完成。
一、TCP三次握手
TCP三次握手(Three-way Handshake)是指建立一个TCP连接时,客户端和服务器总共需要发送三个报文。其主要目的是同步双方的序列号和确认号,并交换TCP窗口大小信息。
1. 三次握手过程
第一次握手:SYN
- 客户端向服务器发送一个SYN(Synchronize Sequence Numbers)报文
- 报文内容:SYN=1,seq=x(x为客户端初始序列号)
- 客户端状态:从CLOSED变为SYN_SENT
- 目的:客户端告诉服务器,我要建立连接,这是我的初始序列号
第二次握手:SYN+ACK
- 服务器收到SYN报文后,向客户端发送SYN+ACK报文
- 报文内容:SYN=1,ACK=1,seq=y(y为服务器初始序列号),ack=x+1
- 服务器状态:从LISTEN变为SYN_RCVD
- 目的:服务器告诉客户端,我收到了你的连接请求,这是我的初始序列号,我期望你的下一个序列号是x+1
第三次握手:ACK
- 客户端收到SYN+ACK报文后,向服务器发送ACK报文
- 报文内容:ACK=1,seq=x+1,ack=y+1
- 客户端状态:从SYN_SENT变为ESTABLISHED(连接已建立)
- 服务器收到ACK后,状态从SYN_RCVD变为ESTABLISHED(连接已建立)
- 目的:客户端告诉服务器,我收到了你的确认,连接已建立
2. 三次握手状态转换
3. 为什么需要三次握手
-
防止已失效的连接请求报文突然又传送到了服务器:如果客户端发送的SYN因网络问题延迟,客户端超时重传,服务器收到后建立连接,传输数据后关闭连接。此时延迟的SYN到达服务器,如果不进行第三次握手,服务器会误认为客户端又发起新的连接请求,从而造成资源浪费。
-
同步双方的序列号:TCP是全双工通信,双方需要知道对方的初始序列号,才能保证数据传输的可靠性。三次握手确保了双方序列号的同步。
-
确认双方的接收和发送能力正常:通过三次报文交换,双方都能确认对方的发送和接收能力是正常的。
二、TCP四次挥手
TCP四次挥手(Four-way Wavehand)是指终止一个TCP连接时,客户端和服务器总共需要发送四个报文。由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
1. 四次挥手过程
第一次挥手:FIN
- 客户端向服务器发送一个FIN(Finish)报文
- 报文内容:FIN=1,seq=u(u为客户端发送的最后一个字节的序列号)
- 客户端状态:从ESTABLISHED变为FIN_WAIT_1
- 目的:客户端告诉服务器,我已经没有数据要发送了,但仍然可以接收数据
第二次挥手:ACK
- 服务器收到FIN报文后,向客户端发送ACK报文
- 报文内容:ACK=1,seq=v(v为服务器发送的最后一个字节的序列号),ack=u+1
- 服务器状态:从ESTABLISHED变为CLOSE_WAIT
- 客户端收到ACK后,状态从FIN_WAIT_1变为FIN_WAIT_2
- 目的:服务器告诉客户端,我收到了你的关闭请求
第三次挥手:FIN
- 服务器处理完所有待发送数据后,向客户端发送FIN报文
- 报文内容:FIN=1,ACK=1,seq=w,ack=u+1
- 服务器状态:从CLOSE_WAIT变为LAST_ACK
- 目的:服务器告诉客户端,我也没有数据要发送了,可以关闭连接了
第四次挥手:ACK
- 客户端收到FIN报文后,向服务器发送ACK报文
- 报文内容:ACK=1,seq=u+1,ack=w+1
- 客户端状态:从FIN_WAIT_2变为TIME_WAIT,等待2MSL(Maximum Segment Lifetime,报文最大生存时间)后进入CLOSED状态
- 服务器收到ACK后,状态从LAST_ACK变为CLOSED
- 目的:客户端告诉服务器,我收到了你的关闭请求,连接可以完全关闭了
2. 四次挥手状态转换
3. 为什么需要四次挥手
-
TCP是全双工通信:每个方向必须单独关闭,当一方完成数据发送时,发送FIN通知对方,但仍然可以接收对方的数据。
-
确保数据完整传输:第二次挥手后,服务器可能还有数据需要发送,不能立即关闭连接,需要等待数据发送完毕后才能发送FIN报文。
-
TIME_WAIT状态的作用:
- 确保可靠的终止TCP连接:如果客户端发送的最后一个ACK丢失,服务器会重传FIN,客户端在TIME_WAIT状态下可以重新发送ACK。
- 允许老的报文在网络中消失:等待2MSL时间,确保本连接的所有报文在网络中消失,防止端口重用时出现混乱。
4. TIME_WAIT状态
TIME_WAIT状态是TCP连接关闭过程中的一个重要状态,它持续2MSL时间(通常为30秒到2分钟)。这个状态的存在有以下几个原因:
-
可靠性保证:确保最后一个ACK能够被服务器接收。如果ACK丢失,服务器会重传FIN,客户端在TIME_WAIT状态下可以重新发送ACK。
-
网络延迟处理:确保网络中所有本连接的报文都已经消失,防止这些报文被后续使用相同端口的连接误接收。
-
避免"已失效的连接请求":防止连接关闭后立即建立相同端口的新连接,可能会收到旧连接的延迟报文。
TIME_WAIT状态可能会导致端口资源占用问题,在高并发短连接场景下可能会耗尽可用端口。可以通过调整系统参数(如tcp_tw_reuse和tcp_tw_recycle)来优化。
三、总结
TCP三次握手和四次挥手是TCP协议中连接建立和终止的核心机制:
- 三次握手:建立连接,同步序列号,确保双方收发能力正常
- 四次挥手:终止连接,确保数据完整传输,可靠关闭连接
这两个过程体现了TCP协议的可靠性和严谨性,是理解TCP协议工作原理的基础。
参考资料:
思维导图
Interview AiBoxInterview AiBox — 面试搭档
不只是准备,更是实时陪练
Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。
AI 助读
一键发送到常用 AI
TCP三次握手是建立连接的过程:1)客户端发送SYN;2)服务器回复SYN+ACK;3)客户端发送ACK。四次挥手是断开连接的过程:1)客户端发送FIN;2)服务器回复ACK;3)服务器发送FIN;4)客户端回复ACK并进入TIME_WAIT状态。三次握手确保双方序列号同步和收发能力正常,四次挥手确保数据完整传输和可靠关闭连接.
智能总结
深度解读
考点定位
思路启发
相关题目
请详细解释TCP三次握手的过程及其作用。
TCP三次握手是建立TCP连接的必要过程,通过三个数据包的交换来确认双方的收发能力并同步序列号。第一次握手客户端发送SYN报文,第二次握手服务器回复SYN+ACK报文,第三次握手客户端发送ACK报文。三次握手确保了连接的可靠性,防止了已失效连接请求的影响,并协商了连接参数,为后续数据传输奠定基础。
你对软件测试的理解是什么?测试在软件开发过程中的作用是什么?
软件测试是使用人工或自动化手段运行或测定系统,检验其是否满足需求或发现预期与实际结果之间差别的过程。测试在软件开发中扮演质量保证、风险控制、需求验证、成本控制等关键角色。测试活动应尽早介入,贯穿整个开发生命周期,包括单元测试、集成测试、系统测试和验收测试等不同级别。测试不仅关注功能正确性,还包括性能、安全、可用性等多个方面。在不同开发模型中,测试的定位和实施方式有所不同,但其核心价值始终是通过发现和预防缺陷来提升产品质量,降低维护成本,增强用户信心,保护品牌声誉,最终为组织创造价值。
谈谈你对测试工作的理解
测试工作是软件质量保障的核心环节,包括发现缺陷、建立信心、预防缺陷和确保质量。测试应遵循七大原则,按阶段可分为单元测试、集成测试、系统测试和验收测试,按目标可分为功能测试、性能测试、安全测试等。测试开发工程师作为连接开发和测试的桥梁,需要具备扎实的编程能力和全面的测试知识,通过自动化测试框架和工具提高测试效率。随着敏捷和DevOps的发展,测试正向AI辅助、测试左移、测试右移、持续测试和质量工程方向发展。
请详细说明Java中抽象类和接口的区别以及各自的适用场景。
Java中抽象类和接口的主要区别在于:抽象类表示"is-a"关系,可包含构造方法、成员变量和具体方法实现,支持单继承;接口表示"can-do"能力,主要定义行为规范,支持多实现。抽象类适用于需要共享代码和状态的场景,如模板方法模式;接口适用于定义能力、API契约和实现解耦的场景。Java 8+后接口增加了默认方法、静态方法和私有方法,使两者界限更加模糊。最佳实践是结合使用,先定义接口,再提供抽象类实现通用功能。
请详细解释Java中的垃圾回收机制及其工作原理
Java垃圾回收机制是JVM自动管理内存的核心功能,通过自动回收不再使用的对象来避免内存泄漏和内存溢出。主要采用可达性分析算法判断对象是否可回收,并结合分代收集策略将内存划分为新生代和老年代,针对不同区域采用不同的回收算法。Java提供了多种垃圾收集器,如Serial、Parallel、CMS、G1、ZGC等,各有特点,适用于不同场景。垃圾回收调优是Java应用性能优化的重要环节,需要根据应用特点选择合适的收集器和参数配置。