码迷,mamicode.com
首页 > 其他好文 > 详细

TCP四次挥手

时间:2017-02-19 18:24:59      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:tcp   计时   strong   数据   .com   连接状态   详解   wait   logs   

  技术分享

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四次挥手

标签:tcp   计时   strong   数据   .com   连接状态   详解   wait   logs   

原文地址:http://www.cnblogs.com/13224ACMer/p/6416314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!