Cannot assign requested address 出现原因及解决方案

今天在压测时,会偶尔遇到错误,错误提示: Cannot assign requested address ,看了下,大致上是由于客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。

解决办法是需要做一下内核参数优化:(需要root权限)
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收

改完还不能解决问题,需要修改tcp_max_tw_buckets
sudo sh -c “echo ‘5000’> /proc/sys/net/ipv4/tcp_max_tw_buckets”

 

 

----------------------

个人一般sysctl -p 或sysctl -a比较多使用 

 

 

sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。

    命令格式:

    sysctl [-n] [-e] -w variable=value

    sysctl [-n] [-e] -p (default /etc/sysctl.conf)

    sysctl [-n] [-e] -a

    常用参数的意义:

    -w   临时改变某个指定参数的值,如

         sysctl -w net.ipv4.ip_forward=1

    -a   显示所有的系统参数

    -p   从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

    如果仅仅是想临时改变某个系统参数的值,可以用两种方法来实现,例如想启用IP路由转发功能:

    1) #echo 1 > /proc/sys/net/ipv4/ip_forward

    2) #sysctl -w net.ipv4.ip_forward=1

    以上两种方法都可能立即开启路由功能,但如果系统重启,或执行了

    # service network restart

 命令,所设置的值即会丢失,如果想永久保留配置,可以修改/etc/sysctl.conf文件

 将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

 

 

OpenWrt Mac地址修改错误SIOCSIFHWADDR: Cannot assign requested address

 

问题

设置mac地址 11:22:33:44:55:66, 在OpenWrt正在开发的主trunk上就没有SIOCSIFHWADDR: Cannot assign requested address, 这个问题。
但是到attitude adjustment最新的trunk上就出现了,估计是内核版本不同,导致都mac地址的限制不同导致。
最新的反而不严格了?这个不科学啊。

解决方法:
http://blog.csdn.net/evenness/article/details/7674038
http://blog.csdn.net/hds_yx/article/details/17285873

 

在Linux下修改网卡的MAC地址命令:

/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 hw ether 47:72:65:65:6e:00
/sbin/ifconfig eth0 up

当输入第二句命令是会提示:SIOCSIFHWADDR: Cannot assign requested address。原来是MAC地址设置不对。
IP地址分为三类:广播,组播和单播。广播就是:FF:FF:FF:FF:FF:FF。组播:第一字节最后一位是1,如47:72:65:65:6e:00,
47的最后一位是1。单播:第一字节最后一位是0,如48:72:65:65:6e:00
。把上面的地址改为48就不会出现这个问题了。

问题深入学习:

IEEE 802定义MAC地址为

|<--------- 24 bit --------->|<--------- 24 bit -------->|
| ccccccug cccccccc cccccccc | xxxxxxxx xxxxxxx xxxxxxxx |

由ug控制mac地址类型:

u: 0:由 IEEE 指定ID统一管理
    1:本地管理
g: 0:单播
    1:多播
也就是12位MAC地址分为四类,由其中第二位决定
第二位为
 0 | 4 | 8 | C :(00)统一管理的单播 MAC
 1 | 5 | 9 | D :(01)统一管理的多播 MAC
 2 | 6 | A | E :(10)本地管理的单播 MAC
 3 | 7 | B | F: (11)本地管理的多播 MAC

=================================================================
由于针对ADSL路由等这样的网络终端,一般使用的都是 统一管理的单播MAC
所以会判断 02:10:18:01:00:01 或者(11:01:18:00:00:30)为无效MAC,导致无线等功能失效,或者网络连接失败等现象。
而对于 00:25:5E:08:DE:43 这样的MAC就被认为是有效的

### 关于 "Cannot assign requested address" 错误的原因 当遇到 `Cannot assign requested address` 的错误时,通常意味着尝试绑定到指定 IP 地址的操作失败。这可能是由于以下几个原因之一: - **IP地址不可达**:如果指定了一个不存在或当前设备无法访问的本地IP地址进行绑定操作,则会触发这个错误[^1]。 - **资源冲突**:另一个进程可能已经占用了相同的端口号并绑定了同样的IP地址,导致新的连接请求被拒绝。 - **配置不当**:某些情况下,应用程序可能会因为错误地设置了监听参数而导致此类问题的发生。例如,在Mosquitto 配置中,将不必要的额外IP附加到了监听器后面可能导致这个问题[^3]。 - **网络接口绑定误解**:对于像Redis这样的服务来说,bind选项指的是要使用的网络接口而非客户端发出请求所来自的位置。因此,如果试图让服务器仅响应特定子网内的客户机查询,那么应当确保所提供的是一个有效的内部网络适配器名称或者是其对应的静态IPv4/IPv6数值形式之一[^4]。 ### 解决方案概述 针对上述提到的各种情况,下面列出了相应的处理措施来解决问题: #### 检查和验证目标主机上的可用性 确认用于创建套接字对象的目标机器确实拥有该IP地址,并且它处于活动状态。可以通过命令行工具如`ifconfig`(Linux/macOS) 或者 `ipconfig`(Windows) 来获取有关本机所有活跃网络接口的信息列表及其关联属性。 #### 排除其他占用相同端口的服务程序干扰 通过操作系统自带的任务管理功能或者第三方软件辅助排查是否有重复使用同一端口的应用正在运行当中。必要的话终止这些竞争性的实例以便释放所需的通信通道供新建立的链接独享。 #### 审核应用层设定项准确性 仔细审查涉及网络交互部分的相关文档说明以及官方指导方针,特别是那些涉及到如何正确设置监听条件的部分。比如去掉多余的IP定义只保留必要的端口信息就可以有效规避因多余参数引起的异常状况发生。 #### 正确理解并调整绑定策略 了解清楚待部署平台下各个版本间可能存在差异的地方,尤其是关于哪些地方允许通配符(*)代替具体值的规定。另外还要注意区分内网与公网环境之间的区别对待方式——前者可以选择较为宽松的安全模式(如设为0.0.0.0),后者则建议采取更严格的限定手段以增强安全性[^5]。 ```bash # Linux/MacOS 下查看网络接口详情 ifconfig # Windows 下查看网络接口详情 ipconfig ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值