或许你遇到过这样的情况:
- 关闭服务端之后,再次重启时一直报:Address already in use(地址重用)
- 一段时间过后,再次输入 ./svr 时,服务端又能重启了???
下面实际操作一下:
1. 重启服务端:无法正常启动
2. 一段时间过后:可以正常启动
3. 看下端口状态
并不是我们想象中的连接关闭了,而是处于一种 TIME_WAIT
状态,也就是说19999
端口仍然被占用着,因此会出现地址重用的提示
如图:
小结:
- 先关闭连接的一端(服务端),在回复应答发送
ACK
之后会进入一个TIME_WAIT的状态,等待2MSL
的时间确保对端确实收到了应答 - 若
ACK
应答在网络中丢失,超过等待时间,被动关闭的一端(客户端)会重新给服务端发送一个FIN
请求:超时重传 - 主动关闭连接的一端(服务端)收到
FIN
后,会重新发送ACK
应答,并重新计时等待2MSL,直到时间耗尽,服务端关闭