大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了常见的前端开发技术,我还擅长3D开发,熟练使用Three.js进行3D图形绘制,并在虚拟现实与数字孪生技术上积累了丰富的经验,特别是在虚幻引擎开发方面,有着深入的理解和实践。
我一直认为技术的不断探索和实践是进步的源泉,近年来,我深入研究大数据算法的应用与发展,尤其在数据可视化和交互体验方面,取得了显著的成果。我也注重与团队的合作,能够有效地推动项目的进展和优化开发流程。现在,我担任全栈工程师,拥有CSDN博客专家认证及阿里云专家博主称号,希望通过分享我的技术心得与经验,帮助更多人提升自己的技术水平,成为更优秀的开发者。
目录
大家好,我是前端开发工程师小杨。今天咱们来聊聊 TCP 连接的建立和断开,也就是传说中的三次握手(Three-way Handshake)和四次挥手(Four-way Handshake)。
你可能觉得这是后端的事情,但前端也得懂点网络知识,尤其是调试接口慢、连接异常时,知道底层原理才能更快定位问题!
1. TCP 连接:像谈恋爱一样严谨
TCP(传输控制协议)是一种可靠的传输协议,就像两个人谈恋爱,得先确认彼此心意(三次握手),分手时也要好好告别(四次挥手)。
🌰 举个栗子:我和服务器谈恋爱
-
三次握手:我和服务器互相确认,建立稳定连接
-
四次挥手:我和服务器和平分手,确保数据不丢失
2. 三次握手:TCP 的“确认眼神”
三次握手的目标是确保客户端和服务器都能正常收发数据。
流程:
-
第一次握手(SYN)
-
我 → 服务器:
SYN=1, seq=x
(“嗨,能听到我吗?”) -
我进入
SYN_SENT
状态
-
-
第二次握手(SYN+ACK)
-
服务器 → 我:
SYN=1, ACK=1, seq=y, ack=x+1
(“听到了!你也能听到我吗?”) -
服务器进入
SYN_RCVD
状态
-
-
第三次握手(ACK)
-
我 → 服务器:
ACK=1, seq=x+1, ack=y+1
(“听到了!咱们开始聊天吧!”) -
双方进入
ESTABLISHED
状态,连接建立!
-
为什么是三次?两次不行吗?
-
两次握手:服务器无法确认我是否能收到它的回复(可能我早就断开了)
-
三次握手:确保双方都能正常收发数据,避免资源浪费
3. 四次挥手:TCP 的“和平分手”
TCP 连接断开时,需要确保数据全部传输完毕,不能突然“拉黑”。
流程:
-
第一次挥手(FIN)
-
我 → 服务器:
FIN=1, seq=u
(“我要走了,拜拜!”) -
我进入
FIN_WAIT_1
状态
-
-
第二次挥手(ACK)
-
服务器 → 我:
ACK=1, ack=u+1
(“好的,等我处理完最后的数据”) -
服务器进入
CLOSE_WAIT
状态 -
我进入
FIN_WAIT_2
状态
-
-
第三次挥手(FIN)
-
服务器 → 我:
FIN=1, ACK=1, seq=v, ack=u+1
(“我也准备好了,再见!”) -
服务器进入
LAST_ACK
状态
-
-
第四次挥手(ACK)
-
我 → 服务器:
ACK=1, ack=v+1
(“好的,正式断开!”) -
我进入
TIME_WAIT
状态(等待 2MSL 后彻底关闭)
-
为什么是四次?三次不行吗?
-
服务器可能还有数据要发送,不能直接断开
-
四次挥手确保双方都完成数据收发,避免数据丢失
4. 常见面试题
Q1:为什么 TIME_WAIT 要等 2MSL?
-
MSL(Maximum Segment Lifetime) 是数据包在网络中的最大存活时间
-
等待 2MSL 是为了:
-
确保最后一个 ACK 到达服务器(如果丢失,服务器会重发 FIN)
-
让旧连接的数据包彻底消失,避免影响新连接
-
Q2:握手能变成两次吗?挥手能变成三次吗?
-
握手不能两次(无法确认客户端能收到服务器的回复)
-
挥手有时能三次(如果服务器没有数据要发,FIN 和 ACK 可以合并)
5. 总结
-
三次握手:建立连接,确保双方都能通信
-
四次挥手:断开连接,确保数据不丢失
-
TIME_WAIT:防止旧连接干扰新连接
🚀 前端也要懂点网络知识! 下次遇到接口慢、连接异常时,想想是不是 TCP 的“恋爱仪式”出了问题~
你有遇到过 TCP 相关的问题吗?欢迎评论区交流! 👇