연결보다 중요한 것은 종료다 — TCP 4-way handshake가 중요한 이유
TCP/IP 통신을 이야기할 때 우리는 보통 3-way handshake를 통해 연결의 신뢰성을 확보하는 과정에 집중한다. 하지만 실제 서비스 환경에서는 연결보다 더 중요한 것이 있다. 바로 연결을 어떻게 종료하고 자원을 회수하느냐다.
TCP 연결은 단순한 데이터 통신을 넘어, 소켓, 버퍼, 커널 리소스 등 다양한 시스템 자원을 점유하는 상태를 의미한다. 따라서 연결이 제대로 종료되지 않으면 해당 자원은 해제되지 않고 남게 되며, 이는 시스템 안정성에 영향을 줄 수 있다. 특히 클라이언트 프로그램과 서버 프로그램을 모두 제작해야 하는 경우 좀비커넥션과 같은 예기치 못한 상황에 마주칠 수 있다.
TCP는 연결 종료 시 4-way handshake 과정을 거친다.
- 한쪽에서 FIN 패킷을 보내며 연결 종료를 요청하고
- 상대방은 이를 ACK로 확인한다
- 이후 상대방도 종료 준비가 되면 FIN을 보내고
- 마지막으로 ACK를 주고받으며 연결이 완전히 종료된다
이 과정은 단순히 연결을 끊는 것이 아니라, 양쪽이 각각 안전하게 자원을 정리할 수 있도록 보장하는 절차다. 이론적으로는 모든 연결이 정상적으로 종료되지만, 실제 환경에서는 그렇지 않은 경우가 자주 발생한다.
예를 들어,
- 클라이언트 혹은 서버가 비정상적으로 종료되는 경우
- 네트워크 단절로 FIN 패킷이 전달되지 않는 경우
- 장비 전원이 갑작스럽게 차단되는 경우
이러한 상황에서는 4-way handshake가 정상적으로 수행되지 않고, 일부 연결이 완전히 종료되지 않은 상태로 남게 될 수 있다. 이때 프로세스 입장에서는 해당 연결이 아직 살아있다고 판단하게 되고, 불필요한 자원이 계속 점유되는 문제가 발생한다.
이러한 연결이 누적되면 다음과 같은 문제가 발생할 수 있다.
- 소켓 자원 고갈
- 새로운 연결 처리 지연
- 전체 시스템 성능 저하
특히 다수의 연결을 지속적으로 처리해야 하는 환경에서는 이 문제가 서비스 안정성에 직접적인 영향을 줄 수 있다. 이러한 이유로 실제 서비스에서는 TCP의 기본 동작에만 의존하지 않고 추가적인 제어를 함께 고려한다.
대표적으로 다음과 같은 방식들이 사용된다.
- Read Timeout 설정을 통한 비정상 연결 정리
- Keep-Alive를 통한 연결 상태 확인
- 애플리케이션 레벨에서의 Heartbeat 관리
즉, 연결을 맺는 것만큼이나 종료를 관리하는 설계가 중요하다.
TCP/IP 통신에서 중요한 것은 단순히 연결을 잘 맺는 것이 아니라, 연결의 시작부터 종료까지 전체 생명주기를 안정적으로 관리하는 것이다. 특히 4-way handshake는 그 과정의 마지막 단계이자, 시스템 자원을 온전히 회수하기 위한 핵심 절차다.
결국 안정적인 시스템은 빠른 연결이 아니라, 정상적으로 종료되는 연결 위에서 만들어진다.
ybson