自连接
1. 如何实验出现这个现象
创建python 脚本 self_connect.py
#!/usr/bin/python
import errno
import socket
import sys
import time
if len(sys.argv) < 2:
print "must input port."
print "port should in net.ipv4.ip_local_port_range"
exit()
port = int(sys.argv[1])
for i in range(65536):
try:
sock = socket.create_connection(("127.0.0.1", port))
print "connected", sock.getsockname(), sock.getpeername()
time.sleep(60*60) # to netstat port
except socket.error, e:
if e.errno != errno.ECONNREFUSED:
print e.errno, errno.ECONNREFUSED
break
执行该脚本,可以看到结果为:
从截图可以看到,同一ip下的同一端口,相互连接。
这不是内核bug
2. 原因
2.1 连接的时候,没有指定本地端口(local port),Linux系统会在 net.ipv4.ip_local_port_range 指定的端口范围内分配一个未被占用的端口。比如选择了端口N,如果N端口拒绝连接,就会发送包含RST标志的TCP报文段,本地
2.2 TCP协议支持同时打开