Cannot assign requested address问题总结

java.net.ConnectException:Cannotassignrequestedaddress的异常。通过查找资料、分析后,认为是由于程序对外建立新连接,结果本地端口已经用完导致的异常。 为什么会出现这种情况呢?就要从linux的TCP/IP协议栈说起了。 先看一下TCP/IP的状态图:

主动关闭连接的一方,连接会处在TIME-WAIT的状态下,需要等2MSL时间后,系统才会回收这条连接,端口才可以继续被使用。

解决方案

1.调整linux内核参数

linux内核中存在两个参数:
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

在/etc/sysctl.conf文件中加入上述参数,然后执行/sbin/sysctl -p让参数生效。

2.修改TCP短连接为长连接

出现这种问题,归根到底还是因为需要频繁创建大量的连接。那么,可不可以修改一种方式避免,避免频繁创建大量的TCP短连接。这需要根据项目的具体原因进行评估。

原文

http://www.pianshen.com/article/7307223765/

你可能感兴趣的:(Cannot assign requested address问题总结)