优质文章推荐
↓ ↓ ↓ ↓ ↓
在客户端断开TCP连接的时候,需要与服务端进行四次交互,这四次交互就叫做四次挥手。
第一次挥手
首先,客户端向服务端发送释放连接报文,同时停止数据传输。释放连接报文头部是FIN=1,序列号是seq=u。发送之后,客户端进入终止等待1(FIN-WAIT-1)状态。无论FIN报文有没有传输数据,都需要消耗一个序列号。
第二次挥手
服务端收到释放连接报文之后,再向客户端发送确认报文,报文内容为ACK=1,返回序列号是ack=u+1,报文本身的序列号是seq=v。这条报文发送之后,服务端就会进入关闭等待(CLOSE-WAIT)状态。这时,客户端已经不再发送数据,但仍可以接收数据,而服务端仍可以向客户端发送数据,这个状态叫做半关闭状态。这个状态会持续一段时间,直到服务端将所有数据发送完毕。
第三次挥手
客户端收到服务端的确认报文后,就会进入终止等待2(FIN-WAIT-2)状态,同时接收数据并等待服务端发送释放连接报文。
服务端将数据发送完之后,接着向客户端发送释放连接报文。报文内容为FIN=1,序列号为ack=u+1,而在之前的半关闭状态服务端可能发送了数据,并消耗了序列号,这里假设序列号为seq=w。将这条报文发送之后,服务端就会进入最后确认(LAST-ACK)状态,并等待客户端发送确认报文。
第四次挥手
客户端收到释放连接报文后,再向服务端发送确认报文。报文内容为ACK=1,返回序列号为ack=w+1,以及这个报文的序列号seq=u+1。发送之后,客户端将进入时间等待(TIME-WAIT)状态。这时,四次挥手已经结束,但TCP连接仍然没有释放。
客户端需要经过最长报文段寿命(MSL)的时间,这个时间通常为两分钟,将传输控制块撤销后,才进入关闭(CLOSED)状态。而服务端结束TCP连接要更早一些,它一收到确认报文,就立即撤销传输控制块并进入关闭状态。

通俗的讲
简单来说,四次挥手就是客户端向服务端发送一个释放连接的请求,服务端先回复一个可以断开的信号。服务端过一段时间回客户端一个可以断开的信号,并将所有的数据发送给客户端。客户端收到信号后,给服务端发送确认释放连接信号,并释放连接。例如甲在乙家做客要离开的时候,甲先与对方说明“我要走了”,接着对方会询问“真的要走了吗,请等一下”,然后送出准备好的礼物并回应“礼物拿好,再见”,甲收到礼物并回复“再见”之后离开。
之所以在释放连接TCP连接之前要等待MSL时间,是为了防止报文丢失。如果服务端没有收到客户端最后的确认报文,将会再次发送释放连接报文,MSL时间用来等待接收第二次释放连接报文。
来不及解释了,快上车!(进群看公告)

欢迎新的小伙伴加入!在这里,我们鼓励大家积极参与群内讨论和交流,分享自己的见解和经验,一起学习和成长。同时,也欢迎大家提出问题和建议,让我们不断改进和完善这个平台。
↓↓↓ 点个在看,无需赞赏!