base

TCP 3-Way Handshake

TCP(Transmission Control Protocol)는 인터넷에서 데이터를 안정적으로 전달하기 위한 핵심 프로토콜로, 전송 계층(Transport Layer)에 속합니다. TCP는 데이터를 순서대로, 오류 없이 목적지에 전달하기 위해 사전에 연결을 설정하고 상태를 동기화하는 절차를 필요로 합니다. 이 연결 설정 과정이 바로 3-Way Handshake이며, 신뢰성 있는 통신의 출발점이라 할 수 있습니다.


이번 글에서는 TCP 연결이 어떤 방식으로 수립되는지, 각 단계에서 어떤 메시지가 오가는지 알아봅시다.


1. TCP는 왜 연결을 수립할까?

TCP는 연결 지향형(Connection-Oriented) 프로토콜입니다. 따라서 데이터를 전송하기 전에 송신자와 수신자 간의 연결을 명시적으로 설정해야 합니다. 이러한 과정에서 아래의 내용이 필수적입니다.

  • 데이터의 순서 보장: 데이터가 전송 순서대로 도착해야 하는 애플리케이션 요구를 만족
  • 전송 오류 제어: 손실된 데이터나 중복된 데이터를 탐지하고 재전송
  • 흐름 제어 및 혼잡 제어: 네트워크 병목을 줄이고, 수신자가 감당 가능한 속도로 데이터 전송

이러한 기능을 가능하게 하기 위해, 연결 수립 시점에 송신자와 수신자는 상태를 동기화하고, 시퀀스 번호 기반의 통신 규약을 사전에 맞추기 위해 TCP 3-Way Handshake가 진행됩니다.


2. TCP 3-Way Handshake 구조와 흐름

TCP 연결 수립은 세 단계의 메시지 교환으로 구성되며, 이를 3-Way Handshake라고 부릅니다.

1단계: SYN (클라이언트 → 서버)

클라이언트가 서버에 연결을 요청하는 단계입니다. 클라이언트의 시작 시퀀스 번호(ISN)를 포함한 SYN 패킷 전송합니다. 이 요청은 단순한 연결 요청을 넘어서 이후 통신의 시퀀스 기준점을 전달하는 역할도 수행합니다.

  • ISN (Initial Sequence Number) : 초기 순서 번호 입니다. TCP 연결이 처음 수립될 때, 송신 측(보통 클라이언트)이 랜덤하게 선택해 보내는 32비트 숫자입니다. 이후 전송되는 바이트들에 대해 이 ISN을 기준으로 순서 번호를 부여하게 됩니다. 예를 들어, 클라이언트가 ISN = 1000을 생성해 SYN 패킷에 담아 보내면, 이후 전송될 데이터의 첫 번째 바이트는 순서 번호 1001, 다음 바이트는 1002… 식으로 번호가 매겨집니다.
  • SYN (Synchronize) : 동기화 요청 플래그 입니다. TCP 헤더에 있는 제어 비트(Control Bit) 중 하나로, 상대방과 시퀀스 번호를 맞추기 위해 “초기 순서 번호(ISN)”를 전달할 때 설정됩니다. SYN 플래그를 통해 서로의 초기 시퀀스 번호를 교환하여 이후 데이터 흐름을 동기화합니다.

2단계: SYN + ACK (서버 → 클라이언트)

서버가 요청을 수락하며 클라이언트의 SYN에 대한 응답을 전송합니다. 자신의 ISN을 포함한 SYN과 클라이언트 ISN에 대한 ACK 전송합니다. 이를 통해, 클라이언트와 서버 양측 모두 송신 준비가 완료됨을 확인합니다.

  • ACK (Acknowledgment) : 확인 응답 플래그 (Acknowledgment) 입니다. TCP 헤더에 있는 제어 비트 중 하나로, “이전 단계로부터 받은 데이터를 제대로 받았다”는 의미로 상대방에게 알려줄 때 설정합니다. 예를 들어, 클라이언트가 자신의 ISN = 1000을 보냈다면, 서버는 “ACK 번호 = 1001”을 담아서 “클라이언트가 보낸 ISN + 1을 잘 받았다”는 의미를 전달합니다. ACK 플래그는 세션이 수립된 이후에도 매번 송수신할 때마다 상대가 보낸 바이트들을 잘 받았음을 알리는 데 계속 사용됩니다.

3단계: 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를 바탕으로 신뢰성 있는 통신을 이어나가게 됩니다. 이해도를 높이기 위해 용어 정리를 하면 아래와 같습니다.


3. 시퀀스 번호와 ACK 메커니즘

TCP는 데이터를 보낼 때 “어떤 데이터가, 어느 순서로, 제대로 도착했는지” 추적해야 신뢰성 있는 통신이 가능합니다. 이를 위해 TCP는 각 바이트에 시퀀스 번호(Sequence Number, SEQ)를 붙이고, 받은 쪽에서는 “여기까지 잘 받았다”고 알려주는 확인 응답 번호(Acknowledgment Number, ACK)를 사용합니다. 3-Way Handshake 단계에서도 이 번호가 초기화되고 교환되기 때문에, 연결이 성립된 뒤에는 서로가 서로의 번호를 기억한 상태로 본격적인 데이터 전송을 시작할 수 있습니다.

  • SEQ (Sequence Number) : TCP 헤더에 포함된 32비트 필드로, 해당 패킷에 담긴 데이터(또는 제어 메시지)가 연결 전체에서 네 번째 단계까지 어느 위치에 속하는지 표시합니다.

