使用SO_REUSEADDR - 以前打开套接字会发生什么?

Nar*_*ren 27 c unix network-programming

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

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

tyl*_*erl 29

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

这就是为什么在TCP规范中设计了一个等待时间,然后才能重用相同的端口号.因为在理论上,无论多么不可能,来自旧会话的分组可能有适当的IP地址,端口号和序列号到达,使得接收服务器错误地将其错误地插入到错误的TCP流中.

SO_REUSEADDR选项会覆盖该行为,允许您立即重用该端口.实际上,你说的是:"我理解风险,并且还想使用这个端口."


Gre*_*ill 24

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

  • 确切地说,TCP端点保持在2MSL状态.套接字消失了. (4认同)