SYN_RECV 상태는 TCP 소켓의 상태 중 하나로, 클라이언트가 서버에 TCP 연결을 요청했을 때 발생합니다. 여기서는 시간 순서대로 SYN_RECV 상태에서의 핸드쉐이크 과정과 상태 변화에 대해 각각 연결, 연결 끊기, 강제 연결 끊기 상황에서 설명하겠습니다.
1. 연결 (Connection)
-
클라이언트 요청:
- 클라이언트는 SYN 패킷을 서버에게 보냅니다. 이 패킷에는 클라이언트의 초기 시퀀스 번호와 연결을 요청하는 플래그(SYN)가 포함됩니다.
-
SYN_RECV 상태 진입:
- 서버는 SYN 패킷을 받으면 SYN_RECV 상태로 전환됩니다. 서버는 클라이언트의 초기 시퀀스 번호를 기억하고, 자신의 초기 시퀀스 번호를 선택하여 SYN+ACK 패킷을 클라이언트에게 보냅니다.
-
클라이언트 응답:
- 클라이언트는 SYN+ACK 패킷을 받으면 ACK 패킷을 서버에게 보내서 연결을 확인합니다. 이 과정에서 클라이언트는 자신의 초기 시퀀스 번호를 설정합니다.
-
연결 완료:
- 서버는 ACK 패킷을 받으면 연결이 완료되었다고 인식하고, ESTABLISHED 상태로 전환하여 데이터를 교환할 준비를 합니다.
2. 연결 끊기 (Connection Termination)
-
연결 종료 요청:
- 클라이언트 또는 서버가 연결을 종료하고자 할 때, FIN 패킷을 상대방에게 보냅니다. 이 패킷에는 FIN 플래그가 설정되어 있습니다.
-
SYN_RECV 상태에서의 FIN 수신:
- SYN_RECV 상태의 서버가 FIN 패킷을 받으면, 연결이 종료될 준비를 합니다. 서버는 ACK 패킷을 클라이언트에게 보내고, CLOSE_WAIT 상태로 전환됩니다. 그리고 다시 ACK + FIN 을 보냅니다.
-
연결 종료 완료:
- 클라이언트는 서버의 ACK 패킷을 받으면 CLOSE 상태로 전환하여 종료 과정을 완료합니다. 서버도 연결이 완전히 종료되면 CLOSED 상태가 됩니다.
3. 강제 연결 끊기 (Forced Connection Termination)
-
강제 종료 요청:
- 클라이언트나 서버 중 하나가 문제가 생겨 갑작스럽게 연결을 종료해야 할 때, RST 패킷을 상대방에게 보냅니다. 이 패킷은 연결을 강제로 끊는 목적으로 사용됩니다.
-
SYN_RECV 상태에서의 RST 수신:
- SYN_RECV 상태의 서버가 RST 패킷을 받으면, 연결이 강제로 종료되어야 한다고 판단합니다. 서버는 이에 대한 ACK 패킷을 보내고, CLOSED 상태로 전환됩니다.
-
강제 연결 종료 완료:
- 클라이언트는 서버의 ACK 패킷을 받으면 연결이 강제로 종료되었다고 인식하고, CLOSED 상태로 전환하여 연결을 완전히 끝냅니다.