[Socket] SO_REUSEADDR ?
2018-03-11 21:07
155 查看
在搞清楚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状态位于其他状态,重用端口将会报错。
在这里,我们称“执行主动关闭的一方”为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状态位于其他状态,重用端口将会报错。
相关文章推荐
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- setsockopt(CreateSock,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&dwFlag,sizeof(dwFlag));说明
- socket中的SO_REUSEADDR
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- socket中的SO_REUSEADDR
- linux下tcp socket的SO_REUSEPORT和SO_REUSEADDR
- socket中的SO_REUSEADDR
- socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT
- socket - option编程:SO_REUSEADDR
- linux socket中的SO_REUSEADDR
- socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT
- setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- socket中的SO_REUSEADDR
- linux网络编程四:socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
- setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));