与so_reuseaddr相关的问题

时间:2013-11-13 17:31:30

标签: sockets tcp bind

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

这个套接字选项告诉内核即使这个端口忙了(在     TIME_WAIT状态),继续并重复使用它。如果很忙,     但是对于另一个州,你仍然会得到一个已经在使用的地址     错误。如果您的服务器已关闭,那么它很有用     当套接字在其端口上仍处于活动状态时立即重新启动。您     应该知道,如果有任何意外数据进入,它可能会混淆     你的服务器,虽然这是可能的,但不太可能。
有人指出'套接字是一个5元组(proto,本地地址,本地端口,远程地址,远程端口)。 SO_REUSEADDR只是说你可以重用本地地址。 5元组仍然必须是独一无二的!作者:Michael Hunter(mphunter@qnx.com)。这是事实,这就是为什么您的服务器不太可能看到意外数据的原因。危险在于这样的5元组仍然在网络上漂浮,当它在弹跳时,来自同一客户端的新连接在同一系统上碰巧得到相同的远程端口。 Richard Stevens在#2.7中解释了这一点。请解释TIME_WAIT状态'。

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

1 个答案:

答案 0 :(得分:2)

这是一个表达不佳的答案。链接,所以我可以评论。

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

  

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

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