FIN 패킷과 RST 패킷
FIN 패킷과 RST 패킷은 TCP 연결을 종료하거나 강제로 끊을 때 사용되는 제어 패킷이다. 둘 다 “연결 종료”와 관련 있지만, 의미와 동작 방식은 명확히 다르다.
먼저 FIN 패킷(Finish)은 정상적인 연결 종료 요청이다. 한쪽이 더 이상 보낼 데이터가 없을 때 FIN을 보내면, 상대방은 이를 확인(ACK)하고 자신의 데이터 전송이 끝났을 때 다시 FIN을 보낸다. 즉, FIN은 “대화를 정리하고 예의 있게 끝내자”는 신호다. 이 과정은 단계적으로 진행되며, TCP 연결 상태도 TIME_WAIT 같은 종료 상태를 거친다. 정상적인 세션 종료, 애플리케이션 종료 시 사용된다.
반면 RST 패킷(Reset)은 즉시 연결을 강제로 끊는 신호다. 오류가 발생했거나, 존재하지 않는 포트로 접근했거나, 비정상적인 패킷을 받았을 때 사용된다. RST가 발생하면 기존 연결 상태와 상관없이 즉시 세션이 종료되고, 남아 있는 데이터도 무시된다. “지금 이 연결은 잘못됐다, 당장 끊어라”는 의미다.
보안과 스캐닝 관점에서 두 패킷은 매우 중요하다.
Nmap의 FIN/NULL/XMAS 스캔에서는 FIN 같은 비정상 패킷을 보내서 응답을 본다. TCP 규격상 닫힌 포트는 RST로 응답하고, 열린 포트는 응답하지 않는 경우가 많다는 특성을 이용한다. 또한 방화벽이나 서버가 공격으로 판단하면 세션을 끊기 위해 RST를 보내기도 한다.
FIN은 정상적인 연결 종료 요청이다.
RST는 비정상 상황에서 즉시 연결을 종료한다.
FIN은 단계적 종료, RST는 즉시 종료다.
닫힌 포트는 보통 RST로 응답한다.