首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网络协议基础:TCP 三次握手 / 四次挥手

网络协议基础:TCP 三次握手 / 四次挥手

原创
作者头像
智维攻城狮
发布2025-09-11 18:13:31
发布2025-09-11 18:13:31
38600
代码可运行
举报
文章被收录于专栏:Linux运维Linux运维
运行总次数:0
代码可运行

网络协议基础:TCP 三次握手 / 四次挥手

1. 前言

在互联网的世界里,数据能够有序、可靠地在不同设备之间传输,背后离不开各种网络协议的支撑。其中,传输控制协议(TCP)作为 TCP/IP 协议族中至关重要的一员,凭借其可靠、面向连接、字节流的特性,成为了 HTTP、FTP、SMTP 等众多应用层协议的基础。而 TCP 实现 “可靠连接” 与 “优雅断开” 的核心机制,正是广为人知的 “三次握手” 与 “四次挥手”。本文将从 TCP 的核心特性出发,详细拆解这两个关键过程,帮助读者理解网络通信背后的底层逻辑。

TCP 的核心特性:为何需要 “握手” 与 “挥手”?

在深入讲解 “三次握手” 和 “四次挥手” 之前,我们首先需要明确 TCP 的核心设计目标 ——可靠性。与 UDP(用户数据报协议)的 “无连接、不可靠” 不同,TCP 需要确保数据从发送方到接收方的过程中 “不丢失、不重复、按序到达”。为了实现这一目标,TCP 引入了 “面向连接” 的机制:在数据传输前,通信双方必须先建立一个稳定的 “连接”;数据传输完成后,再通过规范的流程断开连接,避免资源浪费或数据残留。

而 “三次握手” 就是 TCP 建立连接的过程,其核心目的是同步通信双方的序列号(Sequence Number) ,并确认双方的发送和接收能力正常;“四次挥手” 则是 TCP 断开连接的过程,主要用于确保双方都已完成数据传输,避免因一方提前断开导致数据丢失。

2. TCP 连接的生命周期

一个 TCP 连接的生命周期大致分为:

  1. 建立连接(三次握手)
  2. 数据传输
  3. 断开连接(四次挥手)

3. 三次握手(Three-way Handshake)

3.1 目的

  • 确认双方的发送与接收能力正常
  • 同步双方的初始序列号(ISN)
  • 建立可靠的全双工通信通道

3.2 握手过程

步骤

发起方(客户端)

接收方(服务器)

说明

第一次握手

发送 SYN=1, seq=x

等待连接请求

客户端请求建立连接,并发送初始序列号 x

第二次握手

等待确认

发送 SYN=1, ACK=1, seq=y, ack=x+1

服务器同意连接,并发送自己的初始序列号 y,同时确认收到 x

第三次握手

发送 ACK=1, seq=x+1, ack=y+1

连接建立

客户端确认收到 y,连接正式建立

3.3 时序图

代码语言:javascript
代码运行次数:0
运行
复制
客户端                                服务器
  | ----------- SYN, seq=x ---------> |
  | <--- SYN, ACK, seq=y, ack=x+1 --- |
  | ----------- ACK, ack=y+1 --------> |

4. 四次挥手(Four-way Handshake)

4.1 目的

  • 双方都能独立关闭发送通道
  • 确保数据传输完成后再释放连接

4.2 挥手过程

步骤

主动关闭方

被动关闭方

说明

第一次挥手

发送 FIN=1, seq=u

等待关闭请求

主动方表示数据发送完毕,请求关闭发送通道

第二次挥手

等待对方数据

发送 ACK=1, ack=u+1

被动方确认收到关闭请求,但可能还有数据要发

第三次挥手

等待确认

发送 FIN=1, seq=v

被动方数据发送完毕,请求关闭发送通道

第四次挥手

发送 ACK=1, ack=v+1

连接关闭

主动方确认收到关闭请求,进入 TIME_WAIT 状态

4.3 时序图

代码语言:javascript
代码运行次数:0
运行
复制
主动关闭方                          被动关闭方
  | ----------- FIN, seq=u --------> |
  | <----------- ACK, ack=u+1 ------- |
  | <----------- FIN, seq=v --------- |
  | ----------- ACK, ack=v+1 --------> |
img
img

5. 为什么握手是三次,挥手是四次?

  • 三次握手: 因为双方需要交换一次 SYN 并确认对方的 SYN,总共需要三步。
  • 四次挥手: TCP 是全双工的,关闭发送和接收通道是独立的,所以需要两对 FIN/ACK

6. 常见问题与排查技巧

6.1 SYN Flood 攻击

  • 攻击者发送大量 SYN 包但不完成握手,导致服务器资源耗尽。
  • 防御措施:SYN Cookies、限制半连接队列、启用防火墙规则

6.2 TIME_WAIT 过多

  • 主动关闭方会进入 TIME_WAIT 状态(默认 2MSL 时间)。
  • 影响:占用端口资源。
  • 优化:调整内核参数(如 tcp_tw_reusetcp_tw_recycle),但需谨慎。

7. 总结

  • 三次握手:建立连接,确保双方通信能力正常。
  • 四次挥手:优雅关闭,确保数据完整传输。
  • 掌握 TCP 连接过程,有助于网络调试、安全防护与性能优化。

💡 实战建议: 在抓包工具(如 Wireshark、tcpdump)中观察 TCP 握手/挥手过程,是理解协议的最佳方式。 你可以在测试环境运行:

代码语言:javascript
代码运行次数:0
运行
复制
tcpdump -i eth0 tcp and port 80

然后用浏览器访问 HTTP 服务,直观看到三次握手与四次挥手的全过程。

TCP 的三次握手与四次挥手,是网络通信中 “可靠连接” 与 “优雅断开” 的核心保障。三次握手通过同步序列号和确认收发能力,确保连接建立的可靠性;四次挥手通过分阶段关闭双向通道,避免数据丢失;而TIME-WAIT状态则进一步保障了连接断开后的网络稳定性。

理解这两个过程,不仅能帮助我们更深入地掌握 TCP 协议的设计思想,还能为后续学习 HTTP、HTTPS 等应用层协议,以及排查网络问题奠定坚实的基础。在互联网技术飞速发展的今天,这些底层协议的逻辑始终是构建可靠网络服务的基石。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网络协议基础:TCP 三次握手 / 四次挥手
    • 1. 前言
    • 2. TCP 连接的生命周期
    • 3. 三次握手(Three-way Handshake)
      • 3.1 目的
      • 3.2 握手过程
      • 3.3 时序图
    • 4. 四次挥手(Four-way Handshake)
      • 4.1 目的
      • 4.2 挥手过程
      • 4.3 时序图
    • 5. 为什么握手是三次,挥手是四次?
    • 6. 常见问题与排查技巧
      • 6.1 SYN Flood 攻击
      • 6.2 TIME_WAIT 过多
    • 7. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档