# 3-way handshake, 4-way handshake 흐름에 대해서 설명해 주세요.

* **TCP 3-way handshake**는 TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
* 3-way handshake가 TCP의 연결을 초기화할 때 사용한다면, **4-way handshake**는 세션을 종료하기 위해 수행되는 절차다.

**3-way handshake**

1. 클라이언트는 서버에 접속을 요청하는 `SYN` 패킷을 보낸다. 이때 클라이언트는 `SYN`을 보내고 `SYN/ACK` 응답을 기다리는 `SYN_SENT`상태, 서버는 `Wait for Client` 상태이다.
2. 서버는 `SYN` 요청을 받고 클라이언트에게 요청을 수락한다는 `ACK`와 `SYN flag`가 설정된 패킷을 발송하고 클라이언트가 다시 `ACK`로 응답하기를 기다린다. 이때 서버는 `SYN_RECEIVED` 상태가 된다.
3. 클라이언트는 서버에게 `ACK`를 보내고 이후부터는 연결이 이루어지고 데이터가 오가게 되는 것이다. 이때의 서버 상태는 `ESTABLISHED`이다.

![img\_4.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-6a1039248224b4113d15343494527e1432c9ea8c%2Fimg_4.png?alt=media)

\\

**4-way handshake**

1. 클라이언트가 연결을 종료하겠다는 `FIN` 플래그를 전송한다. 이때 클라이언트는 `FIN-WAIT` 상태가 된다.
2. 서버는 `FIN` 플래그를 받고, 일단 확인 메시지 `ACK`를 보낸 후 자신의 통신이 끝날 때까지 기다리는데 이 상태가 서버의 `CLOSE_WAIT` 상태이다.
3. 연결을 종료할 준비가 되면, 연결해지를 위한 준비가 되었음을 알리기 위해 클라이언트에게 `FIN` 플래그를 전송한다. 이때 서버의 상태는 `LAST-ACK` 이다.
4. 클라이언트는 해지준비가 되었다는 `ACK`를 확인했다는 메시지를 보낸다. 클라이언트의 상태가 `FIN-WAIT`에서 `TIME-WAIT`으로 변경된다.

![img\_5.png](https://2900387690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOjEy54f4ToLNl5n9gmZs%2Fuploads%2Fgit-blob-6ae99fa33874f7bb2593ea7f748d8238e9f4d574%2Fimg_5.png?alt=media)
