TCP的三次握手与四次挥手

TCP 三次握手与四次挥手,其实就是把"开始"和"结束"确认清楚

刚开始学 TCP 的时候,很多人都会被"三次握手"和"四次挥手"绕进去。建立连接就建立连接,断开连接就断开连接,为什么还要搞这么多步骤?真的有必要吗?

其实只要抓住一点就够了:TCP 是一种追求可靠性的协议。网络本身并不稳定,丢包、延迟、乱序这些问题都可能发生。如果双方还没确认清楚状态,就直接开始传数据,出了问题谁负责?所以 TCP 的这些设计,说到底就是为了让通信这件事更稳一点、更靠谱一点。

三次握手:先确认双方都准备好了

TCP 在正式传输数据之前,会先进行三次握手。这个过程本质上就是双方先打个招呼,把状态确认清楚,避免一上来就"自作多情"。

第一次握手,客户端发送一个 SYN 报文,可以理解成一句很简单的话:"我想和你建立连接,你在吗?"

第二次握手,服务器收到之后,会回复一个 SYN + ACK,意思就是:"我收到了,你发过来的消息没问题。我这边也准备好了,那你能收到我的回复吗?"

第三次握手,客户端再回复一个 ACK,表示:"能收到,你这边也没问题,那我们正式开始通信吧。"

到了这一步,连接才算真正建立。

那为什么一定要三次?两次不行吗?关键就在于,两次还不够让双方都彻底确认状态。如果只有两次,服务器虽然回复了客户端,但它并不知道客户端到底有没有收到这个回复。万一客户端没收到,服务器却已经以为连接建立好了,那后面的数据传输不就可能出问题了吗?

所以,三次握手并不是为了显得复杂,而是为了确认一件事:双方的发送和接收能力都是正常的。该确认的都确认完了,后面传数据才有意义,不是吗?

四次挥手:不是一下断掉,而是双方分别结束

理解了三次握手,再看四次挥手其实就没那么难了。

很多人会问,建立连接只要三次,为什么断开连接反而要四次?按理说,结束不是应该更简单吗?

问题就在于,TCP 是全双工通信。也就是说,客户端和服务器都可以独立发送数据。你这边不发了,不代表对方也立刻发完了。所以断开连接的时候,不能一句"拜拜"就直接结束,而是要两边分别把自己的发送通道关掉。

第一次挥手,客户端发送一个 FIN,意思是:"我这边已经没有数据要发了。"

第二次挥手,服务器回复 ACK,表示:"好,我知道你这边发完了。"

但这里要注意,服务器只是知道客户端不发了,并不代表服务器自己也已经发完了。也许它还有一些数据没传完,所以连接这时候还不能直接断。

第三次挥手,等服务器自己的数据也发完了,它再发送一个 FIN,意思是:"我这边也结束了。"

第四次挥手,客户端最后回复一个 ACK,表示:"好,那这次真的可以断开了。"

你看,四次挥手本质上不是"多此一举",而是因为 TCP 的连接是双向的,关闭时自然也要分开处理。说白了,就是你关你的,我关我的,谁都别糊里糊涂。

为什么最后还要有 TIME_WAIT?

讲到这里,通常还会遇到一个问题:客户端在最后回复完 ACK 之后,为什么还不能立刻关闭,而是要进入 TIME_WAIT 状态?

这个设计看起来有点麻烦,但实际上很有必要。

你想一下,如果客户端发出的最后一个 ACK 丢了,服务器就会以为自己的 FIN 没有被确认,于是它会重新发送一次 FIN。这时候如果客户端已经直接把连接彻底关掉了,那这个重发的 FIN 就没人处理了,连接状态就可能变得混乱。

所以 TCP 选择让客户端先等一会儿,留出一个缓冲时间。这样做主要有两个目的:第一,防止最后的确认丢失后没人补救;第二,避免旧连接里残留的数据影响后面新的连接。

说到底,TIME_WAIT 不是浪费,而是 TCP 在替不可靠的网络"兜底"。网络都不一定靠谱,协议多留一步保险,不也很正常吗?

我的理解:TCP 麻烦一点,是因为它不想出错

如果只背概念,三次握手和四次挥手很容易变成一堆死流程。但从本质上看,它们其实都在做同一件事:把状态确认清楚。

三次握手,解决的是"连接怎么可靠地建立";

四次挥手,解决的是"连接怎么可靠地关闭"。

TCP 之所以看起来步骤多,不是因为它喜欢复杂,而是因为它不相信网络环境会一直老老实实。少一次确认,平时可能没什么感觉,但真遇到丢包、超时或者异常情况的时候,问题就出来了。那既然这样,开始之前多确认一次,结束之前再确认一次,不是更稳妥吗?

总结

三次握手和四次挥手,其实没有表面看上去那么难。前者是在正式通信前确认双方都准备好了,后者是在断开连接时确认双方都处理完了。看似步骤很多,实际上都围绕着"可靠"两个字展开。

所以,TCP 真正想解决的,从来不是"怎么更快地连上"或者"怎么更快地断开",而是"怎么在不稳定的网络里,把连接这件事处理得足够清楚、足够安全"。这也正是它能长期成为主流传输协议的重要原因。

相关推荐
小白的码BUG之路5 小时前
linux -- ssh两台机器相连
运维·服务器·ssh
2603_969579285 小时前
备份最常用的三个软件是什么软件
网络
缓慢更新6 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Data_Journal7 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
续写烂尾7 小时前
贴片 SD NAND、eMMC、TF 卡规格怎么定?硬件工程师选型清单
运维·服务器·网络
不昀7 小时前
网口Link Up后仍然掉线,怎样区分物理链路和数据通路问题?
linux·以太网
重生之高冷汉堡包7 小时前
移动代理 VS 住宅代理IP:性能成本对比与选择
网络
迪康妍妍7 小时前
终端管控实操:封堵网盘与IM外发通道的落地思路
运维·网络·安全·架构·安全性测试
科技小E7 小时前
监控设备品牌杂乱无法互通?EasyGBS打通孤岛,统一汇聚视频
服务器·网络·音视频
YH_Analytics7 小时前
2026-2032 食品吸液垫行业市场规模与增长预测
大数据·网络·人工智能