程序死后,为什么最多需要几分钟来清理侦听的TCP端口?


27

如果我杀死了正在侦听TCP端口的程序,则该过程最多需要几分钟,直到该端口被系统回收并再次可用。我已经看到一些问答提到了这种现象,但是没有任何解释。为什么会发生这种情况,为什么系统不立即收回端口?它是否还会在其他系统(例如Windows或Mac)上发生?

Answers:


25

其背后的想法是确保您不会在该端口上侦听到先前程序的目标数据包。RFC793中将该TIME_WAIT状态定义为最大段生存期的两倍。

我不了解其他操作系统,但是我假设所有这些操作系统都有某种相似的行为。

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


3
查看我可信赖的TCP状态图,我可以看到TIME_WAIT是套接字的最后状态,并且通常持续2MSL,这是最大段寿命的两倍。规范(RFC793)将此表示为2分钟,总共给出4分钟。这样可以为处理仍在运行中的所有请求和回复留出足够的时间,并在正确的程序中找到它们-如果套接字在TIME_WAIT中,则将其丢弃。
Faelkle

我可以确认这也在Windows中发生。
Thomas Bratt 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.