优雅地说再见——TCP协议四次挥手
创始人
2025-06-30 12:10:07
0

优雅地说再见

不辞而别,总是容易让人猝不及防。当我们不得结束一段愉快的聊天,离开一个让人难以割舍的城市,你会怎么做?

当然是要学会,优雅地说再见了。

《礼貌地说你好——TCP协议三次握手》一文中已经介绍了,TCP协议是如何建立连接的。建立连接后,数据传输完成,我们又该如何优雅地关闭连接呢?

念念不忘——TCP的四次挥手

第一次挥手

客户端准备关闭连接时,则会向服务端发送FIN=1的数据包,并且进入FIN_WAIT_1状态。

第二次挥手

服务端收到客户端的FIN=1的数据包后,则会向客户端响应一个ACK数据包,并进入准备关闭连接的状态。服务端此时则会开始准备停止数据传输。

客户端收到服务端响应的ACK数据包后,则进入FIN_WAIT_2的状态。此时,仍然有可能存在数据传输,需要等待服务端真正停止数据传输时才能进入关闭状态。

第三次挥手

服务端处理完数据传输则会向客户端发送一个FIN数据包,并进入LASK_ACK状态,表示服务端已经进入连接关闭状态。

第四次挥手

客户端收到FIN数据包后,则可以确认数据传输已经完全停止,进入TIME_WAIT状态,并向服务端响应ACK数据包。等待2MSL(Maximum Segment Lifetime,最大报文生存时间)后,连接才真正关闭,进入CLOSE状态。

服务端接收到ACK数据包后则断开连接,进入CLOSE状态。

重试与容错

当FIN数据包发送出去后,长时间未收到ACK响应的数据包,都会触发超时重传。

客户端接受到FIN指令后为什么不是立即关闭连接,而要等待2MSL时间再关闭?

假设客户端没有TIME_WAIT的状态,而是里面关闭连接,此时如果客户端立马重新建立连接,连接建立成功后,又收到上一个关闭连接的数据包,并向服务端响应了ACK数据包,则会导致服务端的数据混乱。

总结

TCP协议关闭连接的时候,由于可能正在进行数据传输,客户端和服务端都会先进入等待关闭连接的过程。

当客户端或者服务端发送FIN数据包未在一定的时间内收到ACK响应包,则会进行重试。

客户端最后收到服务端的FIN数据包后,会先进入TIME_WAIT的状态等待2MSL(最大报文生存周期)。以防止,因为网络延迟,消息传输超时等问题导致的消息传输错乱的问题的发生。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...