TIME_WAIT 이 필요한 이유
TIME_WAIT이 필요한 이유에 대해서 좋은 글을 발견했다. link
이번 포스트에서는 TIME_WAIT 상태가 왜 필요하고, 왜 그렇게 길게 설정되어 있는지 이유를 살펴보자. 만일 TIME_WAIT이 짧다면 아래와 같은 두 가지 문제가 발생한다.
첫 번째는 지연 패킷이 발생할 경우다.
이미 다른 연결로 진행되었다면 지연 패킷이 뒤늦게 도달해 문제가 발생한다. 매우 드문 경우이긴 하나 때마침 SEQ까지 동일하다면 잘못된 데이타를 처리하게 되고 데이타 무결성 문제가 발생한다.
두 번째는 원격 종단의 연결이 닫혔는지 확인해야할 경우다.
마지막 ACK 유실시 상대방은 LAST_ACK 상태에 빠지게 되고 새로운 SYN 패킷 전달시 RST를 리턴한다. 새로운 연결은 오류를 내며 실패한다. 이미 연결을 시도한 상태이기 때문에 상대방에게 접속 오류 메시지가 출력될 것이다.
따라서 반드시 TIME_WAIT이 일정 시간 남아 있어서 패킷의 오동작을 막아야 한다.
여기서 또 한가지 질문이 생길수 있다. 마지막 FIN 또는 ACK가 계속해서 유실이 일어나서 2MSL 타임을 넘어가면 어떻게 될까? 분약 Client(Active Close)의 경우에는 TIME_WAIT 상태의 2MSL 타임이 지났으므로 CLOSE 상태가 된다. 하지만 Server(Passive Close)입장에서는 LAST_ACK 상태에 무한정 대기하게 된다. 이론적으로는 그렇지만 실제로는 서버가 재전송을 해야하는 횟수등을 정해두고 그 횟수가 넘어가면 연결을 Reset하는 방식으로 해결한다. link