luoxue-victor / my-blog

公众号【前端技匠】作者

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TCP四次挥手

luoxue-victor opened this issue · comments

连接释放需要发送4次报文才能完成. 这是因为TCP连接是全双工的, 每一端都需要对读写部分分别进行关闭才行. 当一端关闭读/写或者都关闭时, 该端就会向对象发送FIN来告知对端我将要关闭了, 对端知道后挥发送确认, 关闭端确认后再发送一个确认给对端. 整体就是首先进行关闭的一方将执行主动关闭, 而另一方执行被动关闭.

  1. 客服端调用close等函数主动关闭, 并向服务端发送一个含FIN的报文, 然后就进入FIN-WAIT1阶段, 该阶段是等待对端的ACK到来.
  2. 服务端接收到对端的FIN后, 立马向对端回一个ACK确认, 然后进入CLOSE-WAIT阶段, 该阶段服务端还能够将没有发送完的数据发送给对端. 当服务端将数据发送完后再发送一个FIN段, 之后进入LAST-ACK阶段, 等待客服端的ACK到来
  3. 当客户端接收到对端的ACK时, 进入FIN-WAIT2阶段, 该阶段客服端还能够继续接收数据, 但是不能在发送数据了; 当接收到对端的FIN后立马向对端发送ACK确认, 之后进入TIME_WAIT阶段. 等待2MSL后客户端彻底关闭.
  4. 服务端收到ACK后就完全将关闭该连接.