我发现操作系统默认情况下在服务器关闭后不会立即释放使用的端口。通过在设置套接字时添加SO_REUSEADDR
可以避免这个问题,但我不明白为什么需要暂时保留端口。如果服务器关闭了,套接字也关闭了,那么传输到该端口的任何数据都无法被处理,对吧?
我发现操作系统默认情况下在服务器关闭后不会立即释放使用的端口。通过在设置套接字时添加SO_REUSEADDR
可以避免这个问题,但我不明白为什么需要暂时保留端口。如果服务器关闭了,套接字也关闭了,那么传输到该端口的任何数据都无法被处理,对吧?
当端口被释放时,它进入 TIME_WAIT
状态,以防止延迟到达第一个连接的重复数据包被传递到第二个连接。
以下情况是没有使用 TIME_WAIT
可能会发生的:
这里有一个很好的 回答解释如何处理此问题。这篇文章解释了如何缓解忙碌服务器上 TIME_WAIT
的影响。
SO_REUSEADDR
使服务器可重启,并应使用其他方法防御端口劫持(最简单的方法是使用特权端口)。