问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

大白话讲解TCP三次握手四次挥手,小白也能轻松理解!

创作时间:
作者:
@小白创作中心

大白话讲解TCP三次握手四次挥手,小白也能轻松理解!

引用
CSDN
1.
https://blog.csdn.net/qq_56158663/article/details/145770052

一、TCP三次握手 (建立连接) 🤝

想象一下,你要给你的朋友打电话,建立通话的过程就像TCP的三次握手。 📞

第一次握手 (SYN) ➡️

  • 你 (客户端):拿起电话,拨号,嘟嘟嘟… 📱 (发送一个SYN包,SYN是Synchronize的缩写,意思是“同步”)

  • 作用:告诉你的朋友:“喂,我想和你建立连接,我的起始序号是X (一个随机数)。” 🙋 ♂️ 这个X就像你的电话号码,让对方知道是谁要联系他。

  • 为什么不能少?🙅 ♂️ 少了这一步,你的朋友根本不知道你想和他建立连接,更别提接电话了。 🤷 ♂️

第二次握手 (SYN+ACK) ⬅️

  • 你的朋友 (服务器):听到电话响了,接起来:“喂,你好,我是服务器。 🙋 ♀️ 我知道你想和我建立连接,我收到了你的起始序号X。 👍 我也同意建立连接,我的起始序号是Y (也是一个随机数)。 🤝 同时,我确认收到了你的请求,你的下一个包的序号应该是X+1。” (发送一个SYN+ACK包,ACK是Acknowledgement的缩写,意思是“确认”)

  • 作用

  • 告诉客户端:“我收到了你的请求,并且同意建立连接。” ✅

  • 告诉客户端:“我的起始序号是Y,请记住。” 📝

  • 告诉客户端:“我确认收到了你的SYN包,你下次发数据的时候,序号要从X+1开始。” 🔢

  • 为什么不能少?🙅 ♀️ 少了这一步,你就不知道你的朋友是否在线,是否愿意和你建立连接。 🤷 ♀️ 同时,你也无法得知服务器的起始序号,后续的数据传输就无法正确进行。 ❌

第三次握手 (ACK) ➡️

  • 你 (客户端):收到朋友的回复:“好的,我知道你的起始序号是Y,我也确认收到了你的SYN+ACK包,你的下一个包的序号应该是Y+1。” 🙋 ♂️ (发送一个ACK包)

  • 作用:告诉服务器:“我收到了你的确认,我也准备好了,可以开始传输数据了。” 🚀

  • 为什么不能少?🙅 ♂️ 少了这一步,服务器就不知道客户端是否收到了它的确认。 🤷 ♂️ 服务器会一直等待客户端的确认,直到超时,浪费资源。 ⏳ 而且,如果客户端没有收到服务器的确认,可能会认为连接建立失败,导致数据传输错误。 💥

记住,三次握手是为了确认双方都有接受和发送的能力,好好理解这张表!

总结:

  • 第一次握手:客户端发起连接请求。 📞

  • 第二次握手:服务器确认收到请求,并同意连接。 ✅

  • 第三次握手:客户端确认收到服务器的确认,连接建立完成。 🎉

为什么不能多?

  • 如果多了一次握手,比如客户端再发送一个ACK,服务器会认为这是一个新的连接请求,可能会导致混乱。 🤯 而且,多余的握手没有任何实际意义,只会浪费资源。 💸

二、TCP四次挥手 (断开连接) 👋

通话结束,挂断电话的过程就像TCP的四次挥手。 📞➡️❌

第一次挥手 (FIN) ➡️

  • 你 (客户端):说:“好了,我要挂电话了,我这边没有数据要发了。” 🙋 ♂️ (发送一个FIN包,FIN是Finish的缩写,意思是“结束”)

  • 作用:告诉服务器:“我客户端这边的数据已经发送完毕,我请求关闭连接。” 🚪 注意,这只是客户端不再发送数据,但仍然可以接收数据。 👂

  • 为什么不能少?🙅 ♂️ 少了这一步,服务器不知道客户端要关闭连接,可能会一直等待客户端发送数据。 ⏳

