Interview AiBox logo

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

download免费下载
进阶local_fire_department11 次面试更新于 2025-08-24account_tree思维导图

请详细描述TCP三次握手和四次挥手的过程

lightbulb

题型摘要

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. 三次握手过程

--- title: TCP三次握手过程 --- sequenceDiagram participant Client participant Server Note over Client,Server: 初始状态: Client(CLOSED), Server(LISTEN) Client->>Server: SYN=1, seq=x (SYN_SENT) Note left of Client: 客户端发送SYN报文<br/>进入SYN_SENT状态 Server->>Client: SYN=1, ACK=1, seq=y, ack=x+1 (SYN_RCVD) Note right of Server: 服务器发送SYN+ACK报文<br/>进入SYN_RCVD状态 Client->>Server: ACK=1, seq=x+1, ack=y+1 (ESTABLISHED) Note left of Client: 客户端发送ACK报文<br/>进入ESTABLISHED状态<br/>连接建立完成 Note right of Server: 服务器收到ACK报文<br/>进入ESTABLISHED状态<br/>连接建立完成

第一次握手: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. 三次握手状态转换

--- title: TCP三次握手状态转换图 --- stateDiagram-v2 [*] --> CLOSED CLOSED --> SYN_SENT: 应用发起连接 SYN_SENT --> SYN_RCVD: 收到SYN+ACK SYN_SENT --> CLOSED: 连接失败/超时 SYN_RCVD --> ESTABLISHED: 收到ACK CLOSED --> LISTEN: 应用被动监听 LISTEN --> SYN_RCVD: 收到SYN LISTEN --> CLOSED: 应用关闭 ESTABLISHED --> [*]: 连接建立成功

3. 为什么需要三次握手

  1. 防止已失效的连接请求报文突然又传送到了服务器:如果客户端发送的SYN因网络问题延迟,客户端超时重传,服务器收到后建立连接,传输数据后关闭连接。此时延迟的SYN到达服务器,如果不进行第三次握手,服务器会误认为客户端又发起新的连接请求,从而造成资源浪费。

  2. 同步双方的序列号:TCP是全双工通信,双方需要知道对方的初始序列号,才能保证数据传输的可靠性。三次握手确保了双方序列号的同步。

  3. 确认双方的接收和发送能力正常:通过三次报文交换,双方都能确认对方的发送和接收能力是正常的。

二、TCP四次挥手

TCP四次挥手(Four-way Wavehand)是指终止一个TCP连接时,客户端和服务器总共需要发送四个报文。由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。

1. 四次挥手过程

--- title: TCP四次挥手过程 --- sequenceDiagram participant Client participant Server Note over Client,Server: 初始状态: 双方ESTABLISHED Client->>Server: FIN=1, seq=u (FIN_WAIT_1) Note left of Client: 客户端发送FIN报文<br/>进入FIN_WAIT_1状态 Server->>Client: ACK=1, seq=v, ack=u+1 (CLOSE_WAIT) Note right of Server: 服务器发送ACK报文<br/>进入CLOSE_WAIT状态 Note left of Client: 客户端收到ACK<br/>进入FIN_WAIT_2状态 Server->>Client: FIN=1, ACK=1, seq=w, ack=u+1 (LAST_ACK) Note right of Server: 服务器发送FIN报文<br/>进入LAST_ACK状态 Client->>Server: ACK=1, seq=u+1, ack=w+1 (TIME_WAIT) Note left of Client: 客户端发送ACK报文<br/>进入TIME_WAIT状态<br/>等待2MSL后进入CLOSED Note right of Server: 服务器收到ACK<br/>进入CLOSED状态<br/>连接完全关闭

第一次挥手: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. 四次挥手状态转换

--- title: TCP四次挥手状态转换图 --- stateDiagram-v2 [*] --> ESTABLISHED: 连接已建立 ESTABLISHED --> FIN_WAIT_1: 应用主动关闭 FIN_WAIT_1 --> FIN_WAIT_2: 收到ACK FIN_WAIT_2 --> TIME_WAIT: 收到FIN TIME_WAIT --> CLOSED: 等待2MSL ESTABLISHED --> CLOSE_WAIT: 收到FIN CLOSE_WAIT --> LAST_ACK: 应用关闭 LAST_ACK --> CLOSED: 收到ACK CLOSED --> [*]: 连接完全关闭

3. 为什么需要四次挥手

  1. TCP是全双工通信:每个方向必须单独关闭,当一方完成数据发送时,发送FIN通知对方,但仍然可以接收对方的数据。

  2. 确保数据完整传输:第二次挥手后,服务器可能还有数据需要发送,不能立即关闭连接,需要等待数据发送完毕后才能发送FIN报文。

  3. TIME_WAIT状态的作用

    • 确保可靠的终止TCP连接:如果客户端发送的最后一个ACK丢失,服务器会重传FIN,客户端在TIME_WAIT状态下可以重新发送ACK。
    • 允许老的报文在网络中消失:等待2MSL时间,确保本连接的所有报文在网络中消失,防止端口重用时出现混乱。

4. TIME_WAIT状态

