优雅地说再见——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(最大报文生存周期)。以防止,因为网络延迟,消息传输超时等问题导致的消息传输错乱的问题的发生。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...