理论上,每个连接都是关于(src.ip, src.port, dst.ip, dst.port)
的,因此,只有在有足够的客户端的情况下,每个侦听端口才能接受的连接数是无限的。
但是,我做了一个实验,结果与我预期的不一样。在连接数达到65520之后,无法建立更多连接,因为不是新连接的每个SYN
段都被ACK
段回复。我尝试从具有不同IP地址的另一台计算机建立连接,结果都是一样的。
有人知道出什么问题吗?造成限制的瓶颈是什么?
以下是服务器的一些相关配置:
cat /proc/sys/fs/file-max
:197344 ulimit -n
:100000 这是我实验中python中的服务器代码:
import selectors
import socket
sel = selectors.DefaultSelector()
def accept(sock, mask):
conn, addr = sock.accept() # Should be ready
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read)
def read(conn, mask):
try:
data = conn.recv(1000) # Should be ready
if not data:
sel.unregister(conn)
conn.close()
except ConnectionResetError:
sel.unregister(conn)
conn.close()
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 8001))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)
while True:
events = sel.select()
for key, mask in events:
callback = key.data
callback(key.fileobj, mask)
print('current connections:', len(sel.get_map())-1)
以下是建立连接的客户端代码:
import socket
def build(host, port, number):
connections = []
for _ in range(number):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
connections.append(s)
return connections
c1 = build(host='homework', port=8001, number=10000)