【问题标题】:Using SO_REUSEADDR - What happens to previously open socket?使用 SO_REUSEADDR - 以前打开的套接字会发生什么?
【发布时间】:2010-10-21 00:16:02
【问题描述】:

在 unix 的网络编程中,我总是在服务器用来监听连接的套接字上设置 SO_REUSEADDR 选项。这基本上表示可以在机器上的同一端口上打开另一个套接字。这在从崩溃中恢复并且套接字未正确关闭时很有用 - 可以重新启动应用程序,它只会在同一端口上打开另一个套接字并继续侦听。

我的问题是,旧套接字会发生什么?毫无疑问,所有数据/连接仍将在旧套接字上接收。它会被操作系统自动关闭吗?

【问题讨论】:

标签: c network-programming unix


【解决方案1】:

当使用它的程序死亡时,一个套接字被认为是关闭的。这大部分由操作系统处理,操作系统将拒绝接受来自死对话的任何进一步通信。但是,如果套接字意外关闭,另一端的计算机可能不知道对话已经结束,并且可能仍在尝试通信。

这就是为什么在 TCP 规范中设计了一个等待期,然后才能重用相同的端口号。因为在理论上,无论多么不可能,来自旧会话的数据包可能会以适当的 IP 地址、端口号和序列号到达,从而导致接收服务器错误地将其插入错误的 TCP 流中。

SO_REUSEADDR 选项会覆盖该行为,允许您立即重用端口。实际上,您是在说:“我了解其中的风险,并且无论如何都想使用该端口。”

【讨论】:

    【解决方案2】:

    是的,当旧进程结束时,操作系统会自动关闭前一个套接字。您通常不能立即在同一个端口上侦听的原因是,尽管套接字已关闭,但仍会在一段时间内(通常是几分钟)保持 2MSL 状态。当超时到期时,操作系统会自动将旧套接字转换出此状态。

    【讨论】:

    • 啊……当然。套接字毕竟只是一个文件句柄,将被操作系统清理。非常感谢:)
    • 准确地说,TCP端点保持在2MSL状态。插座不见了。
    • 等待期被添加到规范中是有原因的。使用 SO_REUSEADDR 会导致 TCP 堆栈违反等待期。 (你的 2MSL 状态)
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多