【问题标题】:TCP Socket Close and RebindTCP 套接字关闭并重新绑定
【发布时间】:2012-05-25 01:07:57
【问题描述】:

我有一个 JAVA 项目,在其中我将 tcp 套接字绑定到特定端口。

当我为端口 X 上的套接字绑定调用 close() 方法时,我在几秒钟内无法在端口 X 上绑定新套接字,尽管我已经调用了 close() 方法。但是过几秒就可以绑定了。

这种情况正常吗?还是我应该再次检查我的代码?

【问题讨论】:

标签: java sockets bind


【解决方案1】:

我在特定端口绑定 tcp 套接字

这就是问题所在,解决方法是不要这样做。让系统选择。

绑定到特定的本地端口并不能解决任何问题,至少不能解决任何问题。有时,过分热情的网络管理员会错误地认为(a)它增加了安全性并且(b)它很容易实现,从而指定出站端口范围。两者都不正确。

TIME_WAIT 状态不是“操作系统 [需要] 一段时间才能收到通知”,它是 TCP 的一项基本安全功能。关闭的套接字会持续几分钟。除非您绑定到特定的本地出站端口,否则这是一项功能,而不是错误。

【讨论】:

  • 只是为了项目的目的,我的团队只有 10 个端口可用于部署其客户端和服务器。我知道这可能不对(因为系统本身可以为自己的进程绑定这些端口),但除了一组特定端口之外我别无选择。
  • @kit-kat 您的系统拥有任意数量的出站客户端端口,除非有人制定了上述愚蠢的规则。唯一的限制应该是 listening 端口,即 ServerSocket 端口。您不必指定本地出站端口即可遵守该规定。如果有人不同意,请把他们送到这里讨论。
  • quickmeme.com/meme/3pfxjd 。完全同意你的看法。我与一位同事讨论过这个问题,他提到操作系统需要一段时间才能得知端口关闭,从而使其可用于绑定。我想没有办法手动通知操作系统。或者有吗?
  • @kit-kat 如果您指的是 TIME_WAIT 状态,它不是“操作系统 [需要] 一段时间来通知”,它是 TCP 的一项基本安全功能。关闭的套接字会持续几分钟。除非您绑定到特定的本地出站端口,否则这是一项功能,而不是错误。有数千个端口可以系统分配为出站端口:让系统分配它们。
  • 我搜索了这个状态,现在我明白了这是怎么回事。正如我之前提到的,这是一个大学项目,所以我很担心向我的教授展示这个项目。但如果是 TCP 的安全特性,那就没什么好担心的了。非常感谢。
猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 2011-01-26
  • 2021-05-03
  • 2015-12-07
  • 2020-09-17
  • 2018-05-11
  • 2013-05-15
  • 2015-09-04
相关资源
最近更新 更多