大致上是由于客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口
- 使用如下两种方式查看(如下是修改后的,原来是32768 61000,此时只能27000多端口,当超出后就会报错)
[xxx@yahf ~]$ sysctl -a |grep local_port_range
net.ipv4.ip_local_port_range = 9000 65500
[xxx@yahf ~]$ cat /proc/sys/net/ipv4/ip_local_port_range
9000 65500
- 修改:vi /etc/sysctl.conf 添加下面一行:net.ipv4.ip_local_port_range=10000 65000
vi:Esc返回到命令行模式,【i】键进入编辑模式,添加好后保存退出,命令行如下借鉴:
【:w】 保存文件
【:w!】 若文件为只读,强制保存文件
【:q】 离开vi
【:q!】 不保存强制离开vi
【:wq】 保存后离开
【:wq!】 强制保存后离开
[xxx@yahf etc]$ vi /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
net.ipv4.ip_local_port_range=10000 65000 #添加这一行
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
- 修改好后,执行命令“sysctl -p”使参数生效,不需要reboot。
- 其他可能的解决办法:
- 调低端口释放后的等待时间,默认为60s,修改为15~30s
[xxx@localhost ~]$ sys -w net.ipv4.tcp_fin_timeout=30
- 修改tcp/ip协议配置,通过配置/proc/sys/net/ipv4/tcp_tw_resue,默认为0,修改为1.释放TIME_WAIT端口给新连接使用
[xxx@localhost ~]$ sysctl -w net.ipv4.tcp_timestamps=1
- 修改tcp/ip协议配置,快速回收socket资源,默认为0,修改为1
[xxx@localhost ~]$ sysctl -w net.ipv4.tcp_tw_recycle=1
网友评论