Interview AiBox logo

Interview AiBox 实时 AI 助手,让你自信应答每一场面试

download免费下载
3local_fire_department7 次面试更新于 2025-09-05account_tree思维导图

请解释TCP协议中的三次握手和四次挥手过程。

lightbulb

题型摘要

TCP协议中的三次握手和四次挥手是TCP连接建立和断开的关键过程。三次握手通过SYN、SYN+ACK和ACK三个报文交换建立连接,确保双方都准备好进行数据传输并同步序列号。四次挥手通过FIN、ACK、FIN和ACK四个报文交换断开连接,确保双方都完成了数据传输并优雅地关闭连接。三次握手防止了已失效连接请求的建立,而四次挥手则允许半关闭状态,确保数据完整传输。TIME_WAIT状态确保最后一个ACK能够到达对方,并允许旧报文段在网络中消失。

TCP协议中的三次握手和四次挥手过程

TCP协议简介

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP通信中,数据的传输前需要先建立连接,传输结束后需要断开连接。这就是所谓的三次握手和四次挥手过程。

三次握手(建立连接)

三次握手是指在建立TCP连接时,客户端和服务器总共发送三个数据包以确认连接的建立。这个过程确保了双方都准备好进行数据传输。

三次握手的步骤

  1. 第一次握手(SYN):客户端向服务器发送一个SYN(Synchronize Sequence Numbers)报文,并指定初始序列号(ISN,Initial Sequence Number)。此时客户端进入SYN_SENT状态。

    • SYN报文段中不包含应用层数据,只包含TCP头部信息。
    • 报文段中的SYN标志位被设置为1,表示这是一个连接请求。
  2. 第二次握手(SYN+ACK):服务器收到客户端的SYN报文后,会发送一个SYN+ACK报文作为响应。

    • 服务器选择自己的初始序列号(ISN)。
    • 报文段中的SYN和ACK标志位都被设置为1。
    • 确认号(Acknowledgment Number)被设置为客户端的ISN+1,表示服务器已经收到了客户端的SYN报文。
    • 此时服务器进入SYN_RCVD状态。
  3. 第三次握手(ACK):客户端收到服务器的SYN+ACK报文后,会发送一个ACK报文作为确认。

    • 报文段中的ACK标志位被设置为1。
    • 确认号被设置为服务器的ISN+1,表示客户端已经收到了服务器的SYN报文。
    • 此时客户端进入ESTABLISHED状态,表示连接已经建立。
    • 服务器收到这个ACK报文后,也进入ESTABLISHED状态。

完成这三次握手后,TCP连接就成功建立,双方可以开始传输数据。

三次握手的目的

  • 确认双方的接收和发送能力正常:通过三次交换,双方都能确认对方的发送和接收能力是正常的。
  • 同步序列号:双方交换并确认初始序列号,为后续的数据传输做准备。
  • 协商资源:双方在握手过程中可以为连接分配必要的资源。

三次握手的状态转换

  • 客户端状态变化:CLOSED → SYN_SENT → ESTABLISHED
  • 服务器状态变化:CLOSED → LISTEN → SYN_RCVD → ESTABLISHED

四次挥手(断开连接)

四次挥手是指在断开TCP连接时,客户端和服务器总共发送四个数据包以确认连接的断开。这个过程确保了双方都完成了数据传输,并优雅地关闭连接。

四次挥手的步骤

  1. 第一次挥手(FIN):主动关闭方(假设为客户端)向被动关闭方(服务器)发送一个FIN(Finish)报文,表示客户端已经没有数据要发送了。

    • 报文段中的FIN标志位被设置为1。
    • 序列号为当前已发送数据的最后一个字节的序列号加1。
    • 此时客户端进入FIN_WAIT_1状态。
  2. 第二次挥手(ACK):服务器收到客户端的FIN报文后,发送一个ACK报文作为确认。

    • 报文段中的ACK标志位被设置为1。
    • 确认号为客户端的序列号加1。
    • 此时服务器进入CLOSE_WAIT状态,表示服务器已经收到了客户端的关闭请求,但可能还有数据要发送。
    • 客户端收到这个ACK报文后,进入FIN_WAIT_2状态,等待服务器发送关闭请求。
  3. 第三次挥手(FIN):服务器处理完所有待发送的数据后,向客户端发送一个FIN报文,表示服务器也已经没有数据要发送了。

    • 报文段中的FIN标志位被设置为1。
    • 序列号为当前已发送数据的最后一个字节的序列号加1。
    • 此时服务器进入LAST_ACK状态,等待客户端的确认。
  4. 第四次挥手(ACK):客户端收到服务器的FIN报文后,发送一个ACK报文作为确认。

    • 报文段中的ACK标志位被设置为1。
    • 确认号为服务器的序列号加1。
    • 此时客户端进入TIME_WAIT状态,等待一段时间(通常是2MSL,Maximum Segment Lifetime,最大报文段生存时间)后,才真正关闭连接,进入CLOSED状态。
    • 服务器收到这个ACK报文后,立即关闭连接,进入CLOSED状态。

