我的服务器程序正在运行,我正在尝试从redis客户端建立一些TCP连接。
我正在尝试建立1150个客户端连接,当我在服务器端检查netstat时,我发现有一些“已建立的”状态,其中我不理解破折号(-)的原因,省略了程序名。
客户端的
[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个连接,即作为状态(带有程序名)的“已建立的31535/重新访问”,而其他连接应该被丢弃。如果有与国家“建立”的联系,那么为什么没有程序名称附加到它?
发布于 2017-08-22 08:48:30
由于您使用的是根帐户,所以您可以看到所有用户的所有进程,因此-表明连接由内核处理。
为了处理连接,必须使用套接字描述符和待定参数调用listen()函数。根据man listen的说法:
backlog参数定义了sockfd的挂起连接队列可能增长到的最大长度。如果连接请求在队列已满时到达,则客户端可能会收到一个带有ECONNREFUSED指示的错误,或者,如果底层协议支持重传,则该请求可能被忽略,以便以后重新尝试连接成功。在Linux2.2中,TCP套接字上的待定参数的行为发生了变化。现在,它指定了等待被接受的完全建立的套接字的队列长度,而不是不完全连接请求的数量。
编辑:
传入的TCP连接由内核(TCP握手)处理,这就是为什么您将连接视为已建立的。当内核建立TCP连接时,当它等待程序被接受时,连接被添加到队列中。待办事项处理指示队列的大小,而不是连接的最大数量。
因此netstat中的“-”标志表示客户端请求连接到您的服务器,内核处理TCP握手并将连接添加到队列中,但是连接尚未被服务器接受。
EDIT2:
查看这网站。有一个很酷的流程图,描绘了整个过程。
https://unix.stackexchange.com/questions/387574
复制相似问题