[네트워크] TCP 3-Way Handshake, 4-Way Handshake

3-Way Handshake

TCP(Transmission Control Protocol)는 안정적인 통신을 제공하기 위해 데이터를 송수신하는 양쪽이 연결을 설정하고 해제하는 과정이 필요하다. 이 중에서도 연결을 설정하는 과정인 3-way handshake는 TCP 통신의 핵심이다.

 

이를 통해 송신자와 수신자는 서로를 신뢰할 수 있는 상태로 연결한다.

 

이 과정은 세 번의 메시지 교환을 통해 이루어지며, 각 단계는 다음과 같다.

 

 

1. SYN: 연결 요청

먼저 클라이언트가 서버에 연결 요청을 보낸다. 이를 SYN 패킷이라고 부른다.

 

클라이언트는 이 패킷에 초기 순서 번호(ISN, Initial Sequence Number)를 포함해 보내고, 서버에게 "연결을 시작하자"는 신호를 보낸다.

 

여기서 중요한 점은 TCP가 연결형 프로토콜이기 때문에 이 과정이 필요하다는 것이다.

 

2. SYN-ACK: 연결 수락

서버는 클라이언트로부터 SYN 패킷을 받으면, 이를 확인하고 응답을 보낸다.

 

이때 SYN-ACK 패킷을 보내는데, 이 패킷에는 서버가 설정한 ISN과 클라이언트의 SYN에 대한 응답(ACK, Acknowledgment)이 포함된다. 즉, 서버는 클라이언트의 연결 요청을 수락하고, 동시에 서버도 연결을 준비했다는 의미다.

 

 

3. ACK: 연결 확인

클라이언트는 서버로부터 SYN-ACK 패킷을 받으면, 이를 확인한 후 ACK 패킷을 보낸다.

 

이 ACK 패킷은 서버가 보낸 SYN-ACK 패킷을 잘 받았다는 의미다.

이 단계가 완료되면, 클라이언트와 서버 간의 연결이 확립된다. 이제 양쪽은 데이터를 주고받을 준비가 된 것이다.

 

 

4-Way Handshake

TCP(Transmission Control Protocol)는 데이터를 신뢰성 있게 전달하기 위해 연결을 설정할 때는 3-way handshake를 사용하고, 연결을 해제할 때는 4-way handshake를 사용한다. TCP 연결 해제는 연결 설정보다 더 복잡한 절차를 따른다. 이를 통해 송신자와 수신자는 데이터 전송이 끝났음을 서로 확인하고, 연결을 깔끔하게 종료한다. 각 단계는 다음과 같다.

 

1. FIN: 연결 종료 요청

TCP 연결을 종료하려는 쪽, 즉 클라이언트나 서버 중 하나가 연결 해제를 원하면 FIN(Finish) 플래그가 설정된 패킷을 상대방에게 보낸다.

 

이 FIN 패킷은 “더 이상 보낼 데이터가 없다”는 의미로, 데이터를 모두 보낸 후에 전송된다.

하지만, FIN을 보낸 쪽은 아직 상대방으로부터 수신할 데이터가 있을 수 있기 때문에 연결이 완전히 끊어진 상태는 아니다.

 

이 단계에서 연결을 종료하는 쪽은 송신을 중단하지만, 여전히 상대방으로부터 수신을 할 수 있는 상태에 놓인다.

TCP는 양방향 통신이 가능하기 때문에, 한쪽이 종료를 요청해도 다른 쪽이 처리해야 할 작업이 남아있을 수 있다.

 

 

2. ACK: 종료 요청 수락

FIN 패킷을 받은 상대방(서버 또는 클라이언트)은 이 종료 요청을 받았음을 확인하고, ACK(Acknowledgment) 패킷을 응답으로 보낸다.

 

이 ACK 패킷은 "너의 종료 요청을 잘 받았다"는 의미로, 상대방이 FIN 패킷을 수신했다는 것을 알리는 역할을 한다.

 

이때 중요한 점은, ACK 패킷이 수신된 것만으로도 연결이 곧바로 종료되지 않는다는 것이다.

상대방은 여전히 보낼 데이터가 남아 있을 수 있기 때문에 연결은 여전히 열려 있고, 추가적인 데이터 전송이 가능하다.

 

 

3. FIN: 상대방의 종료 요청

상대방이 자신이 보낼 데이터를 모두 전송하고 나면, 이번에는 상대방이 종료를 요청하는 FIN 패킷을 보낸다.

 

앞서 첫 번째 FIN 패킷과는 반대 방향으로 전달되는 이 FIN 패킷은 "나도 이제 보낼 데이터가 없다"는 신호다. 이렇게 양쪽 모두 연결 해제를 원하는 상태가 되었음을 의미한다.

 

이 단계가 중요한 이유는, TCP는 양방향 통신을 지원하기 때문에 양쪽 모두가 데이터 전송을 마쳤음을 확인해야만 연결을 완전히 해제할 수 있기 때문이다.

 

한쪽의 FIN 요청이 수락되었다고 해서, 연결 전체가 종료된 것은 아니므로, 반대쪽에서도 FIN 패킷을 보내는 절차가 필요하다.

 

 

4. ACK: 연결 종료 확인

마지막으로, 상대방으로부터 FIN 패킷을 받은 측은 이를 확인하고, 다시 한 번 ACK 패킷을 응답으로 보낸다.

 

이 ACK 패킷을 받으면 상대방은 자신이 보낸 FIN 패킷이 잘 전달되었고, 연결이 완전히 종료되었다는 것을 알게 된다. 이제 양쪽 모두 연결 해제를 확인했으며, 더 이상 데이터를 주고받지 않게 된다.

 

이 ACK 패킷이 마지막으로 교환되면 연결이 완전히 끊기며, TCP 통신이 종료된다. 이제 시스템은 해당 연결에 할당되었던 리소스를 해제하고, 새로운 연결을 위해 사용할 수 있게 된다.

 

 

연결 종료 대기 (TIME_WAIT 상태)

TCP에서는 연결을 종료할 때 TIME_WAIT 상태가 등장한다.

FIN/ACK 메시지가 교환된 후에도 바로 모든 리소스를 해제하지 않고, 일정 시간 동안 연결 정보를 유지하는 단계다.

 

이 과정은 연결이 완벽하게 종료되었는지 확인하기 위해 존재한다. 만약 통신 과정 중 손실된 패킷이 있다면 재전송할 기회를 주기 위해 TCP는 일정 시간 동안 TIME_WAIT 상태를 유지하며, 이 기간 동안 다른 연결을 처리할 수 있는 준비를 한다.

 

TIME_WAIT 상태의 지속 시간은 일반적으로 2MSL(Maximum Segment Lifetime)로 정의되며, MSL은 네트워크 상에서 패킷이 존재할 수 있는 최대 시간을 의미한다.

이 시간 동안 시스템은 재전송이 필요한 패킷이 없을 경우, 연결이 안전하게 종료되었음을 확인한다.