tcp四次挥手

在讲解tcp四次挥手之前我们也先来认识一下tcp首部中的某些字段:

ACK:只有该字段置1时ack(确认号)才有效

FIN:当该字段置1时用于请求释放连接

seq:序列号,表示该报文段的序号

ack:确认号,表示希望收到的下一个报文段,并且该报文段以前的报文已经收到

四次挥手

先来讲解一下大体的一个过程:(以客户端先主动释放连接为例)

一、 客户端释放连接,客户端进入FIN-WAIT1状态

二、 服务端收到tcp报文段,并发出确认 服务端进入CLOSE-WAIT状态

客户端收到确认后进入FIN-WAIT2状态。

这两个步骤完成后该tcp进入半关闭状态,即客户端到服务端的连接已经关闭,但有可能服务端需要向客户端发送数据,所以有可能需要等待服务端继续发送数据

三、 服务端释放连接 服务端进入LAST-ACK状态

四、 客户端收到该报文段,发出确认,客户端进入TIME-WAIT状态,在经过2MSL(最长报文段寿命)时间后进入CLOSED状态

服务端收到确认报文后也进入COISED状态。

为什么最后客户端需要等待2MSL的时间,原因有两个:

一、 保证客户端最后发送的确认报文段可以被服务端收到,使服务端顺利进入CLOSED状态。因为最后客户端发出的确认请求报文可能不能到达服务端,而2MLS的时间可以保证服务端重发释放连接的报文可以到达客户端,这样才能保证客户端确认报文一定可以到达服务端。

二、 防止已失效的连接请求报文。

2MLS时间可以让本报文段所产生的所有报文都从网络中消失。

具体过程:

一、 客户端将tcp头部 FIN置1,seq=u(u等于前面发送报文段序号+1),向服务端发送该报文,客户端进入FIN-WAIT1状态

二、 接收到客户端的报文后,将tcp头部ACK置1, ack=u+1,seq=v(v等于前面发送报文段序号+1),服务端进入CLOSE-WAIT状态

客户端收到确认报文后进入FIN-WAIT2状态,整个tcp连接进入半关闭状态

             

中间可能服务端依然向客户端发送数据

三、 服务端数据发送完成后,将tc头部FIN置1,seq=w(w等于v加上中间向服务端发送的数据),ack=u+1(这里需要注意),发送该报文段,服务端进入LAST-ACK状态

四、 客户端收到服务端报文后,将tcp头部ACK置1,ack=w+1,seq=u+1,发送该报文后客户端进入TIME-WAIT状态,再等待2MSL时间后进入到CLOSED状态。

服务端收到确认后也进入到CLOSED状态。

心有多大,天有多高,一起奋斗!!
原文地址:https://www.cnblogs.com/zhaolei1996/p/10738501.html