시퀀스 번호(SEQ) 역할

  • 데이터 조각화(Fragmentation) : TCP는 큰 데이터를 작은 패킷(세그먼트)으로 나눠서 보냅니다. 예를 들어, 1,000바이트짜리 파일을 500바이트씩 두 번 보내야 한다면, “첫 번째 세그먼트가 어디까지, 두 번째 세그먼트가 어디부터”인지 일일이 구분해줘야 합니다.
  • 순서 보장(Ordering) : IP 계층에서는 패킷이 서로 다른 경로를 통해 흩어져서 도착할 수 있기 때문에, 수신 측이 나중에 받은 두 번째 세그먼트를 먼저 처리하면 데이터가 뒤섞일 수 있습니다. 이럴 때 시퀀스 번호가 있으면 원래 보낸 순서대로 재조립하기가 쉬워집니다.
  • 재전송 관리(Retransmission) : “이전에 보낸 데이터가 제대로 도착했는지” 확인되지 않으면, 일정 시간 뒤에 다시 보내야 합니다. ACK 번호를 통해 수신 측이 “이 번호까지는 이상 없이 받았다”고 알려주면, 송신 측은 그 다음 번호부터 남은 데이터를 보내거나, 누락된 부분만 재전송할 수 있습니다.

확인 응답 번호(ACK)의 역할

  • 수신 측은 마지막으로 제대로 받은 바이트의 다음 번호(마지막 바이트 순서 번호 + 1)를 ACK 번호 필드에 담아 송신 측에 보냅니다. 예를 들어, 송신 측이 바이트 0부터 바이트 99까지(총 100바이트)의 데이터를 보냈다면, 수신 측은 이를 잘 받았음을 의미하는 ACK 번호로 “100”을 전송합니다.
  • 흐름 제어(Flow Control): 수신 측 버퍼가 꽉 차면 ACK를 늦게 보내거나, 가끔씩만 보내면서 “너무 빨리 보내지 말아 달라”는 신호를 줄 수도 있습니다.
  • 오류 검출: 특정 번호(x)까지 받았다는 ACK가 일정 시간 내에 오지 않으면, 송신 측은 “아마 그 구간에서 패킷이 손실됐구나!”라고 판단하고 해당 시퀀스 번호(x)부터 다시 전송을 시도합니다.

이를 통해 연결 수립 이후 각 전송 단위에 대한 확인 응답이 가능해지며, 재전송이나 데이터 순서 보장이 실현됩니다.


4. 연결 실패 발생 예시

연결 실패 및 타임아웃

3단계 중 하나라도 누락되면 연결은 실패합니다. 예를 들어, SYN을 보냈지만 SYN+ACK이 도착하지 않으면 클라이언트는 일정 시간 기다린 뒤 타임아웃으로 연결 시도를 포기합니다. 이는 방화벽 차단, 네트워크 중단, 서버 부하 등 다양한 원인으로 발생할 수 있습니다.

SYN Flood 공격 (DDoS)

공격자는 SYN 요청만 무수히 보낸 뒤, ACK을 보내지 않아 서버의 **연결 대기열(Backlog Queue)**을 점유하는 SYN Flood 공격을 시도할 수 있습니다. 이는 TCP 연결 대기 자원을 고갈시켜 정상 요청을 막는 대표적인 DDoS 기법입니다.

Half-Open 상태

양쪽 중 한쪽만 연결이 종료된 상태를 Half-Open이라 부르며, 서버 리소스를 낭비할 수 있습니다. 이러한 상태를 탐지하고 정리하기 위해 TCP Keep-Alive 기능이나 커넥션 타임아웃 설정이 활용됩니다.


5. 3-Way Handshake 활용

TCP 3-Way Handshake는 단순히 연결을 여는 기능을 넘어서, 다양한 환경에서 사용됩니다.

  • 패킷 분석: Wireshark로 병목/지연 구간을 분석할 때 가장 먼저 확인하는 기준
  • 보안 분석: 비정상 SYN 패턴은 보안 침해의 신호로 해석 가능
  • 서버 성능 측정: 연결 수락 속도, SYN Queue 포화 여부 등도 성능 지표로 사용
  • L4 로드밸런싱: 세션의 시작점을 식별하고 연결을 특정 서버에 전달하기 위한 필수 정보

컨테이너나 가상 머신처럼 네트워크 토폴로지가 복잡한 환경에서는 연결 성립 자체가 문제가 되는 경우가 많아, 3-Way Handshake는 네트워크 구성 검증에도 중요한 역할을 합니다.


6. 전체 요약 정리

단계메시지주체설명
1SYN클라이언트연결 요청 및 클라이언트 시퀀스 번호 전송
2SYN + ACK서버연결 수락, 서버 시퀀스 번호 전송 + 클라이언트 응답 확인
3ACK클라이언트서버 응답 확인 및 최종 연결 확립

마무리

TCP 3-Way Handshake는 모든 신뢰성 기반 네트워크 통신의 출발점이자 기초입니다. 이 과정을 정확히 이해하면 단순한 연결 이상으로, 성능 병목, 보안 위협, 인프라 장애의 원인을 파악하고 대응할 수 있습니다.


참고 자료