1.四次挥手服务端和客户端的状态:
- 主动关闭连接的一方,调用 close ();协议层发送 FIN 包;
- 被动关闭的一方收到 FIN 包后,协议层回复 ACK;然后被动关闭的一方,进入 CLOSE_WAIT 状态,主动关闭的一方等待对方关闭,则进入 FIN_WAIT_2 状态;此时,主动关闭的一方等待被动关闭一方的应用程序,调用 close 操作;
- 被动关闭的一方在完成所有数据发送后,调用 close () 操作;此时,协议层发送 FIN 包给主动关闭的一方,等待对方的 ACK,被动关闭的一方进入 LAST_ACK 状态;
- 主动关闭的一方收到 FIN 包,协议层回复 ACK;此时,主动关闭连接的一方,进入 TIME_WAIT 状态;而被动关闭的一方,进入 CLOSED 状态;
- 等待 2MSL 时间,主动关闭的一方,结束 TIME_WAIT,进入 CLOSED 状态;
2.总结上面的过程,得出一次 socket 关闭操作:
- 主动关闭连接的一方 – 也就是主动调用 socket 的 close 操作的一方,最终会进入 TIME_WAIT 状态;
- 被动关闭连接的一方,有一个中间状态,即 CLOSE_WAIT,因