告别死记硬背:用“打电话”彻底搞懂TCP三次握手与四次挥手
在每一个程序员,尤其是后端和网络方向的同学面试中,TCP的“三次握手”与“四次挥手”几乎是必考题。很多人选择死记硬背SYN, ACK, FIN这些标志位,但往往临场就忘,或者无法向面试官解释“为什么是三次,又是为什么是四次”。
今天,让我们换一种方式,用一个你我再熟悉不过的场景——打电话,来彻底搞懂TCP连接管理的全过程。读完本文,你将能把这个知识点牢牢刻在脑子里。
序章:TCP是什么?为什么要“握手”和“挥手”?
在开始之前,我们只需记住TCP协议的核心身份:它是一个面向连接的、可靠的传输协议。
- 面向连接:意味着在传输数据前,必须先建立一个稳定的通道。
- 可靠的:意味着它要保证数据不丢、不乱、不重,完完整整地送达对方。
这就好比打电话,你不能拿起电话就直接说话,得先拨号、等对方接听、双方确认身份和信号良好后,才能开始正式沟通。这个“确认信号良好”的过程,就是三次握手。聊完天要挂断,也不能直接挂,得礼貌地打个招呼,确保双方都没话要说了,这个过程就是四次挥手。
Part 1: 三次握手 —— “喂,你好,听得到吗?”
目的: 在正式传输数据前,客户端和服务器需要建立一个可靠的双向通道。这个过程的目标,就是要确保双方都具备正常的发送和接收能力。
让我们请出今天的主角:准备打电话的小明(客户端)和接电话的小红(服务器)。
第一次握手:发起通话 (SYN)
- 打电话场景:
小明拿起电话,拨通了小红的号码。接通后,小明先开口:“喂,是小红吗?能听到我说话吗?” - 技术解析:
客户端(小明)向服务器(小红)发送一个同步报文(SYN),表示想建立连接。SYN=1seq=x(x是一个随机生成的初始序号)- 核心动作: 小明发起了连接请求,并检验了自己的发送能力是正常的。
第二次握手:确认并反问 (SYN+ACK)
- 打电话场景:
小红听到了小明的声音,她回应道:“嗯,我能听到你。你能听到我说话吗?” - 技术解析:
服务器(小红)收到客户端的SYN报文后,如果同意连接,就会返回一个同步确认报文(SYN+ACK)。SYN=1,ACK=1seq=y(y是服务器随机生成的初始序号)ack=x+1(表示确认收到了小明序号为x的报文)- 核心动作: 小红通过回答,证明了自己的接收能力正常,同时通过反问,来检验自己的发送能力和小明的接收能力。这是最关键的一步,实现了双向确认的意图。
第三次握手:最终确认 (ACK)
- 打电话场景:
小明听到了小红的回应,确认信号良好,高兴地说:“好的,我也能听到你!那我们开始说正事吧。” - 技术解析:
客户端(小明)收到服务器的SYN+ACK报文后,发送最后一个确认报文(ACK)。ACK=1seq=x+1ack=y+1(表示确认收到了小红序号为y的报文)- 核心动作: 小明通过回应,证明了自己的接收能力正常。
至此,一个可靠的双向连接就建立完成了。双方都明确知道:你我都能发,也都能收。
面试官追问:为什么必须是三次握手,两次不行吗?
答: 不行。如果是两次,服务器发出确认后,无法知道客户端是否收到了自己的信息,只能保证单向通信的可靠性。第三次握手正是为了让服务器确认“客户端能收到我发的消息”,从而确保双向通信的可靠性。
Part 2: 四次挥手 —— “我聊完了,你呢?”
目的: 数据传输完毕,需要优雅地断开连接。由于TCP是全双工的(好比两个人可以同时说话),所以挂断电话的过程需要双方各自确认,更加“绅士”一些。
第一次挥手:主动道别 (FIN)
- 打电话场景:
小明觉得自己想说的话都说完了,于是他说:“我这边没什么要说的了,准备挂了啊。” - 技术解析:
主动关闭方(比如客户端小明)发送一个结束报文(FIN)。FIN=1,seq=u- 核心动作: 我(小明)的发送通道要关闭了,但我还能接收你(小红)发来的信息。
第二次挥手:表示收到 (ACK)
- 打电话场景:
小红听到了,立刻回应:“好的,收到了。不过你稍等一下,我还有最后一件事要叮嘱你!” - 技术解析:
被动关闭方(服务器小红)收到FIN后,先发送一个确认报文(ACK)。ACK=1,ack=u+1- 核心动作: 我收到了你的关闭请求。但我的数据可能还没发完,请你继续等着。此时连接进入“半关闭”状态。
第三次挥手:确认道别 (FIN)
- 打电话场景:
小红终于把最后的事情也说完了,然后对小明说:“好了,我这边也说完了,可以挂了。” - 技术解析:
服务器(小红)在确认所有数据都发送完毕后,再发送一个结束报文(FIN)。FIN=1,seq=w- 核心动作: 我的发送通道也要关闭了。
第四次挥手:最终确认 (ACK)
- 打电话场景:
小明收到了小红的关闭请求,回应道:“好的,知道了!” 说完,他并不会马上挂电话,而是会多等一小会儿,以防小红没听到他这句“好的”。 - 技术解析:
客户端(小明)发送最后一个确认报文(ACK)。ACK=1,ack=w+1- 核心动作: 我收到了你的关闭请求。在发送完这个ACK后,客户端会进入
TIME_WAIT状态,等待2MSL(最大报文段生存时间)后,才真正关闭连接。
面试官追问:为什么是四次挥手?以及TIME_WAIT状态的作用是什么?
答:
- 为什么四次: 因为连接是双工的。当一方(小明)提出关闭时,另一方(小红)可能还有数据要发送,所以不能立刻关闭。只能先回复一个ACK表示“收到了你的请求”,等自己数据发完后再发送FIN表示“我也准备好了”。这就将一次道别拆分成了确认和道别两步,总共为四次。
- TIME_WAIT的作用: 1. 防止最后一次ACK丢失。如果服务器没收到这个ACK,会重发FIN,客户端此时还在等待,就能重新响应,确保服务器正常关闭。2. 防止已失效的连接请求报文段出现在本连接中。等待2MSL可以确保本次连接中所有在网络中滞留的报文都已经消失,不会干扰到下一个新的连接。
结语
通过这个简单的“打电话”故事,我们可以清晰地理解TCP连接管理的逻辑:
- 三次握手:为建立可靠的双向通话,确认“你听得到我,我也听得到你”。
- 四次挥手:为优雅地结束双向通话,保证“我说完了,等你说完,你Ok了,我再最终确认”。
希望这篇博文能帮你彻底告别死记硬背,在理解的基础上,将TCP三次握手与四次挥手牢记于心。
- 1本网站名称:MuQYY
- 2本站永久网址:www.muqyy.top
- 3本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长 微信:bwj-1215 进行删除处理。
- 4本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
- 5本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
- 6本站资源大多存储在云盘,如发现链接失效,请联系我们我们会在第一时间更新。








暂无评论内容