为什么在程序终止后清理侦听 TCP 端口需要长达几分钟的时间?

Pet*_*etr 28 networking tcp resources

如果我终止一个正在侦听 TCP 端口的程序,则该端口被系统回收并再次可用之前需要几分钟的时间。我看到几个 Q/A 提到了这种现象,但没有解释。为什么会发生这种情况,为什么系统不立即回收端口?它是否也发生在其他系统上,例如 Windows 或 Mac?

Ulr*_*gel 27

这背后的想法是确保您不会收到针对在该端口上侦听的先前程序的数据包。此TIME_WAIT状态在RFC793 中定义为最大段寿命的两倍。

我不知道其他操作系统,但我认为所有这些都有某种类似的行为。

此问题的解决方法是SO_REUSEADDR在应忽略TIME_WAIT状态的套接字上进行设置。

  • 检查我可靠的 TCP 状态图,我可以看到 TIME_WAIT 是套接字的最后状态,并且通常持续 2MSL - 这是最大段生命周期的两倍。规范 (RFC793) 将其声明为 2 分钟,总共给出 4 分钟。这允许有足够的时间来处理仍在“飞行中”的任何请求和回复,并在正确的程序上着陆 - 或者如果套接字处于 TIME_WAIT 中则被丢弃。 (3认同)