第二次挥手 (ACK) ⬅️

  • 你的朋友 (服务器):说:“好的,我知道你要挂电话了,我收到了你的FIN包。” 🙋 ♀️ (发送一个ACK包)

  • 作用:告诉客户端:“我收到了你的FIN包,我知道你要关闭连接了。 👍 但我这边可能还有数据要发送,请稍等。” ⏳ 此时,客户端进入
    FIN_WAIT_2
    状态,等待服务器发送FIN包。

  • 为什么不能少?🙅 ♀️ 少了这一步,客户端不知道服务器是否收到了它的FIN包,可能会一直等待,或者错误地认为连接已经关闭。 🤷 ♀️

第三次挥手 (FIN) ⬅️

  • 你的朋友 (服务器):说:“好了,我也把所有数据都发完了,我也要挂电话了。” 🙋 ♀️ (发送一个FIN包)

  • 作用:告诉客户端:“我服务器这边的数据也发送完毕,我也请求关闭连接。” 🚪

  • 为什么不能少?🙅 ♀️ 少了这一步,客户端不知道服务器已经发送完所有数据,可能会一直等待,或者错误地认为连接已经关闭。 🤷 ♀️

第四次挥手 (ACK) ➡️

  • 你 (客户端):说:“好的,我知道你要挂电话了,我收到了你的FIN包。” 🙋 ♂️ (发送一个ACK包)

  • 作用:告诉服务器:“我收到了你的FIN包,我知道你也要关闭连接了。 👍 我等待一段时间 (通常是2MSL,Maximum Segment Lifetime,最长报文段寿命),如果没有收到你的重传请求,我就关闭连接了。” ⏳ 客户端进入
    TIME_WAIT
    状态。

  • 为什么不能少?🙅 ♂️ 少了这一步,服务器不知道客户端是否收到了它的FIN包。 🤷 ♂️ 如果服务器没有收到客户端的ACK包,会认为客户端没有收到FIN包,会重新发送FIN包。 🔄 如果客户端直接关闭连接,服务器就无法收到ACK包,会一直重发FIN包,浪费资源。 💸

总结:

  • 第一次挥手:客户端请求关闭连接。 🚪

  • 第二次挥手:服务器确认收到客户端的关闭请求。 ✅

  • 第三次挥手:服务器请求关闭连接。 🚪

  • 第四次挥手:客户端确认收到服务器的关闭请求,连接关闭。 🎉

为什么不能少?

  • 四次挥手保证了双方都能可靠地关闭连接,避免数据丢失或连接异常。 🛡️

为什么不能多?

  • 和三次握手类似,多余的挥手没有任何实际意义,只会浪费资源,并且可能导致连接状态混乱。 🤯

TIME_WAIT状态

客户端在第四次挥手后进入
TIME_WAIT
状态,等待2MSL的时间。 ⏳ 这是为了:

  1. 确保最后一个ACK报文能够到达服务器。✅ 如果服务器没有收到ACK报文,会重传FIN报文,客户端可以重新发送ACK报文。 🔄

  2. 防止“已失效的连接请求报文段”出现在新的连接中。🛡️ 经过2MSL的时间,可以确保之前连接的所有报文段都从网络中消失,避免对新的连接造成干扰。 🚧

三、总结:

TCP的三次握手和四次挥手是保证TCP连接可靠性的关键机制。 🔑 它们确保了连接的建立和关闭都是可靠的,避免了数据丢失和连接异常。 👍 虽然过程稍微复杂,但理解了每一步的作用,就能明白为什么需要这些步骤,以及为什么不能多也不能少。 🤔

希望这篇文章的解释能帮助你更好地理解TCP的三次握手和四次挥手! 😊

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号