我发现默认情况下OS在服务器关闭后不会立即释放我的服务器套接字使用的端口。通过在设置套接字时给出SO_REUSEADDR
可以避免这个问题,但我不明白为什么保持端口一段时间是有用的。如果服务器关闭,套接字关闭,传输到该端口的任何数据都不会被处理吗?
答案 0 :(得分:5)
当端口被释放时,它进入TIME_WAIT
状态,以防止在第一个连接路由时被延迟的重复数据包被传递到第二个连接。
在没有TIME_WAIT
的情况下会发生这种情况:
这是一个很好的answer explaining how to deal with this。这是一篇解释how to mitigate the effects of TIME_WAIT
on busy servers的文章。
答案 1 :(得分:1)
在网络套接字的情况下,其他人可以在发布后立即在同一端口上设置服务器,并且任何可能用于以前的服务器的新连接(TCP)或数据包(UDP)可以是“被新服务器劫持。如果网络中仍然存在旧包,则可能会发生类似这样的事情。
话虽如此,通常建议SO_REUSEADDR
使服务器可以重启,并且应该使用其他方法防止端口劫持(最简单的方法是特权端口)。