한양과학기술고등학교

에듀테크 프로젝트 대시보드

TCP 3-way Handshake

연결은 어떻게 시작될까?

TCP는 데이터를 보내기 전에 세 번의 인사로 서로 준비됐는지 확인한다  ·  SYN / SYN-ACK / ACK

💻
Client
CLOSED
🖥️
Server
LISTEN
// "핸드셰이크 시작"을 누르면 패킷이 오가는 과정을 한 단계씩 볼 수 있어요.

1 SYN

클라이언트가 "연결하고 싶어!"라고 요청. 자기 시작 순서번호(seq=x)를 알려준다.

2 SYN-ACK

서버가 "좋아, 나도 준비됨"이라 응답. ack=x+1로 잘 받았다고 확인하고, 자기 순서번호(seq=y)도 보낸다.

3 ACK

클라이언트가 서버의 응답을 확인(ack=y+1). 이 순간부터 양쪽 모두 ESTABLISHED — 데이터 전송 시작!

왜 2번이 아니라 3번일까? 두 번만 주고받으면 서버는 클라이언트가 자기 응답을 받았는지 알 수 없다. 세 번째 ACK가 있어야 양방향 통신이 모두 가능함이 증명된다.
연결 종료는 조금 다르게 FIN → ACK → FIN → ACK 의 4-way로 이뤄진다. 각자 "나는 이제 보낼 게 없다"를 따로 알려야 하기 때문. 아래 버튼으로 종료 과정도 볼 수 있어요.

💡 순서번호(sequence number)는 왜 0이 아니라 랜덤 값에서 시작할까?

예전 연결의 패킷이 뒤늦게 도착해 새 연결에 섞이는 것을 막고, 공격자가 순서번호를 추측해 가짜 패킷을 끼워 넣는 TCP 시퀀스 예측 공격을 어렵게 하기 위해서다. 그래서 운영체제는 연결마다 예측 불가능한 ISN(Initial Sequence Number)을 새로 뽑는다.