linux - 我对积压的监听系统调用和套接字编程中的连接数的理解是否正确?

标签 linux sockets webserver

<分区>

  1. 每个连接 - 服务器(唯一的 IP 地址 + 主机号)+ 客户端。这是一个独特的连接组合。
  2. 可以根据操作系统支持的文件描述符的数量来建立此类组合。例如,我的机器有以下限制-

    cat/proc/sys/fs/文件最大 380594

  3. 当我们说 listen(sock_fd, 5);这里的5表示不会被拒绝连接的连接数。事实上,它们将被置于挂起状态。在这里,我们假设所有的 fd 都用于套接字连接。然后第 389595 到第 389599 个连接将进入挂起状态。这将在 fd 可用后处理。我的看法正确吗?

最佳答案

不完全是。

关于 (1),我不知道你所说的“主机号”是什么意思。客户端可以有两个到给定服务器的连接,只是源端口不同。因此,要唯一标识一个连接,您需要客户端 IP 和端口号二元组(对),以及服务器 IP 和端口号二元组。

关于 (2),这里有几个限制。每个打开的连接都需要一个文件描述符,但生活并不是那么简单。例如,TIME_WAIT 中的连接可能已经关闭了它们的文件描述符,但从操作系统的角度来看仍然是一个“连接”,因为它们恰好与杂散连接数据包相关联。此外,文件数量可能有一个总体限制,但还会有其他限制。例如,每个进程打开的 fds 的数量是有限制的(参见 getrlimit)。这个问题之前已经被问过好几次了——见 What is the theoretical maximum number of open TCP connections that a modern Linux box can haveIncreasing the maximum number of tcp/ip connections in linux

关于 (3),不,积压工作不像处于监听状态的每个套接字那样工作。积压数表示监听套接字将确认尚未被接受的 TCP 连接的最大数量。当新的 TCP 连接尝试连接到给定的监听套接字时,操作系统必须排队等待该挂起连接的存在,直到使用 accept 将其转移到新的套接字(以处理特定连接)。积压数量只是该队列的最大深度。这与 file-max 无关,除非系统上的每个 FD 都被监听单个套接字的单个进程使用(这种情况不太可能发生)。

关于linux - 我对积压的监听系统调用和套接字编程中的连接数的理解是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21656473/

相关文章:

apache - 何时使用 Apache 与 Apache+Tomcat?

linux - 强制 ELF 二进制文件使用另一个 libc.so

java - 在java中通过UDP传输文件

C# 服务器 - TCP/IP 套接字效率

php - 地址为 ' www' 的网站无法正常工作

websocket - Web 服务器可以维护多少个 SSE 连接?

linux - ubuntu awk 如何获取最后一个用户和时间数据?

Linux PDF/Postscript 优化

r - 是否不可能在 Ubuntu 18.04.4 LTS 上安装 R 4.0,因为 r-base-core 需要 libc6 版本 >= 2.29?

c++ - QTcpSocket真的是全双工吗?