剑指Offer(网络)——TCP四次挥手

挥手指的就是终止连接,TCP四次挥手流程图如下:

客户端或者服务端触发close,假设客户端触发close
在这里插入图片描述

  1. 数据传输完毕之后,双方才可以释放连接;
  2. 最开始客户端和服务端都处于Established状态,假设客户端主动关闭;
  3. 首先客户端发送连接释放报文并停止发送数据,该数据报报头中携带的flag为FIN=1,seq=u,u指的是刚才连接状态下传送过来的最后一条信息的最后一个序号加上1,此时客户端进入了FIN_WAIT-1状态,第一次挥手;
  4. TCP规定,即使FIN报文段不携带任何数据也要消耗一个序号,让下一步回复报文的时候能使seq+1,当服务器收到连接释放报文之后也要发出确认报文,即ACK=1,ack=u+1,自己的序列号sequence=v此时服务端就进入了CLOSE-WAIT状态,此时服务器处于半关闭状态,意味着客户端没有数据发送但是服务端要发送数据客户端还是可以接受的,这种状态持续到CLOSE-WAIT结束,第二次挥手;
  5. 客户端就进入了FIN-WAIT-2的状态等待服务器继续发送释放连接报文也就是第三次挥手,注意这个时候服务器还是可以继续发送数据的,此时携带的flag为FIN=1,ACK=1,sequence=w,ack=u+1,当这条报文发送之后就进入了LAST-ACK的状态,也就是服务端最终确认状态等待客户端的最终确认;
  6. 客户端这个时候收到了服务端最后释放的报文之后,发送报文ACK=1,sequence=u+1,ack=w+1之后进入TIME_WAIT状态这时就是第四次挥手;
  7. 等待2MSL(最长报文段寿命)之后TCP Client就进入了关闭状态。之后当服务端接受到了客户端的报文之后也会立刻进入到关闭状态。

为什么会有TIME_WAIT状态???

  1. 确保有足够的时间使对方收到ACK,如果对方没收到ACK会重传FIN,一去一回正好是2MSL;
  2. 防止这个连接和后面的连接混乱在一起,因为有的路由器会缓存报文数据包。

为什么需要四次挥手才能断开连接???

因为TCP连接是全双工的,发送方和接收方都需要FIN报文和ACK报文,简单说就是传递的过程发送方和接收方都要各自发送两次正好是四次。。

服务器出现大量CLOSE_WAIT的原因???

客户端发送过来一个FIN报文之后服务器没有发送ACK或者来确认FIN报文,就是客户单关闭socket连接但是服务器忙于服务没有及时关闭连接。这个时候是需要修改程序的。

发布了245 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44240370/article/details/104186560