4-WAY 핸드세이크 과정
1. 클라이언트 -> 서버: FIN
• 클라이언트 상태: ESTABLISHED -> FIN_WAIT_1
• 클라이언트가 연결 종료를 요청하는 FIN 패킷을 서버에 보냅니다. 이 패킷은 더 이상 데이터를 보내지 않겠다는 의사를 표시합니다.
• 서버 상태: ESTABLISHED -> CLOSE_WAIT
• 서버가 클라이언트의 FIN 패킷을 수신하고, 더 이상 데이터를 받을 준비를 합니다.
2. 서버 -> 클라이언트: ACK
• 클라이언트 상태: FIN_WAIT_1 -> FIN_WAIT_2
• 서버가 클라이언트의 FIN 패킷을 수신한 후, 확인 응답(ACK) 패킷을 클라이언트에 보냅니다.
• 서버 상태: CLOSE_WAIT
• 서버는 ACK 패킷을 보내고, 여전히 클라이언트로 데이터를 보낼 수 있는 상태를 유지합니다.
3. 서버 -> 클라이언트: FIN
• 서버 상태: CLOSE_WAIT -> LAST_ACK
• 서버가 자신의 데이터 전송을 완료한 후, 연결을 종료하겠다는 FIN 패킷을 클라이언트에 보냅니다.
• 클라이언트 상태: FIN_WAIT_2 -> TIME_WAIT
• 클라이언트는 서버의 FIN 패킷을 수신하고, 연결 종료를 확인합니다.
4. 클라이언트 -> 서버: ACK
• 서버 상태: LAST_ACK -> CLOSED
• 클라이언트가 서버의 FIN 패킷에 대한 확인 응답(ACK) 패킷을 서버에 보냅니다. 이로써 서버는 연결이 종료됨을 확인하고, 상태를 CLOSED로 변경합니다.
• 클라이언트 상태: TIME_WAIT -> CLOSED
• 클라이언트는 일정 시간 동안 TIME-WAIT 상태에 머무른 후, 연결이 완전히 종료됩니다.
데이터의 무결성을 보장