完成这四次挥手后,TCP连接就完全断开。

四次挥手的目的

  • 确保数据完整传输:允许双方在关闭连接前完成所有未发送的数据。
  • 优雅关闭连接:通过四次交换,确保双方都同意关闭连接,避免数据丢失。
  • 处理半关闭状态:TCP允许半关闭状态,即一方关闭了发送通道,但仍可以接收数据。

四次挥手的状态转换

  • 主动关闭方(客户端)状态变化:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
  • 被动关闭方(服务器)状态变化:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED

为什么是三次握手而不是两次?

如果只有两次握手,可能会出现以下问题:

  1. 已失效的连接请求报文:如果客户端发送了一个连接请求,但因为网络延迟导致该请求在网络中滞留,客户端超时后重新发送了一个新的连接请求并建立了连接。这时,如果滞留的旧连接请求到达服务器,服务器会误认为这是一个新的连接请求,并发送确认,从而建立一个不必要的连接,浪费资源。

  2. 无法确认双方的接收能力:两次握手只能确认客户端的发送能力和服务器的接收能力,但无法确认服务器的发送能力和客户端的接收能力。

三次握手可以解决这些问题,确保双方都准备好进行数据传输。

为什么是四次挥手而不是三次?

在TCP连接的断开过程中,被动关闭方(服务器)在收到主动关闭方(客户端)的FIN报文后,可能还有数据要发送。因此,服务器需要先发送ACK报文确认收到FIN报文,然后发送剩余的数据,最后再发送FIN报文表示自己也没有数据要发送了。这就导致了四次挥手。

如果将第二次和第三次挥手合并为一次,那么服务器在收到客户端的FIN报文后,必须立即发送FIN报文,无法发送剩余的数据,可能导致数据丢失。

TIME_WAIT状态的作用

在四次挥手的最后,主动关闭方会进入TIME_WAIT状态,等待一段时间(通常是2MSL)后才关闭连接。TIME_WAIT状态的作用有:

  1. 确保最后一个ACK能够到达被动关闭方:如果最后一个ACK丢失,被动关闭方会重新发送FIN报文,主动关闭方在TIME_WAIT状态下可以重新发送ACK。

  2. 允许旧的报文段在网络中消失:确保在网络中滞留的旧报文段已经消失,避免这些报文段被误认为是新连接的报文段。

三次握手和四次挥手的图示

--- title: TCP三次握手过程 --- sequenceDiagram participant Client participant Server Note over Client,Server: 三次握手建立连接 Client->>Server: SYN=1, seq=x Note left of Client: CLOSED -> SYN_SENT Server->>Client: SYN=1, ACK=1, seq=y, ack=x+1 Note right of Server: LISTEN -> SYN_RCVD Client->>Server: ACK=1, seq=x+1, ack=y+1 Note left of Client: SYN_SENT -> ESTABLISHED Note right of Server: SYN_RCVD -> ESTABLISHED Note over Client,Server: 连接建立完成
--- title: TCP四次挥手过程 --- sequenceDiagram participant Client participant Server Note over Client,Server: 四次挥手断开连接 Client->>Server: FIN=1, seq=u Note left of Client: ESTABLISHED -> FIN_WAIT_1 Server->>Client: ACK=1, seq=v, ack=u+1 Note right of Server: ESTABLISHED -> CLOSE_WAIT Note left of Client: FIN_WAIT_1 -> FIN_WAIT_2 Server->>Client: FIN=1, ACK=1, seq=w, ack=u+1 Note right of Server: CLOSE_WAIT -> LAST_ACK Client->>Server: ACK=1, seq=u+1, ack=w+1 Note left of Client: FIN_WAIT_2 -> TIME_WAIT -> CLOSED Note right of Server: LAST_ACK -> CLOSED Note over Client,Server: 连接断开完成

