在客户端:

在客户端:

我的服务器程序正在运行,我正在尝试从 Redis 客户端建立一些 TCP 连接。

我正在尝试建立1150个客户端连接,当我在服务器端检查netstat时,我发现一些“ESTABLISHED -”状态,我不明白破折号(-)的原因,省略了程序名称。

在客户端:

[root@smarak-2storage-testvnf-vm0 src]# ulimit -n
4096
[root@smarak-2storage-testvnf-vm0 src]# ./redis-benchmark -h 10.111.89.230 -p 6379 -c 1150 -t set -n 20000 -d 10000 -r 100000000000000 -I

在服务器端:

[root@sdl-blr-vm-1-14 src]# ulimit -n
1024
[root@sdl-blr-vm-1-14 src]# netstat -anp | grep -i 6379
tcp      129      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      31535/respAccess
tcp        0      0 10.111.89.230:6379      10.111.89.112:34276     ESTABLISHED 31535/respAccess
tcp        0      0 10.111.89.230:6379      10.111.89.112:35048     ESTABLISHED -
tcp        0      0 10.111.89.230:6379      10.111.89.112:34614     ESTABLISHED 31535/respAccess
tcp        0      0 10.111.89.230:6379      10.111.89.112:34234     ESTABLISHED 31535/respAccess
tcp        0      0 10.111.89.230:6379      10.111.89.112:34984     ESTABLISHED 31535/respAccess
tcp        0      0 10.111.89.230:6379      10.111.89.112:34441     ESTABLISHED -
tcp        0      0 10.111.89.230:6379      10.111.89.112:34441     ESTABLISHED -
tcp        0      0 10.111.89.230:6379      10.111.89.112:34441     ESTABLISHED 
-

为什么我会得到这个ESTABLISHED -输出?我认为服务器端有 1024 个文件描述符,因此当从客户端发起 1150 个连接时,只应建立 1024 个连接,即“ESTABLISHED 31535/respAccess”作为状态(带有程序名称),其他连接应被丢弃。如果存在状态为“ESTABLISHED”的连接,那么为什么没有附加程序名称?

答案1

由于您使用的是 root 帐户,因此您可以看到所有用户的所有进程,因此 - 表示连接由内核处理。

为了处理连接,您必须listen()使用套接字描述符和积压参数调用函数。根据man listen

backlog 参数定义 sockfd 的挂起连接队列可以增长的最大长度。如果连接请求在队列已满时到达,则客户端可能会收到带有 ECONNREFUSED 指示的错误,或者如果底层协议支持重传,则可能会忽略该请求,以便稍后重新尝试连接成功。

Linux 2.2 中 TCP 套接字上的 backlog 参数的行为发生了变化。现在它指定队列长度完全地 已建立的套接字等待被接受,而不是不完整的连接请求数。

编辑:
传入的 TCP 连接由内核处理(TCP 握手),这就是为什么您会看到连接已建立。当内核建立TCP连接时,当等待程序被接受时,连接被添加到队列中。Backlog 表示队列的大小而不是最大连接数。

因此,netstat 中的“-”符号表示客户端请求连接到您的服务器,内核处理了 TCP 握手并将连接添加到队列中,但连接尚未被您的服务器接受。

编辑2:
查看网站。有一个很酷的流程图描述了整个过程。

相关内容