TIME_WAIT状态是TCP连接关闭过程中的一个重要状态,它持续2MSL时间(通常为30秒到2分钟)。这个状态的存在有以下几个原因:

  1. 可靠性保证:确保最后一个ACK能够被服务器接收。如果ACK丢失,服务器会重传FIN,客户端在TIME_WAIT状态下可以重新发送ACK。

  2. 网络延迟处理:确保网络中所有本连接的报文都已经消失,防止这些报文被后续使用相同端口的连接误接收。

  3. 避免"已失效的连接请求":防止连接关闭后立即建立相同端口的新连接,可能会收到旧连接的延迟报文。

TIME_WAIT状态可能会导致端口资源占用问题,在高并发短连接场景下可能会耗尽可用端口。可以通过调整系统参数(如tcp_tw_reusetcp_tw_recycle)来优化。

三、总结

TCP三次握手和四次挥手是TCP协议中连接建立和终止的核心机制:

  • 三次握手:建立连接,同步序列号,确保双方收发能力正常
  • 四次挥手:终止连接,确保数据完整传输,可靠关闭连接

这两个过程体现了TCP协议的可靠性和严谨性,是理解TCP协议工作原理的基础。

参考资料:

  1. RFC 793 - Transmission Control Protocol
  2. TCP/IP详解 卷1:协议
  3. 计算机网络(第7版)- 谢希仁
  4. TCP三次握手和四次挥手详解 - 阮一峰的网络日志
account_tree

思维导图

Interview AiBox logo

Interview AiBox — 面试搭档

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

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

AI 助读

一键发送到常用 AI

TCP三次握手是建立连接的过程:1)客户端发送SYN;2)服务器回复SYN+ACK;3)客户端发送ACK。四次挥手是断开连接的过程:1)客户端发送FIN;2)服务器回复ACK;3)服务器发送FIN;4)客户端回复ACK并进入TIME_WAIT状态。三次握手确保双方序列号同步和收发能力正常,四次挥手确保数据完整传输和可靠关闭连接.

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请详细解释TCP三次握手的过程及其作用。

TCP三次握手是建立TCP连接的必要过程,通过三个数据包的交换来确认双方的收发能力并同步序列号。第一次握手客户端发送SYN报文,第二次握手服务器回复SYN+ACK报文,第三次握手客户端发送ACK报文。三次握手确保了连接的可靠性,防止了已失效连接请求的影响,并协商了连接参数,为后续数据传输奠定基础。

arrow_forward

你对软件测试的理解是什么?测试在软件开发过程中的作用是什么?

软件测试是使用人工或自动化手段运行或测定系统,检验其是否满足需求或发现预期与实际结果之间差别的过程。测试在软件开发中扮演质量保证、风险控制、需求验证、成本控制等关键角色。测试活动应尽早介入,贯穿整个开发生命周期,包括单元测试、集成测试、系统测试和验收测试等不同级别。测试不仅关注功能正确性,还包括性能、安全、可用性等多个方面。在不同开发模型中,测试的定位和实施方式有所不同,但其核心价值始终是通过发现和预防缺陷来提升产品质量,降低维护成本,增强用户信心,保护品牌声誉,最终为组织创造价值。

arrow_forward

谈谈你对测试工作的理解

测试工作是软件质量保障的核心环节,包括发现缺陷、建立信心、预防缺陷和确保质量。测试应遵循七大原则,按阶段可分为单元测试、集成测试、系统测试和验收测试,按目标可分为功能测试、性能测试、安全测试等。测试开发工程师作为连接开发和测试的桥梁,需要具备扎实的编程能力和全面的测试知识,通过自动化测试框架和工具提高测试效率。随着敏捷和DevOps的发展,测试正向AI辅助、测试左移、测试右移、持续测试和质量工程方向发展。

arrow_forward

请详细说明Java中抽象类和接口的区别以及各自的适用场景。

Java中抽象类和接口的主要区别在于:抽象类表示"is-a"关系,可包含构造方法、成员变量和具体方法实现,支持单继承;接口表示"can-do"能力,主要定义行为规范,支持多实现。抽象类适用于需要共享代码和状态的场景,如模板方法模式;接口适用于定义能力、API契约和实现解耦的场景。Java 8+后接口增加了默认方法、静态方法和私有方法,使两者界限更加模糊。最佳实践是结合使用,先定义接口,再提供抽象类实现通用功能。

arrow_forward

请详细解释Java中的垃圾回收机制及其工作原理

Java垃圾回收机制是JVM自动管理内存的核心功能,通过自动回收不再使用的对象来避免内存泄漏和内存溢出。主要采用可达性分析算法判断对象是否可回收,并结合分代收集策略将内存划分为新生代和老年代,针对不同区域采用不同的回收算法。Java提供了多种垃圾收集器,如Serial、Parallel、CMS、G1、ZGC等,各有特点,适用于不同场景。垃圾回收调优是Java应用性能优化的重要环节,需要根据应用特点选择合适的收集器和参数配置。

arrow_forward

阅读状态

阅读时长

8 分钟

阅读进度

10%

章节:10 · 已读:1

当前章节: 一、TCP三次握手

最近更新:2025-08-24

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

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

免费下载download

分享题目

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

外部分享