-
TCP 3-Way HandshakeCS/네트워크 2026. 7. 24. 20:27
브라우저가 DNS 조회를 마치면 서버의 IP 주소를 알게 됩니다. 하지만 TCP를 사용하는 HTTP/1.1이나 HTTP/2 통신이라면 바로 HTTP 요청부터 보내지 않습니다. 먼저 클라이언트와 서버 사이에 TCP 연결을 만듭니다.
회선 교환, 가상 회선, TCP 연결은 어떻게 다를까?
회선 교환(Circuit Switching)은 통신 전에 종단 간 경로의 대역폭이나 시간 슬롯 같은 실제 네트워크 자원을 예약합니다. 과거 전화망이 대표적입니다. 반드시 한 가닥 선을 혼자 쓴다는 뜻은 아니지만, 통신 중 사용할 자원을 회선처럼 확보합니다.
가상 회선(Virtual Circuit)은 데이터를 패킷으로 보내면서도 먼저 논리적 경로를 설정합니다. 중간 스위치나 라우터는 회선 식별자와 다음 홉 같은 상태를 유지하고, 패킷은 설정된 논리적 경로를 따라갑니다.
방식 통신 전에 준비하는 것 중간 네트워크의 상태 회선 교환 대역폭·시간 슬롯 같은 실제 자원 통신이 끝날 때까지 전용 자원을 유지합니다. 가상 회선 패킷 교환 논리적 경로와 회선 식별자 중간 장비가 가상 회선별 전달 상태를 유지합니다. TCP 연결 순서 번호, 송수신 버퍼, 윈도우 같은 종단 상태 라우터는 TCP 연결 상태를 모르며 IP 데이터그램을 전달합니다. TCP는 애플리케이션에 두 종단 사이의 가상 회선처럼 보이는 서비스를 제공합니다. 하지만 네트워크 계층의 가상 회선처럼 라우터에 고정 경로를 설정하거나 대역폭을 예약하지는 않습니다. 정확히는 클라이언트와 서버의 TCP가 연결 상태를 유지하는 논리적 종단 간 연결입니다.
이 상태를 바탕으로 TCP는 바이트의 순서를 맞추고 ACK가 오지 않은 데이터를 재전송합니다. 다만 어떤 장애에서도 무조건 전달한다는 뜻은 아닙니다. 재전송으로 복구하지 못하면 연결은 Timeout이나 오류로 끝날 수 있습니다.
SYN, SYN-ACK, ACK는 무엇을 확인할까?
클라이언트의 초기 순서 번호를
x, 서버의 초기 순서 번호를y라고 해보겠습니다.단계 보내는 값 확인하는 내용 SYN클라이언트 → 서버 SEQ=x연결을 요청하고 클라이언트의 초기 순서 번호를 알립니다. SYN-ACK서버 → 클라이언트 SEQ=y, ACK=x+1클라이언트의 SYN을 확인하고 서버의 초기 순서 번호를 알립니다. ACK클라이언트 → 서버 ACK=y+1클라이언트가 서버의 SYN과 초기 순서 번호를 받았음을 확인합니다. SYN은 실제 데이터가 없어도 순서 번호 공간에서 한 칸을 사용합니다. 그래서 상대의 SYN을 확인하는 ACK에는 초기 순서 번호에
1을 더합니다.세 번째 ACK에는 애플리케이션 데이터를 함께 실을 수 있습니다. 서버의 초기 순서 번호를 확인하는 ACK과 첫 데이터를 같은 세그먼트에 담을 수 있다는 뜻입니다.
왜 두 번이 아니라 세 번일까?
SYN → SYN-ACK두 단계에서 끝내면 클라이언트는 서버가 자신의 SYN을 받았다는 사실을 알 수 있습니다. 하지만 서버는 클라이언트가 서버의 SYN과 초기 순서 번호를 받았는지 확인할 수 없습니다.마지막 ACK가 서버에 도착해야 양쪽 모두 “상대가 내 초기 순서 번호를 받았고, 나도 상대의 초기 순서 번호를 받았다”는 사실을 확인합니다.
이 과정은 네트워크에 늦게 남아 있던 과거의 중복 SYN을 새 연결 요청으로 잘못 받아들이는 문제도 줄입니다. 서버가 SYN만 받고 연결이 완성됐다고 판단하지 않는 이유입니다.
연결 설정 실패는 FIN 종료와 별개입니다. SYN이나 SYN-ACK을 재전송하다가 Timeout으로 포기할 수 있으며, 반드시 FIN 4-Way Handshake로 정리해야 하는 것은 아닙니다.
새 연결을 계속 만들면 어떤 비용이 들까?
3-Way Handshake는 클라이언트 기준 최소 1 RTT가 필요합니다. 요청할 때마다 새 TCP 연결을 만들면 애플리케이션 데이터를 보내기 전에 이 왕복 비용이 반복됩니다.
DB 연결은 TCP Handshake 뒤에 DB 프로토콜의 인증 과정까지 필요할 수 있습니다. 그래서 백엔드에서는 쿼리마다 연결을 새로 만들지 않고 Connection Pool에 연결을 유지한 뒤 필요할 때 빌려 쓰고 반환합니다. 이미 만들어진 연결을 재사용해 Handshake 비용을 줄이는 것입니다.
정리
TCP 3-Way Handshake는 단순한 인사가 아닙니다. 클라이언트와 서버가 서로의 초기 순서 번호를 교환하고, 상대가 그 번호를 받았다는 사실까지 확인해 신뢰적인 전송의 기준점을 맞추는 과정입니다.
SYN: 클라이언트의 초기 순서 번호 전달SYN-ACK: 클라이언트 번호 확인과 서버 번호 전달ACK: 서버 번호를 받았다는 마지막 확인- 실무 비용: 새 연결마다 최소 1 RTT, Connection Pool로 재사용
'CS > 네트워크' 카테고리의 다른 글
주소창에 도메인을 입력하면, IP는 어디서 올까? DNS 조회의 전체 흐름 (0) 2026.07.23 HTTP Stateless와 Keep-Alive, 세션과 JWT (0) 2026.07.13 HTTP HOL Blocking에서 QUIC Stream까지 (0) 2026.06.29
