[sockets] 두 응용 프로그램이 같은 포트를 수신 할 수 있습니까?

동일한 컴퓨터의 두 응용 프로그램이 동일한 포트 및 IP 주소에 바인딩 될 수 있습니까? 한 걸음 더 나아가서 하나의 앱이 특정 IP의 요청과 다른 원격 IP의 요청을들을 수 있습니까? 두 개의 스레드 (또는 포크)로 시작하여 비슷한 동작을하는 하나의 응용 프로그램을 가질 수 있지만 공통점이없는 두 응용 프로그램은 동일하게 작동 할 수 있습니까?



답변

대답은 고려중인 OS에 따라 다릅니다. 그러나 일반적으로 :

TCP의 경우 아니요. 한 번에 하나의 응용 프로그램 만 동일한 포트에서 청취 할 수 있습니다. 이제 2 개의 네트워크 카드가있는 경우 동일한 포트 번호를 사용하여 하나의 응용 프로그램이 첫 번째 IP에서 수신하고 두 번째 IP에서 두 번째 IP를 수신하도록 할 수 있습니다.

UDP (멀티 캐스트)의 경우 여러 응용 프로그램이 동일한 포트를 구독 할 수 있습니다.

편집 : Linux Kernel 3.9 이상부터 동일한 포트를 수신하는 여러 응용 프로그램에 대한 지원이 SO_REUSEPORT옵션을 사용하여 추가되었습니다 . 자세한 내용은 이 lwn.net 기사를 참조하십시오.


답변

예 (TCP의 경우) 프로그램이 그렇게 설계된 경우 두 개의 프로그램이 동일한 소켓에서 청취하도록 할 수 있습니다. 첫 번째 프로그램에서 소켓을 작성할 때 SO_REUSEADDR옵션을 소켓에 설정해야합니다 bind(). 그러나 이것은 당신이 원하는 것이 아닐 수도 있습니다. 이것이하는 일은 들어오는 TCP 연결이 둘 중 하나 가 아닌 프로그램 중 하나 에 전달되므로 연결을 복제하지 않고 두 프로그램이 들어오는 요청을 처리 할 수있게하는 것입니다. 예를 들어, 웹 서버에는 포트 80에서 수신 대기하는 여러 프로세스가 있으며 O / S는 새 연결을 수락 할 준비가 된 프로세스에 새 연결을 보냅니다.

SO_REUSEADDR

bind()활성 청취 소켓이 이미 포트에 바인드되어 있지 않으면 다른 소켓을 이 포트에 연결할 수 있습니다. 그러면 충돌 후 서버를 다시 시작하려고 할 때 “이미 사용중인 주소”오류 메시지가 표시됩니다.


답변

예.

  1. 모두 동일한 포트에 바인딩 된 여러 수신 TCP 소켓이 서로 다른 로컬 IP 주소에 바인딩되어 있으면 공존 할 수 있습니다. 클라이언트는 필요한 어느 쪽이든 연결할 수 있습니다. 제외0.0.0.0( INADDR_ANY)는 .

  2. 여러 개의 승인 된 소켓이 공존 할 수 있으며 모두 동일한 청취 소켓에서 승인되며 모두 청취 소켓과 동일한 로컬 포트 ​​번호를 표시합니다.

  3. 동일한 포트에 바인드 된 여러 UDP 소켓은 모두 (1)과 동일한 조건으로 제공되거나 모두 SO_REUSEADDR바인딩 전에 옵션이 설정되어 있습니다.

  4. TCP 포트와 UDP 포트는 서로 다른 네임 스페이스를 차지하므로 TCP에 포트를 사용한다고해서 UDP에 대한 사용을 배제하지 않으며 그 반대도 마찬가지입니다.

참조 : Stevens & Wright, TCP / IP Illustrated, Volume II.


답변

원칙적으로

그것은 돌로 쓰여지지 않았습니다. 그러나 모든 API가 작성되는 방식입니다. 앱이 포트를 열고 핸들을 가져오고 클라이언트 연결 (또는 UDP 경우 패킷)이 도착하면 OS는 해당 핸들을 통해 포트에 알립니다.

OS에서 두 개의 앱이 같은 포트를 열도록 허용 한 경우 어떤 앱에 알릴 수 있습니까?

그러나 … 그 주위에는 방법이 있습니다.

  1. Jed가 지적했듯이 클라이언트 요청을 분리하려는 논리를 사용하여 실제로 포트에서 수신하고 다른 사람에게 알리는 유일한 프로세스 인 ‘마스터’프로세스를 작성할 수 있습니다.
    • Linux 및 BSD에서 (적어도) 네트워크 관련 기준 (원산지 네트워크 또는 간단한 형태의로드 밸런싱).

답변

그렇습니다 . 내가 기억하는 한 커널 버전 3.9 (버전에 대해서는 확실하지 않음)부터에 대한 지원 SO_REUSEPORT이 도입되었습니다.SO_RESUEPORT첫 번째 서버가 소켓을 바인딩하기 전에이 옵션을 설정하는 한 정확히 동일한 포트 및 주소에 바인딩 할 수 있습니다.

TCPUDP 모두에서 작동합니다 . 자세한 내용은 링크를 참조하십시오 : SO_REUSEPORT

노트 : 수락 된 답변은 더 이상 내 의견으로는 사실이 아닙니다.


답변

아니오. 한 번에 하나의 응용 프로그램 만 포트에 바인드 할 수 있으며 바인드가 강제 실행되는 경우의 동작은 미정입니다.

SO_REUSEADDR이 각 소켓의 옵션에 설정되어있는 한 멀티 캐스트 소켓 (원하는 곳에서 아무 소리도 들리지 않음)을 사용하면 둘 이상의 응용 프로그램이 포트에 바인딩 될 수 있습니다.

“마스터”프로세스를 작성하여 모든 연결을 수락하고 처리 한 다음 동일한 포트에서 수신 대기해야하는 두 응용 프로그램에 연결하여이 작업을 수행 할 수 있습니다. 많은 프로세스가 80을 수신해야하기 때문에 이것이 웹 서버 및 이와 같은 접근 방식입니다.

이 외에도, 우리는 세부 사항을 얻고 있습니다-TCP와 UDP 모두에 태그를 지정했습니다. 또한 어떤 플랫폼입니까?


답변

하나의 응용 프로그램이 하나의 포트에서 하나의 네트워크 인터페이스를 수신하도록 할 수 있습니다. 따라서 다음을 수행 할 수 있습니다.

  1. httpd 원격으로 액세스 가능한 인터페이스에서 청취 192.168.1.1:80
  2. 다른 데몬 청취 127.0.0.1:80

샘플 사용 사례 httpd는로드 밸런서 또는 프록시 로 사용할 수 있습니다 .