优雅地说再见——TCP协议四次挥手

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

优雅地说再见

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

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

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

责任编辑:赵宁宁 来源: FrenziedJavaLand
相关推荐

2024-07-11 10:55:27

2021-10-14 20:33:16

TCP连接关闭

2017-09-25 21:27:07

TCP协议数据链

2023-10-24 15:22:09

TCPUDP

2015-11-09 09:58:56

2019-07-16 11:06:09

TCP四次挥手半关闭

2015-10-13 09:42:52

TCP网络协议

2019-06-12 11:26:37

TCP三次握手四次挥手

2024-01-12 08:23:11

TCPACK服务器

2023-11-01 08:04:08

WiresharkTCP协议

2022-08-05 11:03:59

TCP 四次挥手三次握手

2021-07-03 17:47:25

TCP控制协议

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制协议

2019-02-01 09:38:16

2020-02-17 10:10:43

TCP三次握手四次挥手

2014-09-19 09:46:46

TCPIP

2020-06-29 14:50:47

TCP状态ACK

2021-05-28 09:08:20

TCP连接序列号

2023-10-28 09:07:57

TCP面试三次握手
点赞
收藏

51CTO技术栈公众号