0. 背景介绍
接上篇文章 记time_wait状态引起的端口占用排查 介绍的排查 time_wait 的方法,并不能从根本上解决客户端随机分配的端口抢占本应分配给服务器的端口的问题
1. 方案描述
一般在服务器上都存在一些需要预留的端口,除了上篇介绍的 net.ipv4.ip_local_port_range
参数以外,没有很好的预留非连续端口的方式,只能提前绑定需要的端口
如果直接绑定或监听需要预分配的端口的话,当真正需要使用该端口时,还需要经历释放端口、重新绑定,并且还可能出现 Address is in use 的问题
解决方案是利用 SO_REUSEADDR和SO_REUSEPORT 参数的特性,在预绑定时设置这两个参数,后续再往该端口上绑定服务不会存在冲突,且客户端也无法进行抢占
2. 代码展示
- 根据网卡获取IP地址
要选取正确的IP地址,否则绑定无效
func GetLocalIPByEthName(eth ...string) (string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return "", err
}
for _, i :=