Cannot assign requested address 问题

来源:互联网 发布:淘宝怎么看评价星星 编辑:程序博客网 时间:2024/05/04 00:01

先声明,本文涉及到的知识是之前搜集到的,现在整理出来分享大家,虽然打上原创的tag,但还是向原创致敬!如果涉及到侵权的问题,请联系我,我会及时更改!


遇见这样的问题是在客户端大量向服务器发起connect连接时出现的,字面意思是“不能分配请求的地址”。

两种解决方案。


1、设置TIME_WAIT
客户端频繁的连服务器,由于每次连接都在很短的时间内结束,而端口释放较慢,导致建立新连接时无可用端口(或者说是导致很多的TIME_WAIT,以至于用光了可用的端口号),所以新的连接没办法绑定端口,即“Cannot assign requested address”。通过netstat,的确看到很多TIME_WAIT状态的连接。


执行命令修改如下2个内核参数 (需要root权限) 
sysctl -w net.ipv4.tcp_timestamps=1  开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1  表示开启TCP连接中TIME-WAIT sockets的快速回收


2、修改端口数
研究发现,Linux对外的随机分配端口是由一定限制的,理论上单机对外的端口最大值为65535,除去一些保留端口和被占用端口外,也应该在6W左右,但实际上单机建立对外连接时,默认不超过28232个连接。
    执行以下命令就很清楚原因了:
    $ cat /proc/sys/net/ipv4/ip_local_port_range
输出结果为:
    32768   61000
    这就是Linux随机分配端口的范围,如果在该范围内有被占用的端口,那么连接数肯定小于28232.如果想更改这个范围,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。可以执行以下命令:
    # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range\


综述第一中方法相对来说不安全,第二种方法还是会受到一定限制(尽管提升到了65535-10000=55535),当然这两种方式如何选择还有个因素就是建立的TCP连接是否要保持,如果要保持,客户端这边也就是到了55535了,如果不保持随即释放,两种方法都可以参考
0 0
原创粉丝点击