linux自连接

linux支持自连接,也就是同一个ip,同一个机器,自己起一个server、client互相连接。
例如使用命令:

1
nc localhost $port -p $port

对应TCP协议中的合法设定,同时打开:

误触可能

虽然这是linux的一个feature,但是我们平时遇到这种情况一般是因为bug,也就是误触。

一种可能:
进程1: listen端口A,然后挂掉,释放端口A;
进程2: 源端口A, 连接端口A。

触发bug条件

listen端口选择了net.ipv4.ip_local_port_range范围;

net.ipv4.ip_local_port_range范围里的端口是linux连接目标端口时,选择源端口的范围。可以通过修改/etc/sysctl.conf调整。(如果要调大connect并发度)

1
2
3
4
// 查看:
cat /proc/sys/net/ipv4/ip_local_port_range
// 生效:
sysctl -p /etc/sysctl.conf

因为connect使用的端口会从这个范围取,所以如果listen也用了这个范围,就很可能冲突,形成自连接。

并发度

内核3.2以前: 需保证源ip,源端口2元组不同,并发度更低; (随机选择端口)
内核3.2以后: 需保证源ip,源端口,目标ip,目标端口4元组不同即可,并发度更大; (顺序选择端口)

恶化bug条件

  1. 使用连接池,自连接无法释放;
  2. Linux内核>=3.10: 2.6是随机选择端口,3.10是顺序递增选择;

推荐文章