Interview AiBox logo

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

download免费下载
3local_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

相关题目

请做一个自我介绍

自我介绍是面试的开场环节,应控制在2-3分钟内,包含基本信息、教育背景、项目经验、个人特点、求职动机和结束语。关键在于突出与岗位相关的技能和经验,用具体事例支撑能力,展现对公司和岗位的了解。表达时应保持自信、简洁明了,避免背诵简历内容或过度夸张。准备过程包括分析岗位需求、梳理个人经历、找出匹配点、构建框架、撰写初稿、修改润色、模拟练习和最终定稿。

arrow_forward

为什么选择从事测试开发工作

选择从事测试开发工作应从四个方面回答:理解测试开发的价值与本质、结合个人经历与兴趣、分析个人优势与岗位匹配度、表达职业规划与期望。测试开发是连接开发与质量的桥梁,需要编程能力与质量意识的结合,适合既喜欢编码又关注产品质量的人。

arrow_forward

你为什么选择测试开发这个职业方向?

回答此问题的核心是展现你对测试开发角色的深刻认同和热情,并将其与个人能力、职业规划及公司需求相结合。第一步,用一个真实经历说明你对质量的追求,建立动机;第二步,阐述为何选择测试开发这一“开发+质量”的桥梁角色,而非纯开发或纯测试;第三步,结合美团的业务复杂性和技术领先性,表达你渴望在此平台成长的意愿,展示高度契合度。

arrow_forward

请详细描述你的项目经历,以及你是如何进行测试的。

回答项目经历问题,推荐使用STAR法则: 1. **S (情境)**:简述项目背景和你的角色。 2. **T (任务)**:明确你要保障的质量目标和具体测试任务。 3. **A (行动)**:这是核心,详细描述你的测试流程,包括需求分析、策略制定、用例设计(功能/接口/UI/性能)、执行、缺陷管理。 4. **R (结果)**:用数据量化成果,如发现Bug数量、自动化覆盖率、效率提升、性能指标达成等。 整个回答应突出结构化思维、技术深度和业务价值。

arrow_forward

在项目开发过程中,你遇到过哪些技术难题?你是如何解决这些问题的?

在项目开发中,我遇到过三个典型技术难题:1)自动化测试框架稳定性问题,通过POM模式、智能等待机制、测试数据工厂和资源池管理将失败率从30%降至5%;2)大规模数据测试性能优化,采用Spark分布式架构、数据采样策略和规则匹配优化,将测试时间从8小时缩短至30分钟;3)微服务测试环境管理,通过容器化、服务虚拟化和测试数据管理平台,将环境相关缺陷从40%降至5%。解决技术难题的关键在于深入分析根源、设计系统性方案、借鉴成熟技术和持续学习改进。

arrow_forward

阅读状态

阅读时长

8 分钟

阅读进度

10%

章节:10 · 已读:1

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

最近更新:2025-08-24

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

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

免费下载download

分享题目

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

外部分享