总结

TCP协议中的三次握手和四次挥手是TCP连接建立和断开的重要过程:

  • 三次握手:用于建立TCP连接,确保双方都准备好进行数据传输,并同步初始序列号。
  • 四次挥手:用于断开TCP连接,确保双方都完成了数据传输,并优雅地关闭连接。

这两个过程是TCP协议可靠性的重要保障,理解它们对于网络编程和故障排查都非常重要。

参考文档

  1. RFC 793 - Transmission Control Protocol: https://tools.ietf.org/html/rfc793
  2. TCP/IP详解 卷1:协议 (W. Richard Stevens): https://book.douban.com/subject/1088054/
  3. 计算机网络(自顶向下方法): https://book.douban.com/subject/30284196/
  4. MDN Web Docs - HTTP: https://developer.mozilla.org/zh-CN/docs/Web/HTTP
  5. 图解TCP/IP: https://book.douban.com/subject/24737976/
account_tree

思维导图

Interview AiBox logo

Interview AiBox — 面试搭档

不只是准备,更是实时陪练

Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。

AI 助读

一键发送到常用 AI

TCP协议中的三次握手和四次挥手是TCP连接建立和断开的关键过程。三次握手通过SYN、SYN+ACK和ACK三个报文交换建立连接,确保双方都准备好进行数据传输并同步序列号。四次挥手通过FIN、ACK、FIN和ACK四个报文交换断开连接,确保双方都完成了数据传输并优雅地关闭连接。三次握手防止了已失效连接请求的建立,而四次挥手则允许半关闭状态,确保数据完整传输。TIME_WAIT状态确保最后一个ACK能够到达对方,并允许旧报文段在网络中消失。

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请做一个自我介绍

自我介绍是HR面试的开场问题,考察表达能力、逻辑思维、自我认知、岗位匹配度和沟通技巧。有效的自我介绍应包含基本信息、教育背景、专业技能、项目/实习经历、个人特质与岗位匹配、求职动机与未来规划。表达时应控制时间在2-3分钟,语言简洁,重点突出,真诚自然。针对客户端开发岗位,应强调相关技术栈、项目经验和注重细节的特质。避免内容过于简单或冗长,缺乏针对性,过度夸大或缺乏逻辑性。建议提前准备、反复练习、突出亮点、保持真实并积极互动。

arrow_forward

你的期望薪资是多少?

回答"期望薪资"问题需先做市场调研和自我评估,面试时应表达对职位的兴趣,提供合理薪资范围而非具体数字,强调综合考量整体薪酬包和发展机会,保持灵活态度并适时反问公司预算。避免过低或过高报价,关注长远职业发展。

arrow_forward

请做一个自我介绍,包括你的教育背景、技术栈和项目经验。

自我介绍应包含教育背景、技术栈和项目经验三部分。首先简述基本信息,然后详细介绍与岗位相关的教育经历,清晰列出掌握的技术及熟练程度,选择2-3个代表性项目按STAR法则描述。最后强调个人优势与职业规划,表达对公司的向往。整个介绍应控制在3-5分钟,保持真实、有针对性,自信表达,并准备好对介绍内容的深入回答。

arrow_forward

请详细介绍你的项目背景、技术选型、实现难点以及你的具体贡献。

这个问题要求面试者介绍项目背景、技术选型、实现难点和个人贡献。回答时应简明扼要地介绍项目目标和规模,详细说明技术选型理由,分析遇到的技术难点及解决方案,并清晰阐述个人在项目中的角色和贡献。通过展示项目经验、技术决策能力、问题解决能力和团队协作能力,全面体现面试者的综合素质和专业水平。

arrow_forward

你在大学期间哪门计算机课程学得最好?为什么?

在大学期间,我学得最好的课程是数据结构与算法。通过理论与实践结合的学习方法,我深入掌握了各种数据结构和算法的核心知识点,并将这些知识应用到多个实际项目中。这些知识对客户端开发尤为重要,可以帮助优化性能、提升用户体验、有效管理内存和优化界面渲染。我持续学习算法的热情和扎实的基础,将帮助我在客户端开发实习中做出贡献。

arrow_forward

阅读状态

阅读时长

8 分钟

阅读进度

7%

章节:15 · 已读:1

当前章节: TCP协议简介

最近更新:2025-09-05

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

面试中屏幕实时显示参考回答,帮你打磨表达。

免费下载download

分享题目

复制链接,或一键分享到常用平台

外部分享