我对backlog上的listen系统调用以及套接字编程中的连接数量的理解是正确的吗?

时间:2014-02-09 07:24:16

标签: linux sockets webserver

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

    cat / proc / sys / fs / file-max 380594

  3. 当我们说听(sock_fd,5);这里5表示不会被拒绝连接的连接数。事实上,他们将处于待决状态。在这里,我们假设所有fd都用于套接字连接。然后389595th到389599th连接将进入挂起状态。这将在fd可用后处理。我是否正确?

1 个答案:

答案 0 :(得分:1)

不完全。

Re(1),我不知道'主持人号'是什么意思。客户端可以有两个到给定服务器的连接,仅由源端口不同。因此,要唯一地标识连接,您需要客户端IP和端口号2元组(对),以及服务器IP和端口号2元组。

Re(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

Re(3),不,积压工作不像那样,因为它是一个监听状态下的每个插槽。积压号码表示侦听套接字将确认尚未被接受的最大TCP连接数。当新TCP连接尝试在给定侦听套接字上进行连接时,操作系统必须对该挂起连接的存在进行排队,直到使用accept将其传输到新套接字(以处理特定连接)。积压数字只是该队列的最大深度。这与file-max无关,除非系统上的每个FD都被单个进程上的单个进程使用(这是一个相当不太可能的情况)。