如果我终止正在侦听 TCP 端口的程序,则需要花费几分钟的时间才能使该端口被系统回收并再次可用。我看到几个问答提到了这种现象,但没有解释。为什么会发生这种情况,为什么系统不立即回收端口?在其他系统(例如 Windows 或 Mac)上是否也会发生这种情况?
答案1
其背后的想法是确保您不会收到针对在该端口上侦听的上一个程序的数据包。该TIME_WAIT
状态定义于RFC793作为最大段寿命的两倍。
我不了解其他操作系统,但我认为所有这些操作系统都有某种类似的行为。
此问题的解决方法是设置SO_REUSEADDR
在应该忽略状态的套接字上TIME_WAIT
。