下面的笔记是记录我在练习select
服务器的开发中用到的作用,其他更复杂的功能暂时还没用到,就先不记了,其他更多说明可以参考这篇文章 http://www.cnblogs.com/mydomain/archive/2011/08/23/2150567.html
一般来说,一个端口释放后会等待两分钟之后才能再被使用,这段时间是消耗在了socket
从TIME_WAIT
到CLOSED
,正常情况下只有当socket
的状态值为CLOSED
的时候才能被重新利用。之前我也好奇为什么有时候我一个程序 kill 了,当然重启时提示我端口被占用,而过了一会就好了,其实就是这个原因。
[root@localhost unix]# rm a.out rm: remove regular file `a.out`? yes [root@localhost unix]# gcc tcp02.c [root@localhost unix]# ./a.out bind error: Address already in use [root@localhost unix]# ./a.out bind error: Address already in use [root@localhost unix]# netstat -anp|grep 8031 tcp 0 0 10.211.55.4:8031 10.211.55.2:49830 TIME_WAIT -
而SO_REUSEADDR
的作用就是,让端口释放后就可以立即被再次使用。SO_REUSEADDR
对处于TIME_WAIT
状态下的socket TCP套接字可以立即重复绑定使用。server程序总是应该在调用bind()
之前设置SO_REUSEADDR
套接字选项。
当有socket a处于 TIME_WAIT 状态时,而你启动的程序的 socket b 要占用该地址和端口,你的程序就要用到该选项。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,也就是调用close()之后,就等2MSL后即可回到CLOSED可用状态了。具体查看 tcp/ip 协议。
MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。
👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!