网络安全 | TCP三次握手与四次挥手

引言

TCP(传输控制协议)是互联网最核心的协议之一,它提供了可靠的、面向连接的通信服务。无论是浏览网页、发送邮件还是使用即时通讯,背后都离不开TCP的握手与挥手过程。本文将用最直观的Mermaid流程图,带你彻底搞懂TCP的三次握手和四次挥手。

为什么需要三次握手?为什么是四次挥手?

在深入流程图之前,我们先理解两个核心问题:

为什么要三次握手?

  • 第一次握手:客户端告诉服务端"我要连接你"
  • 第二次握手:服务端回复"我收到了,你要连我吗?"
  • 第三次握手:客户端回复"好的,我们开始通信吧"

三次握手最小化地 保证了双方都有收发能力,同时避免了历史连接重复连接的干扰。

如果只有两次握手,服务端无法确认客户端是否真的准备好了,可能会浪费资源。

为什么要四次挥手?

TCP连接是全双工的,双方都可以独立关闭自己的数据通道:

  • 客户端说"我发完了"
  • 服务端说"我知道你发完了"
  • 服务端说"我也发完了"
  • 客户端说"我知道你也发完了"

四次挥手确保了双方的数据都完整传输完毕,并且可以优雅关闭。

TCP三次握手流程图

服务端(Server) 客户端(Client) 服务端(Server) 客户端(Client) 三次握手建立连接 连接建立,开始传输数据 1. SYN=1, seq=x (请求建立连接) 2. SYN=1, ACK=1, seq=y, ack=x+1 (同意建立连接) 3. ACK=1, seq=x+1, ack=y+1 (确认收到,连接建立成功)

三次握手详细说明

步骤 发送方向 报文关键信息 状态变化
1 客户端 → 服务端 SYN=1, seq=x 客户端进入 SYN_SENT
2 服务端 → 客户端 SYN=1, ACK=1, seq=y, ack=x+1 服务端进入 SYN_RCVD
3 客户端 → 服务端 ACK=1, seq=x+1, ack=y+1 双方进入 ESTABLISHED

seq是序列号,ack是确认号。ack = 对方seq + 1 表示"我已收到你的上一个包"。


TCP四次挥手流程图

服务端(Server) 客户端(Client) 服务端(Server) 客户端(Client) 四次挥手断开连接 此时Server可以继续发送数据 等待2MSL后关闭 1. FIN=1, seq=a (我没有数据要发了) 2. ACK=1, ack=a+1 (知道你没数据了) 3. FIN=1, seq=b (我也没数据要发了) 4. ACK=1, ack=b+1 (确认收到,彻底断开)

四次挥手详细说明

步骤 发送方向 报文关键信息 状态变化
1 客户端 → 服务端 FIN=1, seq=a 客户端进入 FIN_WAIT_1
2 服务端 → 客户端 ACK=1, ack=a+1 服务端进入 CLOSE_WAIT 客户端进入 FIN_WAIT_2
3 服务端 → 客户端 FIN=1, seq=b 服务端进入 LAST_ACK
4 客户端 → 服务端 ACK=1, ack=b+1 客户端进入 TIME_WAIT(等待2MSL) 服务端进入 CLOSED

2MSL = 2 × Maximum Segment Lifetime(报文最大生存时间),默认通常为2分钟,确保最后一个ACK能被对方收到。


常见问题

为什么连接是三次握手,关闭是四次挥手?

  • 连接时,服务端的SYN和ACK可以合并成一次发送(第二步)。
  • 关闭时,客户端先发出FIN表示自己不再发送数据,但服务端可能还有数据要发,所以ACK和FIN必须分开发送,因此需要四次。

为什么客户端最后要等待2MSL?

  • 保证最后一个ACK能被服务端收到。如果ACK丢失,服务端会重发FIN,客户端可以再次响应。
  • 防止"旧连接"的迷途报文影响新连接。

什么是半关闭状态?

  • 在第一次挥手之后,客户端不再发送数据,但可以接收数据,服务端也可以继续发送数据,这就是半关闭 状态(FIN_WAIT_2)。

如果服务端同时收到多个连接请求怎么办?

  • 服务端会将每个连接请求放入半连接队列(SYN队列),三次握手完成后移入全连接队列(Accept队列)。

Linux 下查看TCP状态

bash 复制代码
# 查看所有TCP连接状态
netstat -ant

# 查看连接状态统计
ss -s

# 查看某个端口的连接状态
lsof -i :8080

常见状态:

  • LISTEN:监听
  • SYN_SENTSYN_RCVD:握手过程中
  • ESTABLISHED:已建立连接
  • FIN_WAIT_1FIN_WAIT_2TIME_WAITCLOSE_WAITLAST_ACK:挥手中

总结

对比项 三次握手 四次挥手
目的 建立可靠连接 优雅关闭连接
次数 3次 4次
能否合并包 可以(SYN+ACK) 不能(ACK和FIN必须分开)
关键状态 ESTABLISHED TIME_WAITCLOSE_WAIT
是否必须
相关推荐
虹科网络安全4 小时前
Redis 安全公告:CVE-2026-81934 TLS 处理漏洞及修复建议
网络·人工智能·网络安全
小程序设计5 小时前
某师范学院网络规划与设计
网络·安全
2401_873479406 小时前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip
可爱系程序猿7 小时前
WSD 打印机时好时坏:从发现服务、地址变化到 Standard TCP/IP 端口的迁移记录
网络·网络协议·tcp/ip·程序人生·电脑
蓝速科技8 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
济南凡维9 小时前
CODESOFT中如何将标签保存为PDF文件
网络·人工智能·打印机·codesoft
德迅云安全杨德俊9 小时前
高防IP:构建“防护-加速-管控”三位一体的全链路安全体系
网络·安全·ddos
猫哥随身wifi9 小时前
随身WiFi 怎么选?2026 主流品牌随身 WiFi 对比与选购避坑参考
网络·人工智能·5g·智能手机
en.en..9 小时前
TCP套接字编程 完整流程解析(服务端 + 客户端)
网络
Quanqiucard10 小时前
“十五五”数字乡村建设提速,平安乡村监控物联网卡怎么选才稳定
网络·物联网