与so_reuseaddr相关的问题

zer*_*uno 4 sockets tcp bind

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

此套接字选项告诉内核,即使此端口正忙(处于 TIME_WAIT 状态),仍要继续并重用它。如果它很忙,但处于其他状态,您仍然会收到地址已在使用中的错误。如果您的服务器已关闭,然后立即重新启动,而其端口上的套接字仍处于活动状态,则此功能非常有用。您应该意识到,如果出现任何意外数据,可能会使您的服务器感到困惑,但虽然这是可能的,但可能性不大。
有人指出,'一个套接字是一个5元组(proto、本地地址、本地端口、远程地址、远程端口)。SO_REUSEADDR 只是表示您可以重用本地地址。5 元组仍然必须是唯一的!作者:迈克尔·亨特 (mphunter@qnx.com)。这是事实,这就是为什么您的服务器不太可能看到意外数据的原因。危险在于这样的 5 元组仍然在网络上浮动,并且当它四处浮动时,来自同一系统上同一客户端的新连接碰巧获得相同的远程端口。Richard Stevens 在#2.7“请解释 TIME_WAIT 状态”中解释了这一点。

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

use*_*421 5

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

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

如果1小时后还有同一个元组怎么办?

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