TCP 的三次握手和四次挥手
TCP 的三次握手和四次挥手
引言
传输控制协议(TCP)是互联网协议套件中的核心协议之一,它为应用程序提供可靠的、有序的、错误检查的数据传输。TCP 连接的建立(三次握手)和终止(四次挥手)是其工作机制中最基本也是最重要的概念。
TCP 三次握手
三次握手是 TCP 用来建立连接的过程。它能确保双方都准备好进行数据传输,并同步双方的序列号和确认号。
过程详解
-
第一次握手(SYN)
- 客户端发送一个 SYN(同步)包到服务器
- 包含客户端的初始序列号(ISN)
- 进入 SYN_SENT 状态
-
第二次握手(SYN + ACK)
- 服务器收到 SYN 包后,发送一个 SYN+ACK 包作为响应
- ACK 的值为客户端的 ISN + 1
- 包含服务器自己的 ISN
- 服务器进入 SYN_RECEIVED 状态
-
第三次握手(ACK)
- 客户端收到 SYN+ACK 包后,发送一个 ACK 包
- ACK 的值为服务器的 ISN + 1
- 客户端进入 ESTABLISHED 状态
- 服务器收到 ACK 后也进入 ESTABLISHED 状态
图示
客户端 服务器
| |
|----------SYN(seq=x)----------->|
| |
|<---SYN+ACK(seq=y,ack=x+1)-------|
| |
|----------ACK(ack=y+1)--------->|
| |
为什么需要三次握手?
- 确保双方都有发送和接收的能力
- 同步双方的初始序列号
- 防止已失效的连接请求突然又传到服务器,造成错误
TCP 四次挥手
四次挥手是 TCP 用来终止连接的过程。它能确保双方都完成了数据的发送和接收。
过程详解
-
第一次挥手(FIN)
- 客户端发送一个 FIN 包,表示没有数据要发送了
- 进入 FIN_WAIT_1 状态
-
第二次挥手(ACK)
- 服务器收到 FIN 包后,发送一个 ACK 确认
- 进入 CLOSE_WAIT 状态
- 客户端收到 ACK 后,进入 FIN_WAIT_2 状态
-
第三次挥手(FIN)
- 服务器确保数据发送完毕后,发送一个 FIN 包
- 进入 LAST_ACK 状态
-
第四次挥手(ACK)
- 客户端收到 FIN 后,发送一个 ACK 确认
- 进入 TIME_WAIT 状态
- 等待 2MSL(最大报文生存时间)后,进入 CLOSED 状态
- 服务器收到 ACK 后,立即进入 CLOSED 状态
图示
客户端 服务器
| |
|------FIN------> |
| |
|<-----ACK ------|
| |
|<-----FIN------- |
| |
|------ACK ----->|
| |
为什么需要四次挥手?
- 全双工通信,每个方向都需要单独关闭
- 服务器收到 FIN 后,可能还有数据需要发送
- TIME_WAIT 状态确保最后一个 ACK 能到达服务器
常见问题
-
为什么建立连接是三次握手,而关闭连接是四次挥手?
- 建立连接时,服务器的 SYN 和 ACK 可以一起发送
- 关闭连接时,服务器的 ACK 和 FIN 一般不会一起发送,因为收到 FIN 后可能还有数据要发送
-
什么是 SYN 攻击?
- 攻击者发送大量 SYN 包但不完成三次握手
- 耗尽服务器资源,导致正常连接无法建立
-
为什么需要 TIME_WAIT 状态?
- 确保最后一个 ACK 能到达服务器
- 防止旧连接的数据包被新连接接收
结论
理解 TCP 的三次握手和四次挥手过程对于网络编程和故障排查至关重要。这些机制保证了 TCP 连接的可靠性和有序性,是现代互联网通信的基础。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!