TCP/IP 프로토콜을 이용해서 통신하는 응용프로그램은 데이터를 주고받기 전에 먼저 연결을 진행한다.
3-Way Handshake는 이 연결 과정을 의미한다.
TCP (Transmission Control Protocol)
인터넷에서 데이터를 메세지 형식으로 보내기 위해 IP와 함께 사용하는 프로토콜이다.
TCP는 패킷의 추적 및 관리 / IP는 배달을 하게된다.
TCP 특징

- Sequence Number
- Acknowledgement Number
- Control bits
일반적으로 클라이언트 / 서버 둘 다 먼저 요청 할 수 있기 때문에 먼저 요청 한 쪽을 클라이언트 받은 사람을 서버라고 칭함.

1. 클라이언드 ---- (SYN) ---- > 서버
클라이언트가 서버에게 연결을 요청하는 SYN segment를 보낸다.
2. 클라이언트 < ---- (ACK + SYN) ---- 서버
1. 서버가 클라이언트의 SYN segment에 대한 ACK segment 전송
2. 동시에 서버가 클라이언트에게 연결을 요청하는 SYN segment를 전송 (SYN bit을 1로 설정)
3. SYN/ACK 를 전송하고 SYN RCVD(Received)의 상태로 클라이언트의 ACK 기다린다.
4. 클라이언트는 ACK segment를 받고 연결이 완료 된 ESTAB 상태가 된다.
3. 클라이언트 ---- (ACK) ---- > 서버
클라이언트는 서버의 SYN에 대하여 ACK를 전송한다.
서버는 ACK를 받고 ESTAB가 된다.

4-Way Handshake은 연결을 해제 (Connecntion Termination)하는 과정이다.
FIN 플래그(세션을 종료시키는데 사용되며, 더 이상 보낸 데이터가 없음을 의미)를 사용한다.
1. 클라이언드 ---- (FIN) ---- > 서버
클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다.
2. 클라이언트 < ---- (ACK) ---- 서버
서버는 FIN을 받고 확인했단는 ACK를 보내고 자신의 통신이 끝날 때 까지 기다린다 (TIME_WAIT 상태)
3. 클라이언트 < ---- (FIN) ---- 서버
데이터를 모두 보냈다면 FIN을 클라이언트에게 보낸 후 승인을 기다리는 LAST_ACK상태로 들어감
4. 클라이언드 ---- (ACK) ---- > 서버
클라이트는 FIN을 받고 ACK를 보낸다.
뒤늦게 도착하는 패킷을 대비하기 위해 클라언트는 일정시간을(디폴트 240초)기다린 후 소켓을 닫는다. < (TIME_WAIT)