내 서버 프로그램이 실행 중이고 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
루트 계정을 사용하고 있으므로 모든 사용자의 모든 프로세스를 볼 수 있으므로 - 연결이 커널에 의해 처리된다는 의미입니다.
연결을 처리하려면 listen()
소켓 설명자와 백로그 매개변수를 사용하여 함수를 호출해야 합니다. 에 따르면 man listen
:
backlog 매개변수는 sockfd의 보류 중인 연결 큐가 커질 수 있는 최대 길이를 정의합니다. 대기열이 가득 찼을 때 연결 요청이 도착하면 클라이언트는 ECONNREFUSED 표시와 함께 오류를 수신할 수 있습니다. 또는 기본 프로토콜이 재전송을 지원하는 경우 나중에 연결을 성공적으로 다시 시도할 수 있도록 요청이 무시될 수 있습니다.
Linux 2.2에서는 TCP 소켓의 backlog 매개변수 동작이 변경되었습니다. 이제 대기열 길이를 지정합니다.완전히 승인 대기 중인 소켓이 설정되었습니다., 불완전한 연결 요청 수가 아닙니다.
편집하다:
들어오는 TCP 연결은 커널(TCP 핸드셰이크)에 의해 처리되므로 연결이 설정된 것을 볼 수 있습니다. 커널이 TCP 연결을 설정하면 대기 중인 프로그램이 승인되는 동안 연결이 대기열에 추가됩니다.백로그는 최대 연결 수가 아닌 대기열의 크기를 나타냅니다.
따라서 netstat의 "-" 기호는 클라이언트가 서버에 대한 연결을 요청했고 커널이 TCP 핸드셰이크를 처리한 후 대기열에 연결을 추가했지만 서버에서 아직 연결을 수락하지 않았음을 의미합니다.
편집 2:
확인하다이것웹사이트. 전체 프로세스를 설명하는 멋진 순서도가 있습니다.