如果socket编程中的listen()调用有5或10的限制,那么webserver如何接受这么多连接?

时间:2014-02-11 05:20:47

标签: apache sockets webserver

我相信,像Apache这样的Webserver只使用套接字编程。在TCP连接中,我们需要调用listen(sock_fd,number_of_backlogs);此积压有一个限制,通常为两位数。我想知道Apache网络服务器如何建立数以百万计的网站连接。 listen()如何在那里工作?

3 个答案:

答案 0 :(得分:1)

number_of_backlogs不是总连接数,而是在用户空间进程通过调用accept来控制这些连接之前OS内核将建立的最大连接数。

listen定义了一种存储桶,操作系统将新连接放入其中。如果存储桶已满(例如,取决于要侦听的参数),则将拒绝新连接。使用accept(),用户空间应用程序(例如,Web服务器,邮件服务器......)将获取存储桶的一个连接 out 并处理它。这些会使已接受的连接保持打开状态,但会在存储桶中进行另一次连接。因此,即使存储桶仅具有50个空间,web服务器也可以处理1000个连接。实际上,number_of_backlogs仅定义用户空间进程必须查看存储桶以进行新连接的频率,例如,一段时间内进入的连接越多,它看起来越频繁,从桶中取出连接或桶应该越大。

答案 1 :(得分:1)

listen()中指定的值限制了等待服务器使用accept()接受的待处理客户端队列的大小。一旦客户端被接受,它就不再在积压队列中。积压不会影响可以同时连接到服务器的客户端数量,也不会影响在任何给定时刻尝试和等待连接的客户端数量。

答案 2 :(得分:0)

我将再次回答这个问题,再一次回答。

你有一个完全的误解,在几天的几个问题中都有表达。

listen() 的待办事项参数不是 可以同时存在的连接总数。

在应用程序中返回到accept() 之前,TCP级别的积压队列上可以存在的最大连接数。