Interview AiBox logo

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

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

请解释TCP的三次握手和四次挥手过程

lightbulb

题型摘要

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. 三次握手时序图

--- title: TCP三次握手时序图 --- sequenceDiagram participant Client participant Server Note over Client,Server: 连接开始 Client->>Server: SYN(seq=x) activate Client Note right of Client: SYN_SENT状态 Server->>Client: SYN(seq=y) ACK(ack=x+1) activate Server Note right of Server: SYN_RCVD状态 Client->>Server: ACK(seq=x+1, ack=y+1) Note right of Client: ESTABLISHED状态 Note right of Server: ESTABLISHED状态 Note over Client,Server: 连接建立完成

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. 四次挥手时序图

--- title: TCP四次挥手时序图 --- sequenceDiagram participant Client participant Server Note over Client,Server: 连接已建立 Client->>Server: FIN(seq=u) activate Client Note right of Client: FIN_WAIT_1状态 Server->>Client: ACK(ack=u+1, seq=v) activate Server Note right of Server: CLOSE_WAIT状态 Note right of Client: FIN_WAIT_2状态 Server->>Client: FIN(seq=w, ack=u+1) Note right of Server: LAST_ACK状态 Client->>Server: ACK(seq=u+1, ack=w+1) Note right of Client: TIME_WAIT状态(等待2MSL) Note right of Server: CLOSED状态(连接关闭) Note over Client: 等待2MSL后 Note right of Client: CLOSED状态(连接完全关闭)

3. 为什么需要四次挥手

四次挥手的主要原因是TCP连接是全双工的,每个方向都必须单独进行关闭。

  • 四次挥手的原因

    1. 当主动关闭方发送FIN包时,仅表示它不再发送数据了,但仍能接收数据
    2. 被动关闭方收到FIN后,可能还有数据需要发送,因此不能立即关闭连接
    3. 被动关闭方需要先发送ACK确认收到FIN,然后等待自己的数据发送完毕
    4. 数据发送完毕后,被动关闭方再发送FIN包,表示自己也没有数据要发送了
    5. 主动关闭方收到FIN后,发送ACK确认,并等待一段时间确保对方收到
  • TIME_WAIT状态的作用

    1. 确保最后一个ACK能够到达:如果服务器没有收到客户端的最终ACK,会重新发送FIN包,客户端在TIME_WAIT状态下可以重新发送ACK。
    2. 处理延迟的报文段:等待2MSL时间可以使本连接持续时间内所产生的所有报文段都从网络中消失,防止已失效的报文出现在下一个连接中。

三、TCP连接状态转换

--- title: TCP连接状态转换图 --- stateDiagram-v2 [*] --> CLOSED CLOSED --> LISTEN: 服务器调用listen() LISTEN --> SYN_RCVD: 收到SYN LISTEN --> SYN_SENT: 应用调用connect() SYN_RCVD --> ESTABLISHED: 收到ACK SYN_RCVD --> FIN_WAIT_1: 应用调用close() SYN_SENT --> ESTABLISHED: 收到SYN+ACK,发送ACK SYN_SENT --> SYN_RCVD: 收到SYN,发送SYN+ACK ESTABLISHED --> FIN_WAIT_1: 应用调用close() ESTABLISHED --> CLOSE_WAIT: 收到FIN,发送ACK FIN_WAIT_1 --> FIN_WAIT_2: 收到ACK FIN_WAIT_1 --> CLOSING: 收到FIN,发送ACK FIN_WAIT_1 --> TIME_WAIT: 同时收到FIN和ACK FIN_WAIT_2 --> TIME_WAIT: 收到FIN,发送ACK CLOSING --> TIME_WAIT: 收到ACK CLOSE_WAIT --> LAST_ACK: 应用调用close() LAST_ACK --> CLOSED: 收到ACK TIME_WAIT --> CLOSED: 等待2MSL CLOSED --> [*]

四、实际应用中的意义

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调用性能以及用户体验。

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包,连接关闭。三次握手防止失效连接请求,四次挥手因TCP全双工特性需单独关闭每个方向。TIME_WAIT状态确保可靠关闭并处理延迟报文。

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请解释TCP三次握手的过程。

TCP三次握手是建立可靠网络连接的关键过程,通过SYN、SYN+ACK和ACK三个数据包的交换,确保客户端和服务端都具备收发能力并同步序列号。第一次握手客户端发送SYN包并进入SYN_SENT状态;第二次握手服务端回复SYN+ACK包并进入SYN_RCVD状态;第三次握手客户端发送ACK包,双方都进入ESTABLISHED状态,连接建立完成。三次握手而非两次或四次的设计是为了在保证可靠性的同时避免不必要的延迟和潜在问题。

arrow_forward

TCP和UDP有什么区别?

TCP和UDP是两种核心的传输层协议,主要区别在于:TCP是面向连接的可靠传输协议,通过三次握手建立连接,提供确认重传、流量控制和拥塞控制机制,保证数据不丢失、不重复、按序到达,适用于文件传输、电子邮件等高可靠性场景;UDP是无连接的不可靠传输协议,无需建立连接,直接发送数据报,不保证数据可靠性,但传输速度快、开销小,适用于实时音视频、在线游戏、DNS查询等实时性要求高的场景。选择哪种协议取决于应用对可靠性和实时性的需求权衡。

arrow_forward

什么是跨域问题?如何解决前端跨域请求?

跨域问题是浏览器的同源策略导致的,限制了一个域的文档或脚本获取另一个域的资源。常见解决方案包括:JSONP(利用script标签无跨域限制)、CORS(通过HTTP头部控制访问权限)、代理服务器(同源转发)、WebSocket(双向通信协议)、postMessage(跨文档通信)、document.domain(设置相同主域)和window.name(利用窗口名称特性)。选择方案时需考虑兼容性、安全性和场景需求,现代应用首选CORS,实时通信可选WebSocket,无法控制服务器时可考虑代理。

arrow_forward

什么是跨域?有哪些解决跨域的方法?

跨域是Web开发中因浏览器同源策略导致的限制,当协议、域名或端口不同时发生。解决跨域的主要方法有:1) CORS(跨域资源共享),通过服务器设置HTTP响应头实现,是最推荐的标准化方案;2) JSONP,利用script标签跨域特性,但仅支持GET请求;3) 代理服务器,通过同源服务器转发请求;4) WebSocket,双向通信协议,不受同源限制;5) postMessage,HTML5 API,用于窗口间安全通信;6) document.domain,适用于子域间通信;7) window.name和location.hash,利用浏览器特性实现但安全性较低。选择方案需考虑安全性、兼容性、通信类型和实现复杂度等因素。

arrow_forward

请详细解释HTTPS的工作原理和加密过程。

HTTPS是HTTP的安全版本,通过SSL/TLS协议实现数据加密、身份验证和完整性保护。其工作原理主要分为两个阶段:SSL/TLS握手阶段和数据传输阶段。在握手阶段,客户端和服务器协商加密算法、验证服务器身份并生成会话密钥;在数据传输阶段,使用会话密钥进行对称加密通信。HTTPS结合了对称加密(效率高)和非对称加密(安全密钥交换)的优点,通过数字证书验证服务器身份,防止中间人攻击,并使用哈希函数保证数据完整性。随着网络安全意识的提高,HTTPS已成为网站的标准配置。

arrow_forward

阅读状态

阅读时长

8 分钟

阅读进度

7%

章节:14 · 已读:0

当前章节: 一、TCP三次握手(建立连接)

最近更新:2025-08-23

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

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

免费下载download

分享题目

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

外部分享