내 애플리케이션을 위한 포트를 어떻게 예약하나요?

내 애플리케이션을 위한 포트를 어떻게 예약하나요?

내 사용자 정의 애플리케이션에 대한 포트 목록을 어떻게 유지합니까?

구체적으로 제가 만들고 있는 제품에는 많은 프로세스와 프로세스 간의 커뮤니케이션이 많이 있습니다.

내가 겪고 있는 문제는 가끔씩 OS가 내 포트를 훔친다는 것입니다. 이런 일은 드물지만 실제로 발생합니다.

이는 포트를 지정하지 않고 "::bind"를 사용하는 다른 애플리케이션 때문일 수 있습니다.

또는 때로는 바인딩되지 않은 소켓을 사용하여 "::connect"를 호출할 때 내 응용 프로그램이 포트를 훔칩니다. 매뉴얼 페이지에서 다음을 볼 수 있습니다.

소켓이 아직 로컬 주소에 바인딩되지 않은 경우 connect()는 소켓을 사용되지 않은 로컬 주소에 바인딩해야 합니다(소켓의 주소 계열이 AF_UNIX가 아닌 경우).

그래서 내 질문은 OS가 해당 포트를 사용하지 않도록 필요한 포트를 예약할 수 있느냐는 것입니다. /etc/services를 통해 이 작업을 수행할 수 있습니까? 아니면 다른 접근법이 있습니까?

답변1

Linux의 서버에 사용하려고 하므로 커널이 49000 및 49001을 클라이언트에 전달하지 않는지 확인하십시오.

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

그것을 던지고 /etc/sysctl.conf실행하십시오 sysctl -p.

이는 테스트되지 않았음을 참고하세요.

인용하다

답변2

기술적으로 "예약된 포트"라는 것은 없습니다.

TCP/UDP에서 포트를 "예약"하는 유일한 방법은 실제로 bind()해당 포트에 대한 소켓을 설정하는 것입니다. 바인딩된 포트는 다른 응용 프로그램에서 사용되지 않습니다. 사용되지 않는 포트는 사용되지 않으므로 다른 응용 프로그램에서 자유롭게 사용할 수 있습니다.

서버 소프트웨어를 작성하는 경우 애플리케이션 코드에서 가능한 한 빨리 특정 포트에 소켓을 바인딩할 수 있습니다. 포트 번호를 구성 가능하게 만들거나 최소한 문서에 명확하게 명시하여 시스템 관리자가 신속하게 충돌을 식별하고 충돌하는 응용 프로그램을 별도의 서버로 이동할 수 있도록 하십시오.

답변3

사실 위 답변은 완전히 정확하지는 않습니다. sysctls net.inet.ip.portrange.first 및 net.inet.ip.portrange.last는 운영 체제가 임의 포트에 할당할 수 있는 포트 범위를 지정합니다. 애플리케이션의 예약된 포트 범위가 이러한 변수의 범위에 속하지 않는지 확인해야 합니다.

FreeBSD 매뉴얼의 다음 섹션을 살펴보십시오.12.14. 커널 제한 조정. 그러나 동일한 기본 전제가 Linux에도 적용되어야 합니다.

관련 정보