FIN_WAIT_1, FIN_WAIT_2, TIME_WAIT 상태란?

netstat 명령어로 프로세스 상태를 확인하다 보면 FIN_WAIT_1, FIN_WAIT_2, TIME_WAIT의 연결 상태를 보게 됩니다. 때로는 너무 많은 프로세스가 이런 WAIT 상태에 놓여있기도 합니다. 이는 TCP 연결 종료 과정에서 나타나는 상태입니다. 각각이 어떤 의미인지 TCP의 단계별 연결 종료 과정을 알아보겠습니다. 

FIN_WAIT / TIME_WAIT

FIN 패킷과 ACK 패킷

FIN_WAIT와 TIME_WAIT을 이해하려면 먼저 FIN 패킷과 ACK 패킷을 알아야 합니다. TCP 통신에서는 이러한 패킷을 통해 전송 중인 데이터의 연결 상태를 확인합니다.

 

1. FIN 패킷

FIN 패킷은 TCP 연결을 종료하려고 할 때 사용되는 제어 패킷입니다. FIN은 종료를 의미하는 finsh의 약자입니다. 연결된 두 장치 중 한쪽에서 연결 종료를 원할 때 FIN 패킷을 전송합니다. 이 패킷을 수신하면 연결 종료 과정이 시작됩니다.

 

2. ACK 패킷

ACK 패킷은 패킷이 정상적으로 수신되었음을 확인하기 위해 사용되는 제어 패킷입니다. ACK는 승인을 의미하는 Acknowledgment의 약자입니다. 예를 들어, 장치가 상대 장치에 데이터를 전송하면 상대 장치는 전송된 데이터를 받았음을 알리기 위해 ACK 패킷을 돌려보냅니다.

 

FIN_WAIT_1 / FIN_WAIT_2 / TIME_WAIT 상태 차이

FIN_WAIT_1, FIN_WAIT_2, TIME_WAIT은 TCP 연결이 종료되는 과정에서 FIN과 ACK 패킷을 주고받으며 단계적으로 변경됩니다. 예를 들어, 클라이언트-서버 구조에서 TCP 연결 종료 과정은 대략 아래와 같습니다.

 

1. 클라이언트가 연결을 종료하길 원할 때, 서버에 FIN 패킷을 보냅니다. 이때 클라이언트는 FIN_WAIT_1 상태가 됩니다.

 

2. 서버는 FIN 패킷을 받고, 종료 요청을 확인하기 위해 ACK 패킷을 되돌려 보냅니다. 이때 서버는 CLOSE_WAIT 상태가 되며 클라이언트는 FIN_WAIT_2 상태가 됩니다.

 

3. 서버는 자신이 전송할 모든 데이터를 전송하고 클라이언트에 자신도 연결을 종료하겠다는 의미로 FIN 패킷을 전송합니다. 이때 서버는 LAST_WAIT 상태가 됩니다.

 

4. 클라이언트는 FIN 받았다는 의미로 ACK 패킷을 다시 서버에 전달합니다. 이때 클라이언트는 TIME_WAIT 상태가 됩니다.

 

5. 서버는 클라이언트로부터 ACK 패킷을 받으면 연결을 완전히 종료하고, 자신도 CLOSED 상태가 됩니다.

 

간단히 말해 FIN_WAIT_1과 FIN_WAIT_2는 상대방의 연결 종료 요청을 기다리는 단계입니다. TIME_WAIT는 연결 종료를 위한 마지막 대기 단계입니다.

 

4-way-handshake
TCP 연결 종료 과정. 패킷을 총 4번 주고 받기 때문에 4-way-handshake라고 부른다. 출처=benohead.com

 

프로세스를 강제 종료하는 이유?

결론적으로 컴퓨터에 FIN_WAIT 상태로 대기하는 프로세스가 많다는 건 연결 종료가 원활하게 이루어지지 못하고 있다는 의미일 수 있습니다. 이런 경우 연결 종료 대기의 원인 프로세스를 종료할 경우 종료되지 않는 현상이 나타나기도 합니다. 정상적인 종료 방법을 따르면 연결된 리소스를 모두 해제하는 과정을 거치는데 FIN_WAIT는 연결이 완전히 종료된 상태가 아니기 때문입니다. 이런 경우에 강제 종료를 사용합니다.

반응형

댓글

Designed by JB FACTORY