面试官问:TCP三次握手与四次挥手有什么区别?一张图+电话接通挂断比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)

发布时间:2026/8/4 2:44:18
面试官问:TCP三次握手与四次挥手有什么区别?一张图+电话接通挂断比喻,彻底拿下这道必考题(附图解+比喻+避坑指南) 面试官问TCP三次握手与四次挥手有什么区别一张图电话接通挂断比喻彻底拿下这道必考题附图解比喻避坑指南 你是不是也这样知道TCP有三次握手和四次挥手但面试官一追问“为什么握手是三次而不是两次”“为什么挥手是四次而不是三次”“TIME_WAIT有什么用”就答不上来了今天一张图 一个电话接通挂断故事 状态变迁详解 六道追问彻底拿下这道题。摘要TCP是面向连接的可靠传输协议通过三次握手建立连接确保双方收发能力正常通过四次挥手释放连接因TCP全双工特性需分别关闭两个方向的通道。本文用“打电话”比喻 状态变迁图 高频追问为什么是3次/4次、SYN洪水、TIME_WAIT作用等彻底讲透这道网络面试必考题。一句话三次握手建立连接四次挥手释放连接握手少一次不安全挥手多一次因半关闭。我是折哥《Java 85题图解版》系列连载中已更新44题建议收藏本系列。每周2-3篇85题通关路线一键追完。点击关注第一时间收到每篇新题推送。上一篇面试官问单例模式的7种写法与JVM层面分析下一篇预告面试官问HTTP和HTTPS有什么区别待发布全部85题点击查看总目录关注专栏追更不迷路一句话总结三次握手建立连接四次挥手释放连接握手少一次不安全挥手多一次因半关闭。三次握手Client → ServerSYN→ ClientSYNACK→ ServerACK→ 连接建立 → 像打电话A说“喂”SYNB回“听到了你能听到我吗”SYNACKA回“听到了”ACK开始通话。四次挥手Client → ServerFIN→ ServerACK→ ServerFIN→ ClientACK→ 连接释放 → 像挂电话A说“我说完了”FINB回“知道了等我一下”ACKB说完后说“我也说完了”FINA回“好的挂了”ACK通话结束。背诵口诀三次握手建连接四次挥手断连接握手确认收发能力挥手半关各自断。核心设计理念TCP是全双工协议——双方可以同时收发数据因此连接建立需要双向确认连接释放需要双方各自关闭。 面试还原面试官TCP为什么是三次握手为什么是四次挥手它们有什么区别这是网络面试中必问必考的核心题直接进入正题。 一图看懂TCP三次握手与四次挥手全貌三次握手目的确认双方收发能力正常报文数3个标志位SYN → SYNACK → ACK状态变迁CLOSED→SYN_SENT→ESTABLISHED能否合并第二次和第三次可以合并✅ 确保可靠连接四次挥手目的优雅关闭双向通道报文数4个标志位FIN → ACK → FIN → ACK状态变迁ESTABLISHED→FIN_WAIT_1→CLOSE_WAIT→FIN_WAIT_2→LAST_ACK→TIME_WAIT→CLOSED为何分开ACK由内核回复FIN由应用决定✅ 确保数据完整传输 生活比喻打电话三次握手 接通电话你想给朋友打电话建立TCP连接第一次握手SYN你拿起电话说“喂”客户端发送SYN请求建立连接第二次握手SYNACK朋友听到后回复“听到了你能听到我吗”服务端回复SYNACK确认收到并询问对方第三次握手ACK你回答“能听到我们开始说吧”客户端回复ACK连接建立为什么不是两次如果只到第二步你确认了朋友能听到你但朋友还不知道你能不能听到他——第三次握手就是为了让朋友确认“你能听到他”。两次握手无法确认双方的收发能力都正常。四次挥手 挂断电话通话结束准备挂断释放TCP连接第一次挥手FIN你说“我说完了先不说了”客户端发送FIN请求关闭发送通道第二次挥手ACK朋友说“好的我知道了等我一下”服务端回复ACK客户端→服务端方向关闭第三次挥手FIN朋友把手头的话说完后说“我也说完了”服务端发送FIN关闭服务端→客户端方向第四次挥手ACK你最后确认“好的挂了”客户端回复ACK连接彻底释放为什么不是三次第二次和第三次不能合并——因为朋友说“知道了”是内核自动回复的很快但朋友可能还有话没说完什么时候说“我也说完了”由他自己决定可能很久。所以这两步必须分开。 核心对比表面试速查版三次握手 vs 四次挥手维度三次握手建立连接四次挥手释放连接目的确认双方收发能力正常优雅关闭双向通道确保数据完整传输报文数3个4个标志位SYN → SYNACK → ACKFIN → ACK → FIN → ACK能否合并第二次和第三次可以合并三次的原因第二次和第三次不能合并四次的原因原因建立连接不需要等待应用层参与ACK由内核回复FIN由应用层控制无法合并状态变迁CLOSED→SYN_SENT→ESTABLISHEDESTABLISHED→FIN_WAIT_1→CLOSE_WAIT→FIN_WAIT_2→LAST_ACK→TIME_WAIT→CLOSED全双工建立双向通道分别关闭两个方向的通道关键状态说明状态含义出现阶段SYN_SENT客户端已发送SYN等待服务端确认第一次握手后SYN_RCVD服务端已收到SYN已回复SYNACK第二次握手后ESTABLISHED连接已建立可以传输数据第三次握手后FIN_WAIT_1客户端已发送FIN等待ACK第一次挥手后CLOSE_WAIT服务端收到FIN等待应用层关闭第二次挥手后FIN_WAIT_2客户端收到ACK等待服务端FIN第二次挥手后LAST_ACK服务端已发送FIN等待客户端ACK第三次挥手后TIME_WAIT客户端等待2MSL后关闭第四次挥手后2MSL报文最大生存时间的2倍确保最后一个ACK到达TIME_WAIT状态 高频面试追问6道大厂真题追问1为什么TCP是三次握手不是两次或四次回答要点三次正好①确认双方收发能力②防止历史连接③效率最优。详细回答不是两次的原因两次握手只能证明客户端能发、服务端能收但无法证明服务端能发、客户端能收。TCP是全双工协议需要双向确认。如果只有两次握手服务端发出确认后连接就建立了但此时服务端并不确定客户端是否收到了自己的确认也不知道客户端是否准备好接收数据。不是四次的原因第三次和第二次可以合并——服务端在回复SYNACK时可以同时确认客户端的SYN并发送自己的SYN不需要分两次。三次握手已经足以确认双方的收发能力多一次就是浪费。还有一个重要原因防止已失效的连接请求报文段突然又传到服务端历史连接问题。三次握手可以避免服务端在客户端毫不知情的情况下建立无效连接。追问2为什么挥手是四次不能像握手一样合并成三次回答要点ACK和FIN的触发时机不同——ACK由内核立即回复FIN由应用层决定何时发送。详细回答第二次挥手ACK是服务端收到FIN后内核自动回复的速度很快。第三次挥手FIN是服务端应用层调用close()触发的要等应用层处理完剩余数据才能发送。这两步的触发时机完全不同无法合并。如果合并成三次就意味着服务端在收到FIN时必须立即关闭自己的发送通道但此时它可能还有数据没发完。四次挥手的设计正是为了确保所有数据都能完整传输。追问3TIME_WAIT状态是什么为什么需要2MSL回答要点TIME_WAIT 等待2MSL后关闭目的是①保证最后的ACK到达②让旧报文在网络中消失。详细回答主动关闭方通常是客户端在发送最后一个ACK后会进入TIME_WAIT状态等待2MSLMaximum Segment Lifetime报文最大生存时间后才真正关闭。两个核心目的保证最后的ACK能到达如果服务端没收到最后一个ACK第四次挥手会重发FIN。客户端在TIME_WAIT状态下可以重发ACK确保服务端正常关闭。让旧报文在网络中消失避免本次连接中延迟到达的报文干扰使用相同四元组源IP、源端口、目标IP、目标端口的下一个连接。如果TIME_WAIT过多会占用端口资源可能导致无法创建新连接。追问4什么是SYN洪水攻击如何防范回答要点攻击者发送大量SYN但不完成第三次握手耗尽服务端资源。详细回答SYN洪水攻击攻击者向服务端发送大量SYN报文第一次握手但收到服务端的SYNACK后不回复ACK不完成第三次握手导致服务端一直处于SYN_RCVD状态半连接队列被占满无法处理正常请求。防范措施SYN Cookie服务端收到SYN后不立即分配资源而是根据SYN计算一个Cookie作为初始序列号回复收到ACK后再验证Cookie真实性。限制半连接数量设置合理的半连接队列上限。缩短超时时间减少等待ACK的时间快速释放半开连接占用的资源。追问5TCP和UDP有什么区别回答要点TCP面向连接、可靠、有序、慢UDP无连接、不可靠、无序、快。详细回答维度TCPUDP连接面向连接三次握手无连接可靠性可靠传输确认重传不可靠不保证到达有序性保证按序到达不保证顺序速度慢开销大快开销小应用场景HTTP、FTP、SMTPDNS、视频直播、语音通话追问6三次握手中可以携带数据吗回答要点第三次可以携带数据前两次不行。详细回答TCP规定第三次握手ACK可以携带数据因为此时客户端已经确认了服务端的收发能力连接已基本建立。但第一次和第二次握手不能携带数据——因为此时连接还未完全建立双方还未确认对方的收发能力贸然发送数据无法保证可靠传输。 避坑指南序号错误认知正确理解后果1“握手和挥手只是名字不同本质一样”握手3次挥手4次原因完全不同面试答不出“为什么”2“三次握手和四次挥手都是为了确认”握手确认收发能力挥手确保数据完整混淆建立和释放的目的3“挥手少一次不行吗”不行ACK和FIN不能合并会中断数据传输丢失数据4“TIME_WAIT是浪费应该尽快关闭”TIME_WAIT是必要的保证可靠关闭可能导致数据丢失或连接混乱5“只有客户端可以主动关闭连接”客户端和服务端都可以主动关闭误解协议设计 可运行验证代码importjava.io.*;importjava.net.*;publicclassTCPDemo{// 模拟TCP三次握手和四次挥手通过Socket连接和关闭演示publicstaticvoidmain(String[]args)throwsInterruptedException{// 服务端模拟ThreadserverThreadnewThread(()-{try(ServerSocketserverSocketnewServerSocket(8888)){System.out.println([服务端] LISTEN状态 - 等待客户端连接);SocketsocketserverSocket.accept();// 三次握手在此完成System.out.println([服务端] ESTABLISHED状态 - 连接已建立);// 接收数据BufferedReaderreadernewBufferedReader(newInputStreamReader(socket.getInputStream()));Stringmsgreader.readLine();System.out.println([服务端] 收到消息: msg);// 四次挥手在socket.close()时自动完成Thread.sleep(2000);socket.close();System.out.println([服务端] CLOSED状态 - 连接已关闭);}catch(Exceptione){e.printStackTrace();}});// 客户端模拟ThreadclientThreadnewThread(()-{try{Thread.sleep(500);SocketsocketnewSocket(localhost,8888);// 触发三次握手System.out.println([客户端] ESTABLISHED状态 - 连接已建立);// 发送数据PrintWriterwriternewPrintWriter(socket.getOutputStream());writer.println(Hello TCP!);writer.flush();Thread.sleep(3000);socket.close();// 触发四次挥手System.out.println([客户端] CLOSED状态 - 连接已关闭);}catch(Exceptione){e.printStackTrace();}});serverThread.start();clientThread.start();serverThread.join();clientThread.join();System.out.println( TCP三次握手和四次挥手演示完成 );System.out.println(三次握手: socket.accept() 和 new Socket() 之间完成);System.out.println(四次挥手: socket.close() 时自动完成);}}验证命令查看TCP连接状态# Linux/Mac查看TCP连接状态netstat-ant|grep8888# 或ss-ant|grep8888# Windowsnetstat-an|findstr8888❓ 评论区挑战问题以下关于TCP三次握手和四次挥手的说法哪一个是错误的// TCP连接建立与释放// 三次握手 → 数据传输 → 四次挥手A. 三次握手的目的是确认双方的收发能力都正常B. 四次挥手是因为TCP是全双工协议需要分别关闭两个方向的通道C. 四次挥手中的第二次ACK和第三次FIN可以合并为一次D. TIME_WAIT状态是为了确保最后一个ACK能到达对方 欢迎在评论区写出你的答案和理由我会在下一篇文章发布后更新本文公布答案及错误选项逐项解析。✅ 答案公布正确答案C. 四次挥手中的第二次ACK和第三次FIN可以合并为一次解析第二次ACK由内核收到FIN后立即自动回复第三次FIN由应用层决定何时发送等数据发完。两者触发时机不同无法合并。如果强行合并就意味着服务端必须在收到FIN时立即关闭发送通道而此时可能还有数据未发送完。选项A正确三次握手确认双方收发能力。选项B正确TCP全双工挥手需要关闭两个方向。选项D正确TIME_WAIT保证最后的ACK到达。 总结维度三次握手建立四次挥手释放报文数3个4个核心目的确认收发能力确保数据完整传输标志位SYN → SYNACK → ACKFIN → ACK → FIN → ACK能否合并✅ 可以三次的原因❌ 不能四次的原因最终状态ESTABLISHEDCLOSED主动方经历TIME_WAIT面试官最看重的三个点握手为什么是三次确认双向收发能力 防止历史连接挥手为什么是四次TCP全双工 ACK和FIN触发时机不同TIME_WAIT的作用保证最后一个ACK到达 让旧报文消失 系列导航上一篇面试官问单例模式的7种写法与JVM层面分析下一篇预告面试官问HTTP和HTTPS有什么区别待发布全部85题点击查看总目录关注专栏每周2-3篇一键追更搭配学习效果更佳本篇图解帮你快速建立知识画面记忆如果想深入理解TCP/IP协议栈的完整工作原理可以配合姊妹系列《Java 100天进阶之路》对应章节一起学从零基础到上岗就业108篇完整学习地图每篇标配生活类比 可运行代码 避坑表 面试高频题 练习题不背八股文真正讲透“为什么”。 《Java 100天进阶之路》完整目录导航学习建议图解系列负责“快速建立知识图谱”进阶系列负责“深入理解原理”两个系列搭配使用面试备考效率翻倍。你面试时被问过TCP三次握手和四次挥手吗面试官追问到了什么深度欢迎评论区分享你的面试经历