TCPlisten()Backlog (积压队列长度)

Backlog 对服务器在一个套接字上接受新 TCP 连接的最大速率有影响。 该速率是 backlog 值和连接在部分打开连接队列中停留的时间的函数。

当建立 TCP 连接时,客户端和服务器执行三次握手,以确保连接是有效的。 当序列号已经在两个方向上交换和同步后,连接就建立好了。 序列号用于提供可靠的传输和流控制(即,确保任何一方的传输速度都不会超过另一方)。

图 3. 客户端/服务器连接图示

如图 3 所示,连接由监听套接字接收包含同步控制标志 (SYN) 和序列号的数据段来启动。 服务器端确认此消息并发送自己的序列号 (SYN|ACK)。 然后客户端确认此序列号 (ACK)。 一旦服务器进程收到确认并执行 accept() 系统调用,连接就建立好了。

影响接受新连接速率的持续时间是在挂起的传入连接队列上花费的时间。 此持续时间等于 SYN|ACK 消息及其 ACK 响应的往返时间,加上客户端处理 SYN|ACK 消息所花费的时间,再加上服务器处理 ACK 和调用 accept() 的延迟。

接受新连接的速率等于可以容纳在监听队列中的条目数量除以每个条目在队列中花费的平均时间长度。 因此,队列越大,接受新连接请求的速率就越高。

许多系统(特别是 BSD 衍生或受其影响的系统)会默默地截断此值(listen() 系统调用的 backlog 参数)为 5——Linux 内核 1.2.13 版本在 /usr/src/linux/net/inet/af_inet.c 中执行此操作。 在最近之前,使用较小的 listen backlog 值是许多操作系统中 Web 服务器性能不佳的主要原因之一。

在处理 Internet 应用程序时,您可以大概假设接受新连接的速率等于 listen backlog 除以客户端和服务器之间路径的往返时间。

backlog 参数在 /usr/src/linux/net/ipv4/af_inet.c 中被默默地截断为 SOMAXCONN。 对于 2.x 内核,SOMAXCONN 在 /usr/src/linux/socket.h 中定义为 128。

© . All rights reserved.