Interview AiBoxInterview AiBox 实时 AI 助手,让你自信应答每一场面试
请解释TCP的三次握手和四次挥手过程
题型摘要
TCP三次握手是建立连接的过程:1.客户端发送SYN包;2.服务器回复SYN+ACK包;3.客户端发送ACK包,连接建立。四次挥手是断开连接的过程:1.客户端发送FIN包;2.服务器回复ACK包;3.服务器发送FIN包;4.客户端发送ACK包,连接关闭。三次握手防止失效连接请求,四次挥手因TCP全双工特性需单独关闭每个方向。TIME_WAIT状态确保可靠关闭并处理延迟报文。
TCP的三次握手和四次挥手过程
一、TCP三次握手(建立连接)
TCP三次握手是建立一个TCP连接的过程,目的是确保客户端和服务器之间的通信通道是可靠的双向通道。
1. 三次握手的具体步骤
第一次握手:客户端发送SYN包
- 客户端向服务器发送一个SYN(同步序列编号)包,其中包含:
- SYN标志位被设置为1
- 初始序列号(ISN,Initial Sequence Number)被随机选择,例如seq=x
- 客户端进入SYN_SENT状态,等待服务器确认
第二次握手:服务器发送SYN+ACK包
- 服务器收到SYN包后,回复一个SYN+ACK包,其中包含:
- SYN和ACK标志位都被设置为1
- 确认号(acknowledgement number)设置为x+1,表示确认收到了客户端的序列号
- 服务器也选择自己的初始序列号,例如seq=y
- 服务器进入SYN_RCVD状态
第三次握手:客户端发送ACK包
- 客户端收到服务器的SYN+ACK包后,发送一个ACK包作为确认,其中包含:
- ACK标志位被设置为1
- 确认号设置为y+1,表示确认收到了服务器的序列号
- 序列号设置为x+1
- 客户端进入ESTABLISHED状态,表示连接已建立
- 服务器收到ACK后,也进入ESTABLISHED状态
2. 三次握手时序图
3. 为什么需要三次握手
三次握手的主要目的是防止已失效的连接请求报文突然又传送到了服务器,从而产生错误。
-
两次握手的问题:如果只有两次握手,客户端发送的第一个连接请求因网络原因延迟,客户端超时后重新发送新的连接请求并建立了连接。此时,如果那个延迟的旧请求到达服务器,服务器会误认为是一个新的连接请求,并返回确认,这样就建立了一个无用的连接,浪费了服务器资源。
-
三次握手的优势:通过第三次握手,服务器可以确认客户端的接收能力和发送能力都是正常的,同时客户端也能确认服务器的接收能力是正常的,确保了连接的可靠性。
二、TCP四次挥手(断开连接)
TCP四次挥手是终止一个TCP连接的过程,目的是确保双方都完成了数据传输,并优雅地关闭连接。
1. 四次挥手的具体步骤
第一次挥手:客户端发送FIN包
- 主动关闭方(假设为客户端)发送一个FIN(结束)包,其中包含:
- FIN标志位被设置为1
- 序列号seq=u(u等于之前已传送数据的最后一个字节的序号加1)
- 客户端进入FIN_WAIT_1状态,表示没有数据要发送给服务器了
第二次挥手:服务器发送ACK包
- 服务器收到FIN包后,发送一个ACK包作为确认,其中包含:
- ACK标志位被设置为1
- 确认号ack=u+1
- 序列号seq=v(v等于服务器之前已传送数据的最后一个字节的序号加1)
- 服务器进入CLOSE_WAIT状态,表示客户端已经没有数据要发送了,但服务器可能还有数据要发送
- 客户端收到ACK后,进入FIN_WAIT_2状态,等待服务器发送FIN包
第三次挥手:服务器发送FIN包
- 服务器处理完所有待发送的数据后,发送一个FIN包,其中包含:
- FIN标志位被设置为1
- 序列号seq=w(w等于半关闭状态下服务器已传送数据的最后一个字节的序号加1)
- 确认号ack=u+1(与第二次挥手相同)
- 服务器进入LAST_ACK状态,等待客户端的最终确认
第四次挥手:客户端发送ACK包
- 客户端收到FIN包后,发送一个ACK包作为确认,其中包含:
- ACK标志位被设置为1
- 确认号ack=w+1
- 序列号seq=u+1(与第三次挥手时的序列号相同)
- 客户端进入TIME_WAIT状态,等待2MSL(Maximum Segment Lifetime,报文最大生存时间)时间
- 服务器收到ACK后,进入CLOSED状态,连接关闭
- 客户端等待2MSL时间后,进入CLOSED状态,连接完全关闭
2. 四次挥手时序图
3. 为什么需要四次挥手
四次挥手的主要原因是TCP连接是全双工的,每个方向都必须单独进行关闭。
-
四次挥手的原因:
- 当主动关闭方发送FIN包时,仅表示它不再发送数据了,但仍能接收数据
- 被动关闭方收到FIN后,可能还有数据需要发送,因此不能立即关闭连接
- 被动关闭方需要先发送ACK确认收到FIN,然后等待自己的数据发送完毕
- 数据发送完毕后,被动关闭方再发送FIN包,表示自己也没有数据要发送了
- 主动关闭方收到FIN后,发送ACK确认,并等待一段时间确保对方收到
-
TIME_WAIT状态的作用:
- 确保最后一个ACK能够到达:如果服务器没有收到客户端的最终ACK,会重新发送FIN包,客户端在TIME_WAIT状态下可以重新发送ACK。
- 处理延迟的报文段:等待2MSL时间可以使本连接持续时间内所产生的所有报文段都从网络中消失,防止已失效的报文出现在下一个连接中。
三、TCP连接状态转换
四、实际应用中的意义
1. 三次握手的应用场景
- Web浏览:浏览器与Web服务器建立HTTP连接时使用
- 数据库连接:客户端与数据库服务器建立连接时使用
- API调用:移动应用与后端服务建立连接时使用
- 远程登录:SSH、Telnet等远程连接协议使用
2. 四次挥手的应用场景
- HTTP长连接:在HTTP/1.1中,一个TCP连接可以传输多个HTTP请求/响应,最终需要四次挥手关闭连接
- 数据库操作:完成数据库操作后,需要关闭与数据库的连接
- 文件传输:FTP等文件传输协议在完成文件传输后需要关闭连接
- 流媒体传输:音视频流结束后需要关闭连接
3. 优化与注意事项
- TCP快速打开(TFO):减少三次握手的延迟,允许在第三次握手中发送数据
- 连接复用:使用连接池技术避免频繁建立和关闭连接
- TIME_WAIT优化:调整系统参数,避免大量连接处于TIME_WAIT状态导致资源耗尽
- 保活机制:TCP keepalive机制可以检测死连接,及时释放资源
五、总结
TCP的三次握手和四次挥手是TCP协议中连接建立和终止的核心机制:
- 三次握手:通过SYN、SYN+ACK、ACK三个步骤建立可靠的TCP连接,确保双方的收发能力正常
- 四次挥手:通过FIN、ACK、FIN、ACK四个步骤优雅地关闭TCP连接,确保双方都完成了数据传输
- 状态转换:连接过程中涉及多种状态,理解这些状态有助于排查网络问题
- 实际应用:这些机制在几乎所有基于TCP的应用中都有应用,是网络编程的基础知识
理解TCP的三次握手和四次挥手对于前端开发者来说非常重要,因为它们直接影响网页加载速度、API调用性能以及用户体验。
思维导图
Interview AiBoxInterview AiBox — 面试搭档
不只是准备,更是实时陪练
Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。
AI 助读
一键发送到常用 AI
TCP三次握手是建立连接的过程:1.客户端发送SYN包;2.服务器回复SYN+ACK包;3.客户端发送ACK包,连接建立。四次挥手是断开连接的过程:1.客户端发送FIN包;2.服务器回复ACK包;3.服务器发送FIN包;4.客户端发送ACK包,连接关闭。三次握手防止失效连接请求,四次挥手因TCP全双工特性需单独关闭每个方向。TIME_WAIT状态确保可靠关闭并处理延迟报文。
智能总结
深度解读
考点定位
思路启发
相关题目
请做一个自我介绍
自我介绍是面试的开场环节,应遵循"三段式"结构:基本信息与教育背景、核心能力与项目经验、求职动机与个人特质。重点突出与岗位相关的技能和经验,用具体数据和成果支撑,保持真诚自然的表达,控制在2-3分钟内。针对不同公司和岗位进行个性化调整,展示自己的匹配度和价值。
你有什么问题想问我们公司或团队的吗?
面试结尾提问是展示面试者思考深度和职业素养的重要机会。应提前准备3-5个有深度的问题,围绕团队技术、个人成长、公司文化和业务发展四个方面。好的问题能体现你对公司的了解、对职位的重视以及你的职业规划,避免问基础信息类问题。
请做一个自我介绍
自我介绍应遵循“我是谁-我为什么能胜任-我为什么想来”的逻辑框架。在“能胜任”部分,要通过STAR法则和量化结果来突出技术亮点和项目经验。在“想来”部分,要表达对华为技术、文化或业务的认同,展现匹配度和诚意。整个过程应简洁有力,控制在1-3分钟内。
请做一个自我介绍
自我介绍是面试的开场环节,应简洁明了地展示个人基本信息、教育背景、项目经验、技术特长、个人特质和求职动机。优秀的自我介绍应结构清晰、重点突出,与应聘岗位高度匹配,并表达出对公司的了解和加入的强烈意愿。
请做一个自我介绍,包括你的技术背景、项目经验和学习方向。
自我介绍应包含四个核心部分:个人背景、技术能力、项目经验和学习规划。技术背景需突出前端技术栈掌握程度;项目经验应选择代表性案例,说明技术实现和个人贡献;学习方向要体现职业规划与公司发展的契合度。整体表达应简洁有力,重点突出,时间控制在3-5分钟内。