SO_REUSEADDR 开启场景
- 多网卡(IP)绑定相同端口;
- 让关闭连接释放的端口今早可使用;
TCP 四次挥手
TIME-WAIT 的作用一:作为 ACK 的容错时间
- Client 最后的 ACK 不一定能成功到达 Server;
- 如果没有到达,Server 会重发 FIN;
- 如果 Client 没有 TIME-WAIT,就会返回一个 RST 的错误;
TIME-WAIT 的作用二:等待“迷途知返”的包“回家”
- TCP 中有个概念 MSL(Max Segment Life),即包的最大生命周期;
- 如果不等个 TIME-WAIT 时间,直接进入 CLOSED 状态,端口立马可以被别的程序重用,“迷途知返”的包就会进入别的程序;
- 在这种用例下,TIME-WAIT 设置成 2 * MSL,Linux 下一般是 60s;
- 如果开启参数 SO_REUSEADDR,TIME-WAIT 会被设置成协议认为安全的时间,1s;
是否开启 SO_REUSEADDR 参数
- 取决于网络环境和自己的信心,如果网络环境好,有信息不会有“迷途知返”的包,并且认为 ACK 可以发到 Server,那么可以考虑开启 SO_REUSEADDR(默认关闭);