본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

3-way 핸드셰이크(Three-way handshake, 3WHS)는 TCP 에서 두 호스트가 SYN, SYN+ACK, ACK 세 개의 세그먼트를 주고받아 서로의 초기 순서 번호를 확인하고 연결을 수립하는 절차이다.

TCP 는 바이트마다 순서 번호(Sequence Number)를 붙여 순서와 손실을 관리한다. 그러려면 데이터를 보내기 전에 양쪽이 어느 번호부터 세기 시작하는지(초기 순서 번호, ISN)를 알려 주고 상대가 그것을 받았다고 확인해야 한다. 한쪽 방향마다 "내 번호는 이것" 과 "네 번호를 받았다" 가 필요하므로 네 번의 통보가 필요하지만, 가운데 두 통보를 한 세그먼트(SYN+ACK)에 합쳐 세 번으로 끝낸다. 옛 연결의 지연된 SYN 이 새 연결로 오인되는 것도 이 확인 과정으로 걸러 낸다.[1]

RFC 9293 의 기본 예(그림 6)를 따르면 다음과 같다.[1]

순서 방향 플래그 Seq Ack 상태 변화
1 클라이언트 → 서버 SYN 100 - 클라이언트 SYN-SENT, 서버 LISTEN → SYN-RECEIVED
2 서버 → 클라이언트 SYN, ACK 300 101 클라이언트 ESTABLISHED
3 클라이언트 → 서버 ACK 101 301 서버 ESTABLISHED
  • SYN 과 FIN 은 순서 번호를 하나 차지한다. 데이터가 없어도 SYN 은 번호 1개를 쓴 것으로 치므로, SYN(Seq=100)에 대한 확인 응답 번호는 101 이다.
  • 확인 응답 번호(Ack)는 "다음에 받기를 기대하는 바이트 번호" 이다. 그래서 서버는 클라이언트의 ISN + 1 을, 클라이언트는 서버의 ISN + 1 을 Ack 에 넣는다.
  • 세 번째 ACK 의 Seq 는 클라이언트 ISN + 1 이다. 이 ACK 은 데이터가 없으면 번호를 차지하지 않으므로, 이어서 보내는 첫 데이터 세그먼트도 같은 Seq(101)로 시작한다.

클라이언트가 Seq=7 로 SYN 을 보내고 서버가 Seq=38 로 SYN+ACK 을 보냈다면,

  • 서버 SYN+ACK 의 Ack = 7 + 1 = 8
  • 클라이언트 마지막 ACK 의 Seq = 7 + 1 = 8, Ack = 38 + 1 = 39

연결을 기다리는 서버는 LISTEN, SYN 을 보낸 클라이언트는 SYN-SENT, SYN 을 받아 SYN+ACK 을 보낸 서버는 SYN-RECEIVED 에 있다가 마지막 ACK 이 오가면 양쪽 모두 ESTABLISHED 가 된다. 상태 전체는 TCP 연결 상태 에 정리되어 있다. 연결을 끊을 때는 양방향을 따로 닫으므로 FIN 과 ACK 을 각각 주고받는 4-way 절차를 쓴다.[2]

  • SYN 플러딩 - 공격자가 출발지를 위조한 SYN 만 대량으로 보내고 마지막 ACK 을 보내지 않으면, 서버의 SYN-RECEIVED 대기열(백로그)이 차서 정상 연결을 받지 못한다. SYN 쿠키가 대표 대책이다.
  • 포트 스캔 - SYN 을 보내 SYN+ACK 이 오면 열린 포트, RST 가 오면 닫힌 포트로 판정하는 반개방(half-open) 스캔이 이 절차를 이용한다.
  1. ↑ 1.0 1.1 「Transmission Control Protocol (TCP)」(RFC 9293), 3.5절 「Establishing a Connection」, IETF, https://www.rfc-editor.org/rfc/rfc9293, 확인일: 2026-11-04.
  2. ↑ James F. Kurose·Keith W. Ross, 『Computer Networking: A Top-Down Approach』 8판, Pearson, 2021, 3.5.6절 「TCP Connection Management」.