小心TCP重连时连上了自己-TCP的回环连接
刚才在测试一个服务器跟redis之间的连接自动重连机制时,碰到了个诡异的问题,epoll检测到了连接可用但程序总是不work,并且诡异的是redis被我停掉了,server竟然能够连接上来····
后来netstat -anp | grep 8379 查看了一下原来是server自己连接上了自己···
tcp 0 0 192.168.1.130:8379 192.168.1.130:8379 ESTABLISHED 24276/mosquitto
因为我把redis停掉以后,server会不断的大量重连redis,导致socket() 函数自动随机分配的端口号正好是本机的8379端口!然后socket()就真的把redis的8379端口给open了,然后server再去connect(8379) 的时候当然就能够成功了。
查了一下资料,具体介绍这里有:TCP Loop Connect .
解决办法是尽量别使用 本地的随机端口范围的端口: /proc/sys/net/ipv4/ip_local_port_range , 但实际似乎不可行。
目前我的解决办法是控制重连的频率,这样尽量避免悲剧,另外当然了,对端别用一个IP不就行了····
近期评论