[Socket] SO_REUSEADDR ?

在搞清楚SO_REUSEADDR选项有什么作用前,我们可能需要先简单回顾下TCP的四次握手,也就是TCP的连接释放过程。(当然,SO_REUSEADDR在多宿环境下也很重要,但是我们暂时不对那种情况进行分析。)

在这里,我们称“执行主动关闭的一方”为A,“执行被动关闭的一方”为B。

TCP的连接释放过程的具体细节,可以参考各种教材以及其他文章,在这里我们不再赘述。

简单来说就是,在TCP连接释放的最末尾,A会收到B发来的FIN报文段并响应一个ACK,至此,A就进入了TIME_WAIT状态。

之所以要进入TIME_WAIT状态而非直接CLOSED,其中一个原因就是因为A最后发出的ACK可能丢失,导致B无法正常释放连接,而令A等在TIME_WAIT状态就可以对B重传的FIN报文段进行再次响应

SO_REUSEADDR这个选项的作用就是告知内核,如果该端口正在使用但是TCP状态处于TIME_WAIT ,我们就可以重用这个端口。这在,服务程序停止后想立即重启并依旧使用同一端口时非常有用。当然,如果端口正在使用且TCP状态位于其他状态,重用端口将会报错。

猜你喜欢

转载自blog.csdn.net/sai_j/article/details/79520199
今日推荐