2026/4/17 1:32:08
网站建设
项目流程
网站开发的目的和意义,网站首页 动画案例,软件开发主要是做什么,传奇兄弟们#xff0c;最近看到个很有意思的段子。有个哥们给对象发#xff1a;“我饿了。”对象回了个#xff1a;“#x1f602;”。然后这哥们就炸了#xff1a;“你什么意思#xff1f;敷衍我#xff1f;”其实#xff0c;作为一个后端开发者#xff0c;我必须得为这位…兄弟们最近看到个很有意思的段子。有个哥们给对象发“我饿了。”对象回了个“”。然后这哥们就炸了“你什么意思敷衍我”其实作为一个后端开发者我必须得为这位对象说句公道话人家没敷衍你人家这是标准的 TCP 协议实现啊是你的客户端逻辑没写对卡在半连接状态了。今天咱们就借着这个“聊天事故”把计算机网络里最经典的TCP 三次握手来好好谈一下。别以为这只是面试背八股文搞懂了它你以后撩妹就知道该怎么回消息了。一、 第一次握手SYN 的试探想象一下你客户端 Client想约女神服务端 Server吃饭。你不能直接冲过去塞一口饭到她嘴里那是 UDP暴力且不负责任。TCP 讲究的是可靠连接在发数据之前必须先建立一条虚拟的通路。于是你发出了第一条消息你Client“在吗我想约你。”(技术翻译发送 SYN 包seq x)SYN (Synchronize Sequence Numbers)同步序列号。意思就是“我要开始连你了”。seq x这是我这边的初始序号ISN为了防止网络上的乱包我得给你个暗号。这时候你的状态变成了SYN_SENT已发送焦急等待中。二、 第二次握手ACK SYN 的拉扯重点来了这就是那张图里“回了个表情包”的阶段。女神Server收到了你的消息。如果她对你有意思端口是 Open 的她必须做两件事确认收到ACK告诉你“我知道你想约我”。发起邀请SYN她也得问你“那你准备好接受我的回复了吗”于是她回了女神Server“已读收到” “那咱聊聊”(技术翻译发送 SYN ACK 包ack x1, seq y)ACK (Acknowledgment)确认号。x1是告诉你你刚才那个序号x的包我收到了你可以发下一个了。SYN服务端也得建立连接所以她也得发个自己的序号seq y。关键点就在这儿很多兄弟看到女神回个表情包或者回个“嗯”就觉得对方冷漠。错大错特错在 TCP 协议里服务器发送 SYN-ACK 包代表它同意建立连接。它现在的状态是 SYN_RCVD半连接状态。它在等什么它在等你的确认啊如果你这时候不回话或者在那生闷气这连接就断了三、 第三次握手ACK 的一锤定音那张图里的博主说得对这时候你应该直接回“想吃火锅还是日料”这在技术上叫什么叫发送 ACK 包。你Client“收到了走吃火锅去”(技术翻译发送 ACK 包ack y1, seq x1)ACK y1告诉服务端你发的那个序号y我也收到了。ESTABLISHED连接建立这一步发出去之后客户端和服务端的状态都变成了ESTABLISHED。哪怕这第三个包丢了只要你后续带着数据比如“吃火锅”这三个字发过去服务器一旦收到也能确认连接建立。从此你们俩就建立了一条稳定的、全双工的通道可以开始没羞没臊的数据传输了。四、 灵魂拷问为什么要三次两次不行吗这是面试官最爱问的问题也是“聊天止于呵呵”的技术原因。如果只有两次握手会发生什么场景还原你发了句“在吗”SYN结果网络卡了这消息绕了地球一圈没送到。你等得不耐烦又发了一句“在吗”重传 SYN。女神收到了第二句回了“在”SYNACK。假设只有两次握手这时候连接就建立了。你们聊完天分手断开连接。高能预警这时候你最早发的那个绕地球一圈的“在吗”旧 SYN终于到了女神手机上。女神一看“哟他又来找我了” 于是她又回了个“在”。如果是两次握手机制女神Server只要回了话就认为连接建立了开始傻傻地等着你说话浪费她的手机电量和内存资源。而你Client压根没想理她。所以第三次握手是为了防止“已失效的连接请求”突然传到服务端导致服务端资源浪费。翻译成人话就是必须双方都确认“即使网络很烂我们也能听到对方说话”这事儿才算成。五、 四次挥手分手的艺术聊完了数据传完了总得结束吧。TCP 断开连接比建立连接更麻烦需要四次挥手。为什么因为感情连接是双向的。你想分手不代表我也想分手我不发消息了不代表我也拒收消息。Client你“我话说完了挂了啊。”发送FIN进入FIN_WAIT_1Server女神“哦知道你说话完了。”发送ACK进入CLOSE_WAIT注意这时候连接处于“半关闭”状态。你不能发数据了但女神如果还有话没说完比如还有数据没传完她可以继续说你还得听着。Server女神“行吧那我也没啥说的了拜拜。”数据传完了发送FIN进入LAST_ACKClient你“好拜拜。”发送ACK进入TIME_WAIT这里有个大坑TIME_WAIT发完最后一个 ACK 后你不能直接删好友跑路你得等。等多久2MSL最长报文段寿命一般是几分钟。为什么要等万一你最后这句“拜拜”丢包了呢女神没听到你答应她会以为你没收到她的分手宣言她会重发一次“拜拜”。如果你直接跑了她重发过来你没反应这就成“烂尾”了。为了体面地分手你必须多等一会儿确保对方真的挂了电话。六、 总结TCP 教会我们的恋爱哲学看完 TCP 协议你会发现设计这个协议的人简直是情感大师不要玻璃心对方回个 ACK表情包可能只是为了确认收到她在等你的下一步 payload干货。确认机制很重要凡事有交代件件有着落事事有回音ACK这才是靠谱的连接。分手要体面留出 TIME_WAIT 的时间确保对方收到了最后的告别不要搞突然失联。所以下次给对象/女神发完“我饿了”如果她回了个表情别急着生气。直接回一句“ACK Received。Payload: 校门外淀粉肠Socket 已建立速来”看她迷不迷糊就完事了。兄弟骗骗别人算了别把自己也骗了