9

我在 Linux中编写了两对代码(server.c和)。client.c一个用于 UNIX-domainAF_UNIX另一个用于 INTERNET-domain AF_INET。两者都工作正常!

listen()调用积压队列长度 = 3 inboth servers

listen(sockfd, 3);  

在 UNIX 域(AF_UNIX)中: 当一个客户端与服务器连接时,如果我尝试将更多客户端连接到服务器。三个在队列中,第四个的请求被拒绝。(如我所愿 - 等待队列中的 3 个)。

在 INTERNET 域 (AF_INET) 中:超过三个的请求保留在待处理队列中。

为什么即使积压队列长度为 3,来自第四个客户端的请求也不会被拒绝?为什么listen()(和其他)协议的行为依赖于协议?

4

2 回答 2

11

操作系统实际上为传入的 TCP 连接使用了比指定的更大的队列listen()。多大取决于操作系统。

 listen(int socket_fd, int backlog)  

对于给定的侦听套接字,内核维护两个队列。

  1. 一个不完整的连接队列 - SYN 已经到来,但三次握手 (TCP) 没有完全完成。(SYN_RCV 状态)
  2. 一个完整的连接队列 - 三向握手完成。(已建立状态)

backlog参数历史上指定两个队列的总和。但是对于积压的含义没有正式的定义。

伯克利派生的实现为积压工作增加了一个软糖因素。所以总排队length = factor * backlog

W. Richard Stevens 在书中给出了非常详细和深入的解释。在 Stevens, Fenner, Rudoff, " Unix Network Programming: The Sockets Network API ", Volume 1, Third Edition, Page 108中还可以找到显示七个操作系统的值的表格。

于 2012-10-15T10:18:27.880 回答
4

平台有权根据其最小值和默认值向上或向下调整指定的积压。如今,默认值更像是 500 而不是 5,这是它在 1983 年左右开始的地方。你不能依赖它是你指定的,并且没有 API 可以找出它到底是什么,也没有明显的希望它比默认值短的有效应用程序原因。

于 2012-10-15T10:19:06.460 回答