在unix网络编程中,我总是在服务器使用的套接字上设置SO_REUSEADDR选项来侦听连接。这基本上是说可以在机器上的同一端口上打开另一个套接字。当从崩溃中恢复并且套接字未正确关闭时,这非常有用 - 应用程序可以重新启动,它只会在同一端口上打开另一个套接字并继续侦听。
我的问题是,旧插座会怎样?毫无疑问,所有数据/连接仍将在旧套接字上接收。它会被操作系统自动关闭吗?
当使用套接字的程序终止时,套接字被视为已关闭。这些都是由操作系统处理的,操作系统将拒绝接受来自死会话的任何进一步的通信。但是,如果套接字意外关闭,另一端的计算机可能不知道对话已结束,并且可能仍在尝试通信。
这就是为什么在 TCP 规范中设计了一个等待期,然后才能重用相同的端口号。因为从理论上讲,尽管不太可能,来自旧会话的数据包可能会带有适当的 IP 地址、端口号和序列号,从而导致接收服务器意外地将其错误地插入到错误的 TCP 流中。
The SO_REUSEADDR
选项会覆盖该行为,允许您立即重用该端口。实际上,您是在说:“我了解风险,并且无论如何都想使用该端口。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)