16. TCP 연결 종료(4-way), TIME_WAIT/CLOSE_WAIT, SO_REUSEADDR/REUSEPORT, 포트 고갈

난이도 중 해설 보기 →
문제

문제 16 — TCP 연결 종료(4-way), TIME_WAIT/CLOSE_WAIT, SO_REUSEADDR/REUSEPORT, 포트 고갈

게임 서버는 접속·재접속·짧은 API 호출로 TCP 연결을 끊임없이 맺고 끊는다. 연결 종료 처리와 소켓 상태를 이해하지 못하면 "서버 재시작 시 bind 실패", "포트 고갈로 신규 연결 불가", "CLOSE_WAIT 소켓 누적" 같은 운영 사고가 난다. 다음을 설명하라.

  1. 4-way handshake: TCP 연결 종료 절차(FIN/ACK 교환)를 단계별로 설명하라. close()shutdown() 의 차이, half-close 가 무엇인지 함께 설명하라.

  2. TIME_WAIT: 어느 쪽(능동적으로 닫은 쪽/수동적으로 닫힌 쪽)이 TIME_WAIT 에 들어가는가? TIME_WAIT 은 왜 존재하며(두 가지 이유), 왜 대략 2×MSL 동안 유지되는가? 서버가 능동적으로 닫을 때와 클라이언트가 능동적으로 닫을 때, TIME_WAIT 부담이 어디에 쌓이는지 비교하라.

  3. CLOSE_WAIT: CLOSE_WAIT 상태가 서버에 대량으로 쌓였다면 무엇을 의심해야 하는가? TIME_WAIT 누적과 원인이 어떻게 다른가?

  4. 포트 고갈: 짧은 연결을 대량으로 맺는 클라이언트(또는 서버-서버 호출)에서 TIME_WAIT 과 에페메랄 포트(ephemeral port) 고갈이 어떻게 연결되는가? 완화책을 세 가지 이상 제시하라.

  5. SO_REUSEADDR vs SO_REUSEPORT: 두 옵션은 각각 무엇을 해결하는가? "서버를 재시작했더니 bind: Address already in use" 가 나는 이유와 SO_REUSEADDR 로 어떻게 해결되는지, SO_REUSEPORT 로 멀티 프로세스/스레드가 같은 포트를 어떻게 나눠 받는지 설명하라.

답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.