【问题标题】:Is SO_REUSEADDR socket options useful on the client-side?SO_REUSEADDR 套接字选项在客户端有用吗?
【发布时间】:2017-05-31 02:05:25
【问题描述】:

我在一个 java 客户端库中遇到了这句话:

socket.setReuseAddress(true);

认为这是用来提高性能的, 因为SO_REUSEADDR选项可以表示socket可以强制 使用 TIME_WAIT 端口,即使它属于另一个套接字。

但我也发现这个选项主要用于服务器端, 使服务器能够快速重启,而不是等待 TIME_WAIT 套接字关闭。

我的问题是这个选项对客户端有用吗? 喜欢这个客户端库吗?这会不会对另一个套接字造成伤害,比如一些攻击?

非常感谢!

-迪米

【问题讨论】:

  • 通常在客户端不使用,但有一种情况是 - 通过 NAT 进行 TCP 打孔,这需要将多个套接字绑定到相同的本地IP/端口,所以他们必须使用SO_REUSEADDR/SO_REUSEPORT
  • 非常感谢。我想知道是否有任何经验表明通过设置此选项对(客户端)性能有很大帮助?

标签: linux sockets


【解决方案1】:

这取决于您所说的“客户”是什么意思。您还提到了“客户端库”,这与它无关。

这经常被误解,SO_REUSEADDR 是为了能够重用TIME_WAIT 中的套接字,而TIME_WAIT 只发生在 TCP 连接的一侧,发起终止序列的一侧 ie 发送第一个FIN 数据包 ie 先调用shutdown(SHUT_WR) 或先调用close,虽然后者不清楚/可能取决于连接状态或平台等其他因素,原因你should not call close在第一次致电shutdown(SHUT_WR) 之前。 This article 是一个非常有用的信息,以及文章末尾引用的两个。明确TIME_WAIT 可能发生在侦听(服务器)端以及客户端,并建议实际上让客户端始终启动终止(“主动关闭”),以便服务器不会在TIME_WAIT 中累积套接字,这将是一个更大的问题。

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2016-05-21
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2015-02-08
    • 2014-04-18
    • 2012-02-19
    相关资源
    最近更新 更多