블로그 이미지

TCP 통신 TIME_WAIT, CLOSE_WAIT의 차이점

2017. 5. 20. 12:02

TCP 통신에 관한 내용으로 면접 질문으로 자주 나오는 TIME_WAIT, CLOSE_WAIT 에 대해서 다뤄 볼까 합니다.


TCP연결이 해제 될때는 FIN 패킷, ACK 패킷을 각각 한번 씩 주고 받으면서 연결을 종료 하게 됩니다.

이때, Close 요청을 먼저한 주체가 누구냐에 따라 Active Close, Passive Close 대상이 달라집니다.

Server와 Client의 구분법으로 보면 안됩니다.

Server가 먼저 연결 해제요청을 할 수 도 있고 Client가 먼저 연결 해제요청을 할 수 도 있습니다.


Active Close :  TCP 연결 해제를 요청한 대상

Passive Close : TCP 연결 해제를 수신한 대상


이 때, 각 대상들은 상태가 존재 합니다.


Active Close 대상의 상태 : FIN_WAIT1, FIN_WAIT2, TIME_WAIT 

Passive Close 대상의 상태 : CLOSE_WAIT 상태, LASK_ACK 상태



FIN 패킷의 의미는 '나는 더 이상 보낼 데이터가 없다. + 연결을 해제 하고 싶다' 로 볼 수 있습니다.

ACK 패킷의 의미는 기존의 TCP에서 동일한 의미로 '알았다' 확인의 의미 입니다.


여기서 중요하게 봐야할 3가지 상태가 있습니다. 각 의미를 살펴 보겠습니다.


1. CLOSE_WAIT

FIN 요청을 수신한 Passive Close는 CLOSE_WAIT 상태로 변경됩니다.

이후, Passive Close는 즉시 Close실행을 하지 않고, TCP 포트를 사용중인 프로세스에게 종료 명령을 내리고 Close 명령을 실행할 때까지 대기 하게 됩니다.

즉, Close 명령을 실행 할 때까지 기다리는 상태 입니다.


2. FIN_WAIT2

Active Close 대상이 Passive Close로 부터 FIN패킷을 기다리는 상태를 FIN_WAIT2 상태라 합니다.

이때, 일정 시간 FIN이 오지 않으면, 자동으로 TIME_WAIT 로 넘어가는 특징이 있습니다.


3. TIME_WAIT

Active Close 대상이 FIN 패킷에 대한 ACK 응답을 송신한 후, 즉시 Disconnect를 하지 않습니다.

세그먼트 Lifetime의 2배 약, 60초 정도 뒤에 실제 연결을 Disconnect 하게 됩니다.

그 이유는 두 가지가 있습니다.


1. 즉시 연결을 종료하고 바로 다음 연결을 맺였을 때, 

첫번째 연결했을때의 데이터 패킷이 뒤늦게 도착하여 Sequence ID가 꼬이는 것을 방지

2. 마지막 ACK 패킷이 손실 되어 Active Close 혼자 연결을 Disconnect 해버리는 경우.