计算机网络 —— 运输层(四次挥手)

计算机网络 ------ 运输层(四次挥手)

我们今天来看TCP协议的四次挥手

四次挥手

TCP的四次挥手(Four-Way Handshake)是TCP连接断开过程中的步骤,用来确保数据的可靠传输直到连接的优雅关闭。这个过程确保了双方都知道数据传输已完成,并且可以安全地释放连接资源。以下是四次挥手的具体步骤:

  1. 第一次挥手(FIN)
  • 客户端打算关闭连接时,会向服务器发送一个报文段,其中FIN(Finish)标志位被置为1,表示"我不再发送数据了"。这个报文还会包含一个序列号,用于确认客户端发送的所有数据已经被确认接收。这时,客户端进入FIN_WAIT_1状态,等待服务器的确认。
  1. 第二次挥手(ACK)
  • 服务器收到客户端的FIN报文后,会发送一个确认报文给客户端,其中ACK置为1,确认序列号设置为客户端FIN报文的序列号加1,表示"你的关闭请求我收到了"。同时,服务器可能还有数据要发送给客户端,所以服务器并不会立即关闭连接,而是进入CLOSE_WAIT状态。
  1. 第三次挥手(FIN)
  • 当服务器不再需要向客户端发送数据时,会发送一个FIN报文给客户端,告诉客户端"我也不会再发数据了,请关闭你的连接吧"。这时服务器进入LAST_ACK状态,等待最后一个ACK的到来。
  1. 第四次挥手(ACK)
  • 客户端收到服务器的FIN报文后,会发送一个ACK报文作为响应,确认序列号设置为服务器FIN报文的序列号加1。这时客户端进入TIME_WAIT状态,等待足够的时间(通常为2MSL,即两倍的最大报文生存时间)以确保最后一个ACK报文能够到达服务器,之后关闭连接。服务器收到这个ACK后,就关闭了连接。

通过这四次挥手,TCP连接得以优雅地关闭,确保了所有数据的可靠传输和资源的正确释放。

我们一个一个来梳理:

客户端到服务器的关闭

第一次挥手

第一次挥手客户端会向服务器发送TCP释放连接报文
终止位FIN设置为1,ACK为1,注意FIN等于1的报文即使不携带报文,也会消耗序号序号seq字段的值设为u,等于TCP客户进程端之前已经传送过的数据的最后一个字节的序号加1,ack跟seq同理。

第二次挥手

当服务器接收到客户端的TCP的释放报文,便会发送一个TCP普通确认,并进入普通等待状态
各个字段设置如图:

这个时候服务器通知应用进程,TCP客户端要断开和自己的连接 这个时候,客户端到服务器端的连接被关闭了

服务器到客户端连接的关闭

第三次挥手

同时,服务器可能还有数据要发送给客户端,所以服务器并不会立即关闭连接,而是进入CLOSE_WAIT状态
当服务器不再需要向客户端发送数据时,会发送一个FIN报文给客户端,这时服务器进入LAST_ACK状态,等待最后一个ACK的到来:

第四次挥手

客户端收到服务器的FIN报文后,会发送一个ACK报文作为响应,确认序列号设置为服务器FIN报文的序列号加1。这时客户端进入TIME_WAIT状态 ,等待足够的时间(通常为2MSL,即两倍的最大报文生存时间)以确保最后一个ACK报文能够到达服务器,之后关闭连接。服务器收到这个ACK后,就关闭了连接:

举个不太恰当了例子:

想象一下,TCP的四次挥手过程就像两个人在图书馆借阅书籍后的礼貌告别过程:

  1. 第一次挥手(客人说"我读完了")
    假设你是一个在图书馆阅读的客人(客户端),当你读完一本书后,你想离开了,于是你向图书管理员(服务器)说:"我读完了这本书。" 这就是第一次挥手,你告诉管理员你不再需要服务了(发送FIN标志)。
  2. 第二次挥手(管理员说"知道了")
    管理员听到后,回答你说:"好的,我知道了,但请稍等,我看看是否还有其他读者需要这本书。" 这时管理员并没有立刻收回书,因为他还在等待是否有其他人对这本书感兴趣。这就是第二次挥手,管理员确认了你的请求(发送ACK标志),但保持连接开放以备不时之需。
  3. 第三次挥手(管理员说"现在可以走了")
    过了一会儿,管理员发现确实没有其他人需要这本书,于是对你说:"好了,现在你可以离开了,我把书收回来。" 这相当于管理员也完成了他的任务,准备结束这次服务(发送FIN标志)。
  4. 第四次挥手(客人说"好的,再见")
    你听到管理员的话,干站3分钟之后,回应道:"好的,谢谢,再见!" 这样,你和管理员之间的这次互动就圆满结束了(发送ACK标志),你安心离开,管理员也把书放回原处,准备迎接下一位读者。

通过这四次礼貌的交流,双方都确认了服务的结束,确保了资源的正确归还和流程的顺畅结束,没有留下任何未解决的事情。这就是TCP四次挥手过程的形象解释。

等待时间的必要性

等待时间是必要的,如果收到服务器的确认之后直接关闭,会有下面的问题:
这牵扯到另外一个问题,如果客户端挂了,服务器不能像傻子一样一直发确认,服务器应该有自己的标准判断客户端挂没挂

相关推荐
Let's Chat Coding1 小时前
对称密钥认证:主机和设备共享同一把密钥
运维·服务器·网络
技术不好的崎鸣同学3 小时前
[极客大挑战 2019]EasySQL 思路及解法
网络·安全·web安全
Web极客码4 小时前
跨国网络抖动下的 AI 爬虫流调优:我如何用 Claude 打造“智能退避”资讯清洗管道
网络·人工智能·爬虫
念何架构之路4 小时前
moby-http-api-server
网络·网络协议·http
namexingyun4 小时前
Scaling Law bug实战启示:从“虚胖“到“精瘦“的算力效率革命
开发语言·网络·人工智能·bug·ai编程
云栖梦泽在5 小时前
原生 IP、机房 IP、住宅 IP、广播 IP 有何不同?从网络身份到 ASN 识别的技术科普
网络·网络协议·tcp/ip·性能优化
AI创界者5 小时前
【实战演练】基于 Kali Linux 的自动化漏洞扫描与安全加固指南
网络·安全·web安全
从零开始的代码生活_6 小时前
Linux epoll 多路转接详解
linux·运维·网络·后端·tcp/ip·计算机网络·php
小鹿软件办公6 小时前
通过调整编码参数使用 VLC 媒体播放器无损压缩视频方法
运维·网络·音视频
魔尔助理顾问6 小时前
HTTP Response中的CORS Headers
网络·网络协议·http