base
TCP(Transmission Control Protocol)는 인터넷에서 데이터를 안정적으로 전달하기 위한 핵심 프로토콜로, 전송 계층(Transport Layer)에 속합니다. TCP는 데이터를 순서대로, 오류 없이 목적지에 전달하기 위해 사전에 연결을 설정하고 상태를 동기화하는 절차를 필요로 합니다. 이 연결 설정 과정이 바로 3-Way Handshake이며, 신뢰성 있는 통신의 출발점이라 할 수 있습니다.
이번 글에서는 TCP 연결이 어떤 방식으로 수립되는지, 각 단계에서 어떤 메시지가 오가는지 알아봅시다.
TCP는 연결 지향형(Connection-Oriented) 프로토콜입니다. 따라서 데이터를 전송하기 전에 송신자와 수신자 간의 연결을 명시적으로 설정해야 합니다. 이러한 과정에서 아래의 내용이 필수적입니다.
이러한 기능을 가능하게 하기 위해, 연결 수립 시점에 송신자와 수신자는 상태를 동기화하고, 시퀀스 번호 기반의 통신 규약을 사전에 맞추기 위해 TCP 3-Way Handshake가 진행됩니다.
TCP 연결 수립은 세 단계의 메시지 교환으로 구성되며, 이를 3-Way Handshake라고 부릅니다.
클라이언트가 서버에 연결을 요청하는 단계입니다. 클라이언트의 시작 시퀀스 번호(ISN)를 포함한 SYN 패킷 전송합니다. 이 요청은 단순한 연결 요청을 넘어서 이후 통신의 시퀀스 기준점을 전달하는 역할도 수행합니다.
서버가 요청을 수락하며 클라이언트의 SYN에 대한 응답을 전송합니다. 자신의 ISN을 포함한 SYN과 클라이언트 ISN에 대한 ACK 전송합니다. 이를 통해, 클라이언트와 서버 양측 모두 송신 준비가 완료됨을 확인합니다.
클라이언트가 서버의 SYN을 확인하고 최종 응답을 보냅니다. 서버 ISN에 대한 ACK 패킷을 전송합니다. 연결이 ESTABLISHED 상태로 전환되어 데이터 송수신이 가능해집니다.
이 구조는 양측이 명시적으로 상태를 동기화하며, 일방적이지 않은 쌍방향 통신 준비를 마쳤음을 의미합니다.
단계 | 전송 측 | SEQ 번호 | ACK 번호 | 설명 |
---|---|---|---|---|
1단계 (SYN) | 클라이언트 → 서버 | 100(클라이언트_ISN) | - | 클라이언트가 랜덤으로 초기 시퀀스 번호(ISN) 100을 정해 SEQ=100, SYN=1 패킷을 보냄. ACK는 미설정. 100부터 시작한다는 의미 |
2단계 (SYN-ACK) | 서버 → 클라이언트 | 300(서버_ISN) | 101(클라이언트_ISN+1) | 서버가 랜덤으로 초기 시퀀스 번호(ISN) 300을 정해 SEQ=300, SYN=1, ACK=101 패킷을 보냄. 여기서 ACK=101은 “클라이언트가 보낸 100번 SYN을 잘 받았으니, 다음으로 받을 데이터는 101번부터 해달라”는 의미 |
3단계 (ACK) | 클라이언트 → 서버 | 101(클라이언트_ISN+1) | 301(서버_ISN+1) | 클라이언트가 SEQ=101, ACK=301, SYN=0 패킷을 보냄. SEQ=101은 “내가 보내는 첫번째 데이터 바이트는 101번부터”, ACK=301은 “서버가 보낸 300번 SYN을 잘 받았으니 다음 데이터는 301번부터 해달라”는 의미. 이로써 양쪽 모두 상대방의 ISN(100, 300)을 확인했고, 실제 데이터 전송을 시작할 준비가 끝남 |
이렇게 세 단계가 완료되면 양쪽 모두 상대의 초기 순서 번호(ISN)를 확인하고, 이후 데이터 전송 시 SEQ와 ACK를 바탕으로 신뢰성 있는 통신을 이어나가게 됩니다. 이해도를 높이기 위해 용어 정리를 하면 아래와 같습니다.
TCP는 데이터를 보낼 때 “어떤 데이터가, 어느 순서로, 제대로 도착했는지” 추적해야 신뢰성 있는 통신이 가능합니다. 이를 위해 TCP는 각 바이트에 시퀀스 번호(Sequence Number, SEQ)를 붙이고, 받은 쪽에서는 “여기까지 잘 받았다”고 알려주는 확인 응답 번호(Acknowledgment Number, ACK)를 사용합니다. 3-Way Handshake 단계에서도 이 번호가 초기화되고 교환되기 때문에, 연결이 성립된 뒤에는 서로가 서로의 번호를 기억한 상태로 본격적인 데이터 전송을 시작할 수 있습니다.
이를 통해 연결 수립 이후 각 전송 단위에 대한 확인 응답이 가능해지며, 재전송이나 데이터 순서 보장이 실현됩니다.
3단계 중 하나라도 누락되면 연결은 실패합니다. 예를 들어, SYN을 보냈지만 SYN+ACK이 도착하지 않으면 클라이언트는 일정 시간 기다린 뒤 타임아웃으로 연결 시도를 포기합니다. 이는 방화벽 차단, 네트워크 중단, 서버 부하 등 다양한 원인으로 발생할 수 있습니다.
공격자는 SYN 요청만 무수히 보낸 뒤, ACK을 보내지 않아 서버의 **연결 대기열(Backlog Queue)**을 점유하는 SYN Flood 공격을 시도할 수 있습니다. 이는 TCP 연결 대기 자원을 고갈시켜 정상 요청을 막는 대표적인 DDoS 기법입니다.
양쪽 중 한쪽만 연결이 종료된 상태를 Half-Open이라 부르며, 서버 리소스를 낭비할 수 있습니다. 이러한 상태를 탐지하고 정리하기 위해 TCP Keep-Alive 기능이나 커넥션 타임아웃 설정이 활용됩니다.
TCP 3-Way Handshake는 단순히 연결을 여는 기능을 넘어서, 다양한 환경에서 사용됩니다.
컨테이너나 가상 머신처럼 네트워크 토폴로지가 복잡한 환경에서는 연결 성립 자체가 문제가 되는 경우가 많아, 3-Way Handshake는 네트워크 구성 검증에도 중요한 역할을 합니다.
단계 | 메시지 | 주체 | 설명 |
---|---|---|---|
1 | SYN | 클라이언트 | 연결 요청 및 클라이언트 시퀀스 번호 전송 |
2 | SYN + ACK | 서버 | 연결 수락, 서버 시퀀스 번호 전송 + 클라이언트 응답 확인 |
3 | ACK | 클라이언트 | 서버 응답 확인 및 최종 연결 확립 |
TCP 3-Way Handshake는 모든 신뢰성 기반 네트워크 통신의 출발점이자 기초입니다. 이 과정을 정확히 이해하면 단순한 연결 이상으로, 성능 병목, 보안 위협, 인프라 장애의 원인을 파악하고 대응할 수 있습니다.