핵심 인사이트 (3줄 요약)

  1. 본질: TCP 3-Way Handshake는 클라이언트와 서버가 실제 데이터를 주고받기 전에, "나 너한테 데이터 보낼 건데 준비됐어?(SYN)", "응 준비됐어, 넌?(SYN-ACK)", "나도 준비 끝났어!(ACK)"라며 서로 세 번의 인사를 나누어 완벽히 신뢰할 수 있는 논리적 터널(세션)을 뚫어내는 의식이다.
  2. ISN(초기 시퀀스 번호)의 교환: 단순히 인사만 하는 게 아니라, 서로 앞으로 보낼 데이터의 **순서 번호표(Sequence Number)가 몇 번부터 시작할지 각자의 난수(ISN)를 교환하여 동기화(Synchronize)**하는 것이 가장 핵심적인 실무 목적이다.
  3. 보안적 약점 (SYN Flooding): 서버가 SYN을 받으면 자리를 펴놓고 3번째 대답(ACK)을 기다리는데, 해커가 위조된 SYN만 10만 개 쏘고 대답을 안 하면 서버의 대기실(Backlog Queue)이 꽉 차서 죽어버리는 치명적 약점(SYN Flooding 공격)을 내포하고 있다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: TCP/IP 네트워크에서 양 종단(End-to-End) 간에 신뢰성 있는 논리적 연결(Session)을 성립시키기 위해 SYN과 ACK 플래그를 사용하여 3단계로 패킷을 교환하는 초기화 프로세스.

  • 필요성: UDP처럼 냅다 데이터를 던졌는데 서버 전원이 꺼져 있다면? 내 데이터는 태평양 바다 한가운데서 쓰레기가 된다. 대역폭 낭비다. 게다가 1GB짜리 파일을 100만 조각으로 내서 보낼 건데, 서버가 100만 개를 순서대로 받을 램(버퍼) 여유가 있는지 미리 물어보지도 않고 던지면 다 깨진다. "야! 무조건 본 게임(데이터 전송) 전에, 서로 통신이 가능한지 찔러보고, 시작 번호표(Seq) 맞추고, 각자 버퍼 크기(Window Size) 얼마인지 호구조사부터 완벽하게 끝내놔!"

  • 💡 비유: 3-Way Handshake는 무전기 통신의 **"호출 및 응답 프로토콜"**과 완벽히 같습니다.

    • 1단계 (SYN): "본부, 여기는 독수리! 내 목소리 들리나? 오버!"
    • 2단계 (SYN-ACK): "독수리, 여기는 본부! 잘 들린다! 내 목소리도 잘 들리나? 오버!"
    • 3단계 (ACK): "본부, 잘 들린다! 지금부터 작전 명령 하달하겠다! 오버!" (이때부터 진짜 데이터 전송 시작).

📢 섹션 요약 비유: 3-Way Handshake는 전화 통화의 첫 3초입니다. 내가 "여보세요(SYN)" 하면, 상대방이 "네, 여보세요(SYN-ACK)" 하고, 내가 다시 **"아 네, 안녕하세요(ACK)"**라고 서로의 목소리가 들린다는 것을 확정 지은 뒤에야 비로소 "저기 돈 좀 빌려주라"는 진짜 본론(데이터)을 꺼냅니다.


Ⅱ. 3단계 동작 메커니즘과 상태 변화 (Deep Dive)

이 3단계 동안 클라이언트와 서버의 TCP 상태(State)가 어떻게 변하는지가 시험과 면접의 0순위 타겟이다.

1단계: SYN 발송 (Client ──▶ Server)

  • 클라이언트가 네이버 웹서버(80번)에 접속하려 한다.
  • 클라이언트는 임의의 난수(예: 1000)를 초기 시퀀스 번호(ISN)로 뽑는다.
  • 패킷의 TCP 헤더에 SYN 불을 켜고, Seq = 1000을 적어서 쏜다.
  • 상태 변화:
    • 서버는 켜지자마자 계속 손님을 기다리는 LISTEN 상태다.
    • 클라이언트는 쏘고 나서 대답을 기다리는 SYN_SENT 상태가 된다.

