📌3 way Handshake
3-Way Handshake는 **TCP(Transmission Control Protocol)**에서 신뢰성 있는 연결을 설정하기 위해 사용하는 과정입니다. 클라이언트와 서버 간에 세 번의 패킷 교환이 이루어집니다.

📝 Step 1. [Client → SYN → Server]
✅ 클라이언트가 서버에게 연결 요청을 보냄
- 클라이언트는 랜덤한 초기 시퀀스 번호(ISN, Initial Sequence Number) 와 함께 SYN 플래그를 설정한 패킷을 서버로 전송한다.
- 이때 클라이언트의 TCP 상태는 SYN_SENT 상태가 된다.
📝 Step 2. [Server → SYN + ACK → Client]
✅ 서버가 클라이언트의 요청을 수락하고 응답을 보냄
- 서버는 SYN 패킷을 받고, 자신의 초기 시퀀스 번호(ISN)를 포함한 SYN-ACK 패킷을 클라이언트에게 전송한다.
- 이때 서버의 TCP 상태는 SYN_RECV 상태가 된다.
- 서버는 클라이언트로부터 ACK 응답을 기다린다.
📝 Step 3. [Client → ACK → Server]
✅ 클라이언트가 서버의 응답을 확인하고 연결 확립
- 클라이언트는 서버의 SYN-ACK 패킷을 받은 후, 연결이 정상적으로 설정되었음을 알리는 ACK 패킷을 서버에게 전송한다.
- 이제 클라이언트와 서버의 TCP 상태는 ESTABLISHED(연결 완료) 로 변경된다.
🔎 TCP 상태 변화 정리
| 단계 | 클라이언트 상태 | 서버 상태 |
| 1. SYN 전송 | SYN_SENT | LISTEN |
| 2. SYN-ACK 응답 | SYN_SENT | SYN_RECV |
| 3. ACK 응답 (연결 완료) | ESTABLISHED | ESTABLISHED |
📌4-way handshake
4-Way Handshake는 TCP 연결을 정상적으로 종료하기 위한 과정입니다. 연결을 종료하기 위해 양쪽에서 각각 연결 해제를 요청해야 하므로 총 네 번의 패킷 교환이 필요합니다.

📝 Step 1. [Client → FIN → Server]
✅ 클라이언트가 연결 종료 요청을 보냄
- 클라이언트는 더 이상 보낼 데이터가 없다는 의미로 FIN 플래그를 설정한 패킷을 서버에게 보낸다.
- 이때 클라이언트의 TCP 상태는 FIN-WAIT-1 상태가 된다.
📝 Step 2. [Server → ACK → Client]
✅ 서버가 FIN을 받고 응답을 보냄
- 서버는 클라이언트의 FIN 패킷을 수신한 후, 정상적으로 받았다는 의미로 ACK 패킷을 전송한다.
- 이때 서버의 TCP 상태는 CLOSE-WAIT, 클라이언트는 FIN-WAIT-2 상태가 된다.
- 이 시점에서 서버는 아직 보낼 데이터가 남아 있을 수 있다.
📝 Step 3. [Server → FIN → Client]
✅ 서버가 연결 종료 요청을 보냄
- 서버도 모든 데이터를 전송한 후, 연결을 종료하겠다는 의미로 FIN 패킷을 클라이언트에게 보낸다.
- 이때 서버의 TCP 상태는 LAST-ACK 상태가 된다.
📝 Step 4. [Client → ACK → Server]
✅ 클라이언트가 서버의 종료 요청을 확인하고 연결을 완전히 종료
- 클라이언트는 서버의 FIN 패킷을 받고, 정상적으로 받았다는 의미로 ACK 패킷을 보낸다.
- 이때 클라이언트는 TIME-WAIT 상태로 변경되며, 일정 시간 동안 기다린 후 연결을 완전히 종료한다.
- TIME-WAIT 상태를 두는 이유는 패킷 유실로 인한 문제(예: 서버가 FIN을 다시 보내는 경우)를 방지하기 위해서이다.
✅ 일정 시간이 지나면 클라이언트도 CLOSED 상태가 되어 연결이 완전히 종료된다.
🔎 TCP 상태 변화 정리
| 단계 | 클라이언트 상태 | 서버 상태 |
| 1. FIN 전송 | FIN-WAIT-1 | ESTABLISHED |
| 2. ACK 응답 | FIN-WAIT-2 | CLOSE-WAIT |
| 3. FIN 전송 | FIN-WAIT-2 | LAST-ACK |
| 4. ACK 응답 (연결 종료) | TIME-WAIT → CLOSED | CLOSED |
🧐 추가 개념: TIME-WAIT 상태란?
✅ 클라이언트가 TIME-WAIT 상태에서 기다리는 이유는?
- 서버가 보낸 FIN 패킷이 손실되었을 경우를 대비해 서버가 재전송할 가능성을 고려하기 때문.
- 일정 시간이 지나면 자동으로 CLOSED 상태로 변하면서 연결이 완전히 종료됨.
🛠 3-Way Handshake vs 4-Way Handshake 비교
구분 3-Way Handshake 4-Way Handshake
| 목적 | 연결 설정 | 연결 종료 |
| 패킷 수 | 3개 (SYN, SYN-ACK, ACK) | 4개 (FIN, ACK, FIN, ACK) |
| 특징 | 신뢰성 있는 데이터 전송을 위한 연결 확립 | 안전한 연결 종료 및 TIME-WAIT 상태 포함 |
참고
'CS 준비' 카테고리의 다른 글
| [네트워크]로드밸런서가 무엇인가요? (0) | 2025.02.10 |
|---|---|
| [네트워크]DNS란? (0) | 2025.02.10 |
| www.github.com을 브라우저에 입력하고 엔터를 쳤을 때 (1) | 2025.02.04 |
| Q. TCP와 UDP의 차이에 대해 설명해 주세요. (0) | 2025.02.04 |
| 세그멘테이션과 페이징의 차이점 (0) | 2025.01.18 |