왜 사용한 client socket을 재사용하지 않을까? 비효율적이라고 생각했는데 합리적인 이유가 있을까? 하는 생각에 정보를 찾아보았다.
Q. 연결하고 싶은 host의 ip주소가 여러개일 때 매번 client 소켓을 생성하고 connection을 시도하다가 실패하면 client 소켓을 닫고 새로 생성해서 쓰던데 왜그래?
하나의 클라이언트 소켓을 여러 호스트의 IP 주소로 연결 시도하는 것은 가능하지만, 실패 시마다 소켓을 닫고 다시 생성하는 접근 방식은 일반적으로 효율적이지 않을 수 있습니다. 그러나 이렇게 처리하는 이유는 다음과 같을 수 있습니다:
- IP 주소 간의 실패 독립성: 각 IP 주소로의 연결 시도는 독립적입니다. 하나의 IP 주소로의 연결 시도가 실패해도 다른 IP 주소로의 연결 시도는 영향을 받지 않습니다. 따라서 다양한 호스트의 IP 주소로 연결을 시도하면 연결을 시도하는 동안 대기 시간이 줄어들 수 있습니다.
- 재시도 및 장애 복구: 한 호스트에 대한 연결 시도가 실패하면 다른 IP 주소로의 연결 시도를 시도함으로써 재시도 및 장애 복구를 지원할 수 있습니다. 이렇게 하면 서비스 가용성을 높일 수 있습니다.
- 다중 경로와 부하 분산: 여러 호스트의 IP 주소를 사용하여 서비스에 연결하면 다중 경로 및 부하 분산을 구현할 수 있습니다. 여러 호스트에 대한 연결을 분산하고 균형을 맞춤으로써 서비스의 성능을 향상시킬 수 있습니다.
그러나 매번 소켓을 생성하고 연결을 시도하고 실패한 후에 소켓을 닫는 것은 성능에 부담을 줄 수 있습니다. 소켓 생성 및 제거는 비용이 비교적 높을 수 있으며, 연결 시도 중에도 다른 리소스를 사용할 수 있으므로, 네트워크 연결 관리에 있어서 더 효율적인 방법을 고려하는 것이 중요합니다. 이러한 효율적인 방법 중 하나는 실패한 연결을 재시도하는 것입니다. 이를 통해 소켓 생성 및 제거 비용을 절감하고 연결 시도를 효과적으로 관리할 수 있습니다.
소켓연결에 실패했을 때 어떤일이 발생하나요?
https://www.google.com/search?q=what+happened+if+c+socket+connect+failed&sourceid=chrome&ie=UTF-8
왜 0.0.0.0:80 과 192.168.1.1:80에 대한 소켓을 동시에 열 수 없나요?
https://stackoverflow.com/questions/17307779/why-cant-bind-to-0-0-0-080-and-192-168-1-180-simultaneously?noredirect=1&lq=1
SO_REUSEADDR과 SO_REUSEPORT는 어떻게 다른가요?
https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ/14388707#14388707
chatGPT
하나의 클라이언트 소켓으로 여러 호스트에 연결 요청을 하는 것은 특정 상황에서는 문제가 발생할 수 있습니다. 이러한 상황 및 이유는 다음과 같습니다:
- 포트 충돌: 클라이언트 소켓은 로컬 포트와 원격 호스트의 IP 주소 및 포트로 식별됩니다. 하나의 클라이언트 소켓을 사용하여 여러 호스트에 연결을 시도하면, 동일한 로컬 포트에서 여러 연결이 시도되어 포트 충돌이 발생할 수 있습니다. 이로 인해 연결이 중단되거나 예기치 않은 동작이 발생할 수 있습니다.
- 연결 관리 및 유지: 여러 호스트에 연결 요청을 한 경우, 각 호스트와의 연결을 관리하고 유지하는 것이 복잡해집니다. 클라이언트 소켓은 각 연결을 추적하고 필요한 경우 연결을 종료하거나 다시 연결해야 합니다. 이는 코드 복잡성을 증가시키고 버그 및 예외 상황을 유발할 수 있습니다.
- 보안 및 인증: 다른 호스트와의 연결은 종종 인증 및 보안 검증을 필요로 합니다. 동일한 클라이언트 소켓을 사용하여 여러 호스트에 연결할 경우, 각 호스트에 대한 인증 및 보안 검증을 처리해야 하며, 이는 보안 결함을 초래할 수 있습니다.
- 성능 저하: 여러 호스트에 연결을 시도하면 클라이언트 소켓이 여러 연결을 관리하고 데이터를 교환해야 합니다. 이로 인해 네트워크 및 컴퓨팅 리소스의 소모가 증가할 수 있으며, 성능 저하를 초래할 수 있습니다.
따라서 일반적으로는 하나의 클라이언트 소켓을 하나의 호스트와의 연결에 사용하는 것이 좋습니다. 여러 호스트와 통신해야 하는 경우, 각 호스트에 대해 별도의 클라이언트 소켓을 생성하고 관리하는 것이 더 안전하고 효율적일 수 있습니다.
물론 if 조건문에 의해서 하나의 연결이 생성되는 순간 더이상 connect시도를 하지 않을 것이다.
그럼에도 명시적으로 각 소켓에 연결 하나만 이루어지도록 하는게 더 좋은 선택이라고 받아들였다.