오늘은 TCP/IP 네트워크 환경에서 서버와 클라이언트를 연결하는데 필요한 프로세스 중에 3-Way Handshake에 대해서 정리해보자.
TCP는 장치들 사이에 논리적인 접속을 성립하기 위해 3-Way Handshake를 사용하는데, 이는 TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 뜻한다.
TCP 프로토콜은 연결지향적이기 때문에 상대방이 내 신호를 받을 수 있는지 확인하고 전송한다. 이 때 내 신호를 상대가 받을 수 있는지 확인하는 과정이 바로 3-Way Handshake이다.

기본적으로 위 그림과 같은 과정을 통해 진행된다. 간단하게 설명하자면 먼저 클라이언트가 서버쪽에 자신의 신호를 받을 수 있는지 묻고, 그걸 받은 서버에서는 응답과 함께 클라이언트도 자신의 신호를 받을 수 있는지 묻는다. 마지막으로 클라이언트가 다시 서버에 받을 수 있다고 응답하면 TCP 연결이 수립된다.
1단계에서는 클라이언트가 연결 요청 메시지(SYN - Synchronize Sequence Number)을 전송하는데 임의의 랜덤 숫자를 같이 전송하고 LISTEN 상태에서 SYS-SENT 상태가 된다.
2단계, 즉 서버가 요청을 받으면 해당 요청을 수락하며 클라이언트 쪽에도 연결 요청 메시지를 보내는데 해당 메시지는 ACK(Acknowledgement)를 포함하고 있으며 이 값은 SYN + 1한 값의 된다. SYN과 ACK를 함께 보내고 LISTEN 상태에서 SYN-RECEIVED 상태가 된다.
3단계는 클라이언트가 서버의 요청을 받으며 마찬가지로 Sequence Number + 1 한 값을 ACK로 전송하게 되고 클라이언트는 ESTABLISHED 상태가 되며, 이후 서버가 해당 ACK를 받게 되면 서버도 마찬가지로 ESTABLISHED 상태가 되며 연결이 이루어진다.

TCP는 양방향 연결이기 때문에 클라이언트가 서버에 요청을 보내 확인한 것처럼 서버도 클라이언트에 요청을 보내고 응답이 오는 것을 확인해야 하는데 이를 위한 최소한의 과정이 바로 3-Way Handshake라고 할 수 있다.