TCP三次握手与四次挥手,如何演绎社恐程序的破冰与告别仪式?

摘要:在网络世界里,TCP协议绝对是“严谨派”代表——不像UDP那样“发完就跑”,TCP要让两个设备传数据,非得先走一套“确认三连”的破冰流程;而聊完收场时,也得按规矩来一套“告别四步走”,绝不敷衍离场。这两套流程,就是咱们今天要扒透的TCP三次
在网络世界里,TCP协议绝对是“严谨派”代表——不像UDP那样“发完就跑”,TCP要让两个设备传数据,非得先走一套“确认三连”的破冰流程;而聊完收场时,也得按规矩来一套“告别四步走”,绝不敷衍离场。这两套流程,就是咱们今天要扒透的TCP三次握手(建立连接)与四次挥手(关闭连接)。 其实说白了,三次握手是客户端和服务器的“破冰仪式”,就像两个社恐网友第一次打电话,反复确认信号通不通才敢开唠;而四次挥手则是“体面告别”,好比聊天结束后,双方要反复确认“你说完了吗”“我说完了,你可以挂了”,生怕挂早了漏了重要内容。前面咱们用生活化场景拆解了三次握手的实际流程,接下来就顺着节奏,把四次挥手的通俗逻辑和底层原理一并讲透。 先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器):客户端发SYN报文发起连接,内核分配临时端口、创建TCB,状态从CLOSED→SYN-SENT; 第二步(服务器→客户端):服务器收SYN后发SYN+ACK报文回应,创建TCB,状态从LISTEN→SYN-RCVD; 第三步(客户端→服务器):客户端收SYN+ACK后发ACK报文(可带数据),状态从SYN-SENT→ESTABLISHED;服务器收ACK后状态→ESTABLISHED,连接正式建立。 连接建立后,双方就可以愉快传输数据了。而当数据传完要关闭连接时,因为TCP是“全双工通信”(双方可同时发数据),不能像建立连接那样简化为三次,必须通过四次交互确认双方都不再发数据,这就是四次挥手的由来。 前置补充:四次挥手的核心前提与关键概念 挥手前先明确两个核心点,避免理解偏差: 1. 全双工通信与关闭逻辑 TCP是全双工协议,客户端和服务器可同时发送数据。因此关闭连接时,要分别确认“客户端→服务器”和“服务器→客户端”两个方向的数据流都已终止,不能一次性关闭双向连接。 2. 新增标记位(FIN)与状态 挥手过程除了用到ACK标记位,还会用到新的标记位FIN(Finish,结束),同时涉及几个新的TCP状态,核心如下: 【FIN=1】:表示发送方已无数据要发,请求关闭自己这边的数据流; 【FIN-WAIT-1】:发送FIN后等待对方ACK的状态; 【CLOSE-WAIT】:收到对方FIN后,确认关闭请求,等待自己这边数据发完再发FIN; 【TIME-WAIT】:客户端最后发完ACK后,等待2MSL(报文最大生存时间),确保对方收到FIN的ACK,避免报文丢失导致重发。 四次挥手全流程:社恐式告别+实际底层交互 咱们依然以“手机退出微信”为例,一边用通俗对话理解逻辑,一边补充操作系统内核、报文交互等实际细节,兼顾易懂性与技术深度。 第一步:主动方发起告别请求(FIN+ACK报文,主动关闭) 场景:你点击微信退出登录,客户端(手机)作为主动关闭方,告知服务器“我这边数据发完了,要关连接了”。 实际行为:微信客户端程序调用close()接口,通知内核关闭连接。客户端内核做两件事: 停止发送新数据,将未发完的数据一次性发完,然后构造FIN+ACK报文(FIN=1表示关闭自身数据流,ACK=1确认之前收到的服务器数据),序号seq=u(u是客户端最后一次发数据的序号+1),确认号ack=v(v是服务器最后一次发数据的序号+1); 发送报文后,释放部分资源,仅保留接收数据的能力(防止服务器还有数据要发)。 拟人对话:客户端(温和):“服务器大佬,我这边数据都发完了,要关我这边的连接了(FIN=1),你之前发的内容我都收到了(ACK=1),你还有要发的吗?” 状态变化:客户端TCP状态从ESTABLISHED→FIN-WAIT-1,开始计时,等待服务器的ACK回应。 第二步:被动方确认告别请求(ACK报文,等待自身数据发完) 场景:微信服务器收到客户端的告别请求,先确认“收到了”,同时继续处理自己这边未发完的数据(比如最后的登录状态同步)。 实际行为:服务器内核收到FIN+ACK报文后,校验序号、确认号无误,然后: 构造ACK报文(ACK=1),序号seq=v,确认号ack=u+1(告知客户端“你的FIN我收到了,你可以不用等我回应了”); 发送ACK后,服务器不会立即关闭连接,而是继续发送自身未完成的数据,此时服务器仅关闭“客户端→服务器”的数据流,自身仍可向客户端发数据。 拟人对话:服务器(沉稳):“收到你的告别请求了(ACK=1),我这边还有点数据没发完,你先等我一下,发完了我再告诉你。
阅读全文