在unix的网络编程中,我总是在服务器用来侦听连接的套接字上设置SO_REUSEADDR选项。这基本上说可以在机器上的同一端口上打开另一个套接字。这在从崩溃中恢复并且套接字未正确关闭时非常有用 - 应用程序可以重新启动,它只需在同一端口上打开另一个套接字并继续监听。
我的问题是,旧套接字会发生什么?毫无疑问,仍将在旧套接字上接收所有数据/连接。它是否会被操作系统自动关闭?
答案 0 :(得分:29)
当使用它的程序死掉时,套接字被认为是关闭的。操作系统会处理这么多,操作系统将拒绝接受来自死对话的任何进一步通信。但是,如果套接字意外关闭,另一端的计算机可能不知道对话已结束,并且可能仍在尝试通信。
这就是为什么在TCP规范中设计了一个等待时间,然后才能重用相同的端口号。因为从理论上讲,无论多么不可能,来自旧会话的数据包可能会以适当的IP地址,端口号和序列号到达,以致接收服务器错误地将其误插入错误的TCP流中。
SO_REUSEADDR
选项会覆盖该行为,允许您立即重用该端口。实际上,你说的是:“我理解风险并且还想使用端口。”
答案 1 :(得分:24)
是的,当旧进程结束时,操作系统会自动关闭先前的套接字。您通常不能立即侦听同一端口的原因是因为套接字虽然已关闭,但仍保持2MSL状态一段时间(通常为几分钟)。当超时到期时,操作系统会自动将旧套接字转换为此状态。