특정 포트에서 몇 개의 프로세스가 수신 대기할 수 있습니까?

특정 포트에서 몇 개의 프로세스가 수신 대기할 수 있습니까?

특정 포트(예: 80)에서 몇 개의 프로세스가 수신 대기할 수 있습니까? 동일한 포트에서 수신 대기하는 일부 응용 프로그램의 하위 프로세스를 어떻게 가질 수 있습니까? 포트에서 청취하는 것과 청취 연결을 설정하는 것 사이에 차이가 있습니까?

답변1

Q: 특정 포트에서 몇 개의 프로세스가 수신 대기할 수 있습니까?

답변: 최대한 많이 생성하세요.

SOCK_STREAM그러나 적어도 소켓의 경우 이 SO_REUSEPORT옵션(Linux 3.9의 새로운 기능)을 사용하지 않으면 프로세스는 소켓을 로컬 끝점(TCP 주소+포트, Unix의 파일 이름...)(또는 다음이 있는 수신 포트)에 바인딩할 수 없습니다. 해당 포트의 와일드카드 주소).

따라서 SO_REUSEPORT를 사용하지 않는 한, 동일한 포트에서 다른 프로세스를 수신 대기하는 유일한 방법은 해당 파일 설명자가 동일한 포트를 가리키도록 하는 것입니다.파일 설명 열기(동일한 소켓에).

fork()이는 프로세스를 생성할 때 자동으로 발생합니다. fd 3이 와일드카드 주소와 포트 12345의 수신 TCP 소켓을 가리키는 경우 포크 이후의 두 프로세스 모두 해당 fd의 해당 포트에서 수신 대기합니다( zsh구문은 다음과 같습니다).

$ zmodload zsh/net/tcp
$ ztcp -ld 3 12345
$ sleep 10 &
$ lsof -ni tcp:12345
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zsh     26277 stephane    3u  IPv4 506354      0t0  TCP *:12345 (LISTEN)
sleep   26988 stephane    3u  IPv4 506354      0t0  TCP *:12345 (LISTEN)

관련되지 않은 프로세스의 경우 프로세스가 해당 청취 소켓에 액세스하는 유일한 방법(내가 아는 한)은 다음을 사용하는 것입니다.SCM_RIGHT기구fds를 전달합니다(실제로는파일 설명 열기) Unix 도메인 소켓을 사용하는 프로세스 간.

listen()매개변수 중 하나 는 다음과 같습니다 .백로그.

주어진 끝점에서 수신 대기하는 소켓이 있으면 커널은 해당 끝점으로 들어오는 연결을 수락하기 시작합니다(accept백로그는 애플리케이션에서 아직 편집하지 않은 내용을 커널이 얼마나 받아들일 수 있는지 알려주는 힌트입니다.).

accept()그런 다음 청취 소켓(또는 이를 갖고 있는 청취 소켓)을 가리키는 fd에서 작동하는 첫 번째 프로세스가 SO_REUSEPORT들어오는 연결을 얻습니다. accept()새로운 소켓을 생성하고 소켓에 새로운 fd를 반환합니다 socket. 그러면 fd가 복사될 수 있고(새 fd가 동일한 소켓을 가리킴) 하위 프로세스가 fd를 상속합니다.연결됨마치 청취자들에게 하는 것처럼 말이죠.

답변2

이 답변에서는 IPv4를 통한 TCP에 대해 설명합니다.

하나의 프로세스만 가능듣다새로운 연결을 위해. 여러 프로세스가 동일한 포트를 요청하려고 하면 "이미 사용된 주소" 오류가 발생합니다.

이는 해당 포트를 적극적으로 사용하는 프로세스 수와는 완전히 다릅니다.

다음 출력을 살펴보세요.

remote          local        state
*:*           - 4.3.2.1:5000 LISTENING
1.2.3.4:12345 - 4.3.2.1:5000 CONNECTED
4.5.6.7:83247 - 4.3.2.1:5000 CONNECTED

필요한 유일한 것은 4-tuple 입니다 (remote-ip, remote-port, local-ip, local-port). (remote-ip, remote-port)LISTENING 상태이므로 하나 *:*의 프로세스만 Listen할 수 있습니다.

수신 응용 프로그램은 들어오는 각 연결에서 새 스레드/작업/프로세스를 시작합니다.

관련 정보