http4次挥手

关键名称解释:FIN终止位,ACK确认位,   ack确认号, (期望得到的seq), seq数据传输序号

1.握手图

     client                                                                        server

(1)             FIN=1(client请求终止),ACK=1(确认之前收到的数据),seq=x(发送给server要发送的数据序号)
              ------------------------------------------->

(2)                                                   ACK=1(确认收到seq=x) ,ack=x+1(期望得到的seq=x+1 ) , seq=y(好吧我发给你一个数据y)    
              <-------------------------------------------

(3)          FIN=1(server请求终止) ,ACK=1(确认收到seq=x) ,ack=x+1 (期望得到的seq=x+1 ) , seq=w(好吧我又发给你一个数据w )
             <-------------------------------------------

 (4)            ACK=1(确认之前收到的数据),ack=w+1 (期望得到的seq=x+1 ) ,seq=x+1 (发送给server要发送的数据序号)
                ------------------------------------------->

   
下图是个完整的过程,便于理解和记忆。

2.相应解释
  
         断开连接端可以是Client端,也可以是Server端。假设Client端发起中断连接请求:
第一次挥手:客户端先发送FIN报文(第24帧),用来关闭主动方到被动关闭方的数据传送,也就是客户端告诉服务器:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但此时客户端还可以接受数据。
第二次挥手:Server端接到FIN报文后,但是如果还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以服务器端先发送ACK(第25帧),告诉Client端:请求已经收到了,但是我还没准备好,请继续等待停止的消息。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
第三次挥手:当Server端确定数据已发送完成,则向Client端发送FIN报文(第26帧),告诉Client端:服务器这边数据发完了,准备好关闭连接了。
第四次挥手:Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,所以发送ACK后进入TIME_WAIT状态(第27帧), Server端收到ACK后,就知道可以断开连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,最后,Client端也可以关闭连接了至此,TCP连接就已经完全关闭了!

3.具体直白语言描述
   client :我要终止了
   server:当然可以
   server:终止了
   client 确认:好的
      这是client还是不相信网络,在在等2MSL 如果确实没收到servler端的信息,则关闭自己的通信端口

4.总结

   其实谁发起,谁进行TIME_WAIT,等待超时进行结束。
   一起起因是网络不稳定。



参考:
http://blog.csdn.net/sinat_21455985/article/details/53508115

你可能感兴趣的:(http4次挥手)