listen 函数中 backlog 过小会如何

半连接队列和全连接队列

在 socket 编程中, 服务器通过 listen 函数进行监听: 

#include<sys/socket.h>
int listen(int sockfd, int backlog)

这个 backlog 的作用时什么呢?这就涉及到 TCP 的细节了。

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个称为半连接队列的队列之中。

另外还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中,如果队列满了就有可能会出现丢包现象。

 

 

 半连接队列的长度为 max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog), 全连接队列的长度为 min(backlog, /proc/sys/net/core/somaxconn)


 

 

可能遇到的问题

首先我将 listen 函数中的 backlog 设为 5, 并运行这个 web 服务器。

使用 netstat 命令查看网络中 socket 的状态,初始服务器处于监听时的状态:

现在使用 webbench 进行 C10K 测试,在测试的过程中,发现有很多连接处于 SYN_SENT 状态,也就是位于半连接队列。

最后通过 netstat -s | grep overflowed 查看全连接队列的溢出情况,可以发现有不少连接被丢弃了。

 

posted @ 2022-03-25 14:49  Kayden_Cheung  阅读(130)  评论(0编辑  收藏  举报
//目录