套接字关闭后为什么端口没有立即释放?

时间:2014-03-21 02:25:44

标签: c sockets

我发现默认情况下OS在服务器关闭后不会立即释放我的服务器套接字使用的端口。通过在设置套接字时给出SO_REUSEADDR可以避免这个问题,但我不明白为什么保持端口一段时间是有用的。如果服务器关闭,套接字关闭,传输到该端口的任何数据都不会被处理吗?

2 个答案:

答案 0 :(得分:5)

当端口被释放时,它进入TIME_WAIT状态,以防止在第一个连接路由时被延迟的重复数据包被传递到第二个连接。

在没有TIME_WAIT的情况下会发生这种情况:

  • 从(地址a,端口p)到(地址b,端口q)的连接终止
  • 建立从(地址a,端口p)到(地址b,端口q)的第二个连接
  • 来自第一个连接的重复数据包在网络中被延迟,并在其序列号位于第二个连接的窗口中时到达第二个连接。

这是一个很好的answer explaining how to deal with this。这是一篇解释how to mitigate the effects of TIME_WAIT on busy servers的文章。

答案 1 :(得分:1)

在网络套接字的情况下,其他人可以在发布后立即在同一端口上设置服务器,并且任何可能用于以前的服务器的新连接(TCP)或数据包(UDP)可以是“被新服务器劫持。如果网络中仍然存在旧包,则可能会发生类似这样的事情。

话虽如此,通常建议SO_REUSEADDR使服务器可以重启,并且应该使用其他方法防止端口劫持(最简单的方法是特权端口)。