2

我正在阅读以下关于“so_reuseaddr 到底做了什么?”的答案。

这个套接字选项告诉内核,即使这个端口很忙(处于 TIME_WAIT 状态),继续并重用它。如果它很忙,但处于另一个状态,您仍然会收到地址已在使用错误。如果您的服务器已关闭,然后在其端口上的套接字仍处于活动状态时立即重新启动,这将很有用。您应该知道,如果有任何意外数据进入,它可能会使您的服务器感到困惑,但是虽然这是可能的,但不太可能。
有人指出,'一个套接字是一个 5 元组(原型、本地地址、本地端口、远程地址、远程端口)。SO_REUSEADDR 只是说您可以重用本地地址。5 元组仍然必须是唯一的!迈克尔·亨特 (mhunter@qnx.com)。这是真的,这就是为什么您的服务器不太可能看到意外数据的原因。危险是这样一个 5 元组仍然在网络上四处飘荡,当它四处弹跳时,来自同一客户端的新连接,在同一系统上,碰巧获得了相同的远程端口。Richard Stevens 在 #2.7 '请解释 TIME_WAIT 状态'中对此进行了解释。

我只是无法得到最后几行The danger is....TIME_WAIT state.它说如果网络上仍然有相同的浮动元组......但是如果 1 小时后有相同的元组怎么办?看不懂,谁能解释一下?

4

1 回答 1

3

这是一个表达不佳的答案。请链接,以便我发表评论。

危险在于具有旧 5 元组的数据包仍在网络中传输。如果它在新连接创建之后到达,它就有可能被视为该连接的预期用途,因此被传递到该连接,这将违反 TCP 的完整性保证。

如果 1 小时后有相同的元组怎么办?

不可能。IP 数据包的最大分段生命周期 (MSL) 为一分钟。TIME_WAIT 状态持续 2*MSL。这就是它的工作原理。

于 2013-11-13T22:43:19.387 回答