SO_REUSEADDR套接字选项在客户端是否有用?

5
我在一个Java客户端库中发现了以下语句: socket.setReuseAddress(true); 我认为这是用来提高性能的,因为SO_REUSEADDR选项可以指示套接字甚至在属于其他套接字的TIME_WAIT端口时也可以强制使用。
但是我也发现,这个选项大多数情况下是在服务器端使用的,以便使服务器能够快速重启,而不必等待TIME_WAIT套接字关闭。
我的问题是,这个选项对客户端(例如这个客户端库)有用吗?这会对其他套接字造成伤害,比如一些攻击吗?
非常感谢!
-Dimi

1
它通常不用于客户端,但有一个例外情况 - 通过NAT进行TCP穿透,这需要多个套接字同时绑定到相同的本地IP /端口,因此它们必须使用SO_REUSEADDR/SO_REUSEPORT - Remy Lebeau
非常感谢。我想知道是否有任何经验表明通过设置此选项可以大大提高(客户端)性能? - haonan hu
1个回答

4
这取决于你所说的“客户端”的含义。你还提到了“客户端库”,但它与此无关。
这经常被误解,SO_REUSEADDR是为了能够在TIME_WAIT状态下重用套接字,而TIME_WAIT只发生在TCP连接的一侧,即发起终止序列的一侧,即发送第一个FIN数据包或首先调用shutdown(SHUT_WR)或调用close,尽管后者不太清楚/可能取决于其他因素,如连接状态或平台,这就是为什么你 不应该在首先调用close之前调用 shutdown(SHUT_WR)的原因。本文以及文章末尾引用的两篇文章都非常详细,它们明确指出TIME_WAIT可能在监听(服务器)端和客户端上发生,并建议客户端始终发起终止(“主动关闭”),以使服务器不会积累处于TIME_WAIT状态的套接字,否则这将成为更大的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接