Oh My Algorithm
Concept Guide3-way · 4-way

TCP 핸드셰이크 (TCP Handshake)

TCP는 데이터를 주고받기 전에 3-way 핸드셰이크로 양방향 통신 준비를 확인하고, 끝낼 때는 4-way 핸드셰이크로 각 방향을 차례로 닫습니다. 각 단계마다 SYN·ACK·FIN 플래그와 순서 번호(seq/ack)를 교환하며 양쪽의 연결 상태가 단계적으로 바뀝니다.

01TCP 핸드셰이크 (TCP Handshake)

3-Way Handshake · 연결 수립

TCP 연결은 3번의 메시지로 서로의 통신 준비를 확인합니다. 시작 전 클라이언트는 CLOSED, 서버는 연결을 기다리는 LISTEN 상태입니다.

① 클라이언트가 SYN(연결 요청)을 보냅니다. 시작 순서 번호 x를 함께 전달하고 SYN-SENT 상태가 됩니다.

② 서버가 SYN+ACK로 응답합니다. 요청을 수락(ACK)하면서 자신의 순서 번호 y도 보내고 SYN-RCVD 상태가 됩니다.

③ 클라이언트가 ACK로 서버 응답을 확인합니다. 이 순간 양쪽 모두 ESTABLISHED — 연결이 열렸습니다.

3-way 완료 · 단 3번의 왕복으로 양방향 통신 준비가 끝났습니다. 이제 실제 데이터를 주고받을 수 있습니다.

💻Client
CLOSED
🗄️Server
LISTEN
SYN
SYN + ACK
ACK
1 / 5

4-Way Handshake · 연결 종료

연결을 끊을 땐 각 방향을 따로 닫아야 해서 보통 4번의 메시지가 오갑니다. 시작은 양쪽 모두 ESTABLISHED 상태입니다.

① 클라이언트가 FIN을 보냅니다. "더 보낼 데이터가 없다"는 종료 요청으로, FIN-WAIT-1 상태가 됩니다.

② 서버가 ACK로 확인합니다. 클라이언트→서버 방향만 닫히고, 서버는 남은 데이터를 마저 보낼 수 있는 CLOSE-WAIT 상태가 됩니다.

③ 서버도 보낼 데이터를 다 보내면 FIN을 보냅니다. 마지막 ACK를 기다리는 LAST-ACK 상태가 됩니다.

④ 클라이언트가 마지막 ACK를 보냅니다. 서버는 CLOSED로 완전히 닫히고, 클라이언트는 TIME-WAIT로 잠시 대기합니다.

4-way 완료 · 클라이언트는 지연 패킷을 흡수하려 TIME-WAIT(2MSL)만큼 기다린 뒤 CLOSED가 되어 연결이 완전히 끝납니다.

💻Client
ESTABLISHED
🗄️Server
ESTABLISHED
FIN
ACK
FIN
ACK
1 / 6

02 쉽게 이해하기

For Everyone
🔑핵심 동작

연결을 열 때 SYN, SYN+ACK, ACK 를 주고받아 양쪽의 송신과 수신을 함께 확인합니다. 닫을 때는 방향마다 따로 닫으므로 FIN 과 ACK 를 네 번 주고받습니다.

💡쉽게 말하면

연결을 열 때는 SYN → SYN+ACK → ACK 세 번을 주고받아 양쪽 모두 보내고 받을 준비가 됐음을 확인합니다(ESTABLISHED).

닫을 때는 한 방향씩 닫아야 해서 FIN → ACK → FIN → ACK 네 번이 오가며, 마지막엔 지연 패킷을 대비해 TIME-WAIT로 잠시 기다린 뒤 완전히 종료합니다.

📍어디에 쓰나
  • 신뢰성 있는 연결(HTTP·HTTPS·SSH 등) 동작 원리 이해
  • 연결 지연·포트 상태(TIME-WAIT) 진단
  • 방화벽·로드밸런서 동작 분석

03 자주 묻는 질문

FAQ
TCP 핸드셰이크 (TCP Handshake)란 무엇인가요?+

TCP는 데이터를 주고받기 전에 3-way 핸드셰이크로 양방향 통신 준비를 확인하고, 끝낼 때는 4-way 핸드셰이크로 각 방향을 차례로 닫습니다. 각 단계마다 SYN·ACK·FIN 플래그와 순서 번호(seq/ack)를 교환하며 양쪽의 연결 상태가 단계적으로 바뀝니다.

TCP 핸드셰이크 (TCP Handshake)은(는) 어디에 사용하나요?+

신뢰성 있는 연결(HTTP·HTTPS·SSH 등) 동작 원리 이해, 연결 지연·포트 상태(TIME-WAIT) 진단, 방화벽·로드밸런서 동작 분석

TCP 핸드셰이크 (TCP Handshake)를 쉽게 비유하면?+

연결을 열 때 SYN, SYN+ACK, ACK 를 주고받아 양쪽의 송신과 수신을 함께 확인합니다. 닫을 때는 방향마다 따로 닫으므로 FIN 과 ACK 를 네 번 주고받습니다.