首页 > 代码库 > TCP四次挥手

TCP四次挥手

  技术分享

tcp四次挥手详解:

挥手之前,客户端和服务器端都处于建立连接状态,客户端是主动关闭,服务器是被动关闭

(1)首先客户端发送连接释放报文FIN=1,seq=u,主动关闭连接,并不在发送数据。TCP规定FIN报文不能携带数据,但是消耗一个序号,这时A进入FIN_WAIT_1(终止等待1)

(2)服务器收到连接释放报文后,发送确认,ACK=1,seq=v,ack=u+1(因为上面消耗了一个序号),这个之后服务器进入了close_wait状态,并通知高层应用程序,因此从可客户端到服务器发送的这个连接就已经关闭了,这个时候TCP连接属于半关闭状态,就是客户端没有数据发送了,但是服务器还可以继续发送数据,当客户端收到服务器的确认回复报文的时候,就进入了FIN_WAIT_2状态

(3)当服务器不需要向客户端发数据的时候,就可以向客户端发送释放连接报文,FIN=1,ACK=1,seq=w,ack=u+1,,之后进入

LAST_ACK状态

(4)客户端收到后立刻发送确认报文ACK=1,seq=u+1,ack=w+1,进入了TIME_WAIT状态(时间等待状态),必须经过时间等待计时器的2MSL(最长报文段寿命时间)后进入close状态,撤销TCB,此刻TCP连接结束

 

上述除了时间等待计时器,还有一个保活计时器,设想,如果连接后,客户机断掉了,从此便不能与服务器进行通信,服务器没收到一次客户的数据的时候,都会重新这只保活计时器,但是如果两个小时没有收到的话,就发一次探测报文段,以后每隔75分钟发一次,联系发送10个,如果没有反应,服务器就认为客户机除了故障,直接关闭了这个连接

 

 

为什么客户机的TIME_WAIT状态需要设置2MSL?

 

 

(1)为了保证客户端最后发送的ACK报文能够准确的被服务器收到,所以他需要等一会,如果在服务器最后发送的FIN+ACK报文在一顿时间没有收到回复的话,会重新发送一次,如果客户端收到了,会重新发送ACK报文,并重新设置等待计时器,如果不设置这段时间,那么客户端发送ACK结束后,如果服务器没有收到的话,在重新向客户端重传的话,由于客户端已经处于close

状态,将不再能接收到,这样的话服务器就不会正常的进入到close状态

(2)防止已经失效的连接请求报文段出现在连接之中,客户端在发送完最后一个ACK报文的时候在经过2msl后,就可以是的本网络中的所有报文段全部消失,这样在下一个新的连接中就不会出现以前的连接请求报文的干扰

 

TCP四次挥手