大并发下socket通信连接时会导致TCP自连接

    今天是2015的第二天了, 心情有些不佳,遇到的狗屎问题更是心情不爽 !还好妈蛋的给解决了 !

    问题提示说大不大,说小不小的 ~    TCP的自连接就是client和server bind的端口碰上了 !导致出现连接的异常。

用python来模拟TCP自连接的现象。 

#coding:utf-8
import socket

connected=False
while (not connected):
        try:
                sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,1)
                sock.connect(('127.0.0.1',11111))
                connected=True
        except socket.error,(value,message):
                print message

        if not connected:
                print "reconnect"

结果:

[xiaorui@devops ~ ]netstat -an|grep 12345
tcp4       0      0  127.0.0.1.12345        127.0.0.1.12345        ESTABLISH
[xiaorui@devops ~ ]


其实以前预想过可能会出现这样的问题,但是也只是听过,没有碰到过。   还有就是以前对于本地化数据抽取的服务,都是放在分布式系统系统里,或者是放在另一个子进程用mmap,os.pipe进行数据传输。   前段时间为了统一化接口,还有就是应用层上有所作为,所以在socket上搞了数据来源识别的东西。那么问题来了,client和server端每秒钟要处理将近5000个数据,那么就很有可能遇见 源ip地址和端口,目的ip地址和端口一致的情况… …   

根据日志里面限制,每隔几分钟就有一个socket 连接的TCP自连接的异常。 

解决的有两种办法:

第一种是port的分配范围,第二种是把bind的端口给去除掉。 

$ cat /proc/sys/net/ipv4/ip_local_port_range
12346 61000

$ cat /proc/sys/net/ipv4/ip_local_reserved_ports
8080,12345






大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. xz 2016年1月19日 / 下午4:06

    博主,如果遇到自连接,server 需要咋处理呀

发表评论

邮箱地址不会被公开。 必填项已用*标注