每个侦听端口可以接受的最大连接数?

时间:2019-11-18 02:26:37

标签: python linux sockets tcp connection

理论上,每个连接都是关于(src.ip, src.port, dst.ip, dst.port)的,因此,只有在有足够的客户端的情况下,每个侦听端口才能接受的连接数是无限的。

但是,我做了一个实验,结果与我预期的不一样。在连接数达到65520之后,无法建立更多连接,因为不是新连接的每个SYN段都被ACK段回复。我尝试从具有不同IP地址的另一台计算机建立连接,结果都是一样的。

有人知道出什么问题吗?造成限制的瓶颈是什么?

以下是服务器的一些相关配置:

  • 版本:Ubuntu 18.04.2 LTS
  • Python:3.6.7
  • CPU使用率:不到10%
  • 带宽使用率:不到10%
  • 内存使用率:不到10%
  • 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)

0 个答案:

没有答案