有的时候我们在调试服务时,当简单修改完代码,重启时,会碰到 Port already in use 的问题,过一会就好,这是什么原因呢?

先看一下四次挥手过程

如上图的time wait过程, 虽然我们已经关掉了服务器,但是,如果恰好有连接存在,服务端会发起关闭连接的过程,所以会有一个 time wait 的过程,因此,如果我们立马进行重启时,因为上次socket绑定的端口尚未释放,所以会碰到那个开头所说的那个问题。

需要注意的是,time wait 并不是固定发生在服务端或客户端,而是发生在发起断开链接的那一侧。

为什么会有time wait的过程?

可以想象一下,如果hostA 在发送最后一个ACK包之后,立马关闭了本地套接字,如果这个包在传输过程中发生意外,hostB 在没有收到最后一个ACK时,会继续发送前一个FIN包,而此时hostA已经不能接受数据了。有了time wait的过程,就可以保证在正常的情况下,可以正确的断开链接(如果网络实在太差,还是会碰到上述问题的)。