2단계: SYN+ACK 화답 (Server ──▶ Client)

  • 네이버 서버가 SYN을 받았다. "오케이, 너 1000번부터 시작한다고? 메모 완료!"
  • 서버도 자기만의 난수(예: 5000)를 뽑는다.
  • 패킷 헤더에 SYN 불과 ACK 불을 동시에 켠다.
    • "내 번호는 5000번부터 시작할게! (Seq = 5000)"
    • "네가 아까 보낸 1000번 잘 받았으니, 다음엔 1001번 보내줘! (ACK = 1001)"
  • 상태 변화: 서버는 반쯤 연결이 된 SYN_RCVD (SYN Received) 상태가 된다. (이 상태가 바로 해커들이 노리는 대기실이다).

3단계: 최종 ACK 발송 (Client ──▶ Server)

  • 클라이언트가 서버의 화답을 받았다. "오, 서버도 5000번부터 보낸다고? 메모 완료!"
  • 패킷 헤더에 ACK 불만 켠다.
    • "네가 보낸 5000번 잘 받았으니, 다음엔 5001번 보내줘! (ACK = 5001)"
  • 이 패킷이 서버에 도착하는 순간 3번의 악수가 끝난다.
  • 상태 변화: 클라이언트와 서버 양쪽 모두 ESTABLISHED (연결 확립) 상태가 되며, 이때부터 진짜 웹페이지 데이터(HTTP)가 쏟아져 나오기 시작한다.
 ┌─────────────────────────────────────────────────────────────┐
 │                TCP 3-Way Handshake 시퀀스 번호의 교환 도식        │
 ├─────────────────────────────────────────────────────────────┤
 │                                                             │
 │   [ 클라이언트 ]                                    [ 서버 ]      │
 │   (SYN_SENT)                                    (LISTEN)    │
 │       │                                               │     │
 │       │ 1. [SYN] Seq = 100                            │     │
 │       ├───────────────────────────────────────────────▶     │
 │       │                                           (SYN_RCVD)│
 │       │ 2. [SYN, ACK] Seq = 500, ACK = 101 (100+1)    │     │
 │       ◀───────────────────────────────────────────────┤     │
 │ (ESTABLISHED)                                         │     │
 │       │ 3. [ACK] Seq = 101, ACK = 501 (500+1)         │     │
 │       ├───────────────────────────────────────────────▶     │
 │       │                                         (ESTABLISHED)│
 │       │ === 이제부터 진짜 데이터 통신 (HTTP 등) 시작! ===       │
 └─────────────────────────────────────────────────────────────┘

3. 실무 T/S: SYN Flooding 공격과 방어

해커가 위조된 IP로 1단계 SYN 패킷만 1초에 10만 개 쏜다. 서버는 10만 개의 자리를 비워두고 SYN_RCVD 상태에서 3번째 대답(ACK)을 기다리며 메모리가 터져 죽는다.

  • 방어책 (SYN Cookie): 서버가 SYN을 받아도 메모리(대기실)에 자리를 내어주지 않는다! 대신 2단계 SYN+ACK를 보낼 때 암호화된 쿠키 값을 구워서 던진 뒤 다 잊어버린다. 진짜 클라이언트라면 3단계 ACK를 보낼 때 그 쿠키를 다시 들고 오므로, 그때서야 "아 진짜 손님이네!" 하고 메모리에 자리를 내어주어 서버 뻗음을 완벽히 막아낸다.

📢 섹션 요약 비유: 3-Way Handshake는 소개팅에서 **"안전한 만남을 확정 짓는 카톡 3번"**입니다. 남자가 "오늘 6시에 만날까요?(SYN)" 하면, 여자가 "좋아요! 저는 강남역이 좋은데 어떠세요?(SYN+ACK)" 하고, 남자가 다시 "네, 강남역에서 뵙겠습니다!(ACK)"라고 해야만 비로소 진짜 만남(ESTABLISHED)이 성사되는 철저한 확인 과정입니다.