해당 글은 VSFe 깃허브 레포를 참고하여 작성한 글입니다. (아래 출처에 표기)
✅ 4-Way Handshake에 대해 설명해 주세요.
3-Way Handshake가 TCP 연결을 설정하는 과정이었다면, 4-Way Handshake는 TCP 연결을 종료하는 과정으로, 클라이언트와 서버 간의 연결을 정상적으로 종료하기 위해 사용된다. 여기서 FIN 플래그를 사용한다.
3-Way Handshake와 관련된 자세한 설명은 여기를 참고하면 좋을 것 같다.
▶ 플래그 정보
FLAG | 기능 | 설명 |
ACK | 응답 확인 | Acknowledgement 패킷을 받았다는 것을 의미하며, Acknowledgement Number 필드가 유효한지 나타낸다. |
FIN | 연결 해제 | Finish 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다. |
▶ 포트 상태 정보
STATE | 설명 |
FIN_WAIT_1 | close()를 호출 후 FIN 패킷을 보내고, 응답을 대기하는 상태 |
CLOSE_WAIT | 연결 종료 요청을 받고 진입하는 상태로, 남아 있는 데이터가 있다면 이를 전송한 후 close()를 호출하여 연결을 종료 |
FIN_WAIT_2 | 연결 종료 요청에 대한 응답을 받고, 서버가 FIN 패킷을 보낼 때까지 대기 |
LAST_ACK | 모든 데이터를 전송한 후 FIN 패킷을 전송하고, 상대방의 ACK 응답을 대기 |
TIME_WAIT | FIN 패킷을 받은 후 ACK 응답을 보낸 상태, 의도치 않은 에러로 인해 연결이 데드락에 빠지는 것을 방지 |
▶ 4-Way Handshake 동작 과정
- Client -> Server (FIN)
- 클라이언트가 close()가 호출하여 연결 종료를 요청한다.
- 클라이언트는 서버에게 연결을 종료를 알리는 FIN 패킷을 전송한다. 이 패킷에는 FIN 플래그가 설정되어 있으며, 데이터 전송을 확인하기 위한 ACK 플래그도 포함된다.
- 클라이언트는 이 패킷을 보낸 후 FIN_WAIT_1 상태로 전환된다.
- Server -> Client (ACK)
- 서버는 클라이언트로부터 FIN 패킷을 수신한다.
- 서버는 FIN 패킷을 수신한 것을 확인하기 위해 ACK 패킷을 클라이언트에게 응답으로 보낸 후 CLOSE_WAIT 상태로 전환된다.
- 서버는 남아있는 데이터가 있다면 이를 전송한 후, close()를 호출한다.
- 클라이언트는 서버가 ACK 패킷을 받은 후, 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다리는 FIN_WAIT_2 상태로 전환된다.
- Server -> Client (FIN)
- 서버가 모든 데이터를 전송한 후, 연결 종료를 완료하기 위해 FIN 패킷을 클라이언트에게 보낸다.
- 서버는 이 FIN 패킷을 클라이언트가 ACK 응답을 받을 때까지 LAST_ACK 상태로 대기한다.
- Client -> Server (ACK)
- 클라이언트는 서버의 FIN 패킷을 수신하고, 이를 확인하기 위해 ACK 패킷을 서버에게 보낸다.
- 클라이언트는 서버가 아직 데이터를 전송 중일 수 있으므로, 서버가 소켓을 닫을 때까지 TIME_WAIT 상태로 대기한다.
- TIME_WAIT 상태는 연결 종료 후 의도치 않은 에러나 패킷이 남아있는 상황을 방지한다.
- 만약 에러로 인해 종료가 지연되다가 시간이 초과되면 CLOSED 상태로 전환된다.
- 서버는 클라이언트로부터 ACK 패킷을 수신한 후 소켓을 닫는다. (CLOSED)
- 클라이언트는 TIME_WAIT 시간이 지나면 연결을 완전히 종료한다. (CLOSED)
✅ 패킷이 4-way handshake 목적인지 어떻게 파악할 수 있을까요?
패킷이 4-Way Handshake의 목적을 가진 것인지 확인하려면, 패킷의 FIN 플래그가 설정되어 있는지 확인하면 된다.
✅ 빨리 끊어야 할 경우엔, (즉, 4-way Handshake를 할 여유가 없다면) 어떻게 종료할 수 있을까요?
▶ Abrupt Connection Release(갑작스러운 연결 해제)
Abrupt Connection Release는 TCP 연결을 4-Way Handshake와 같은 정상적인 종료 절차를 거치지 않고 강제로 종료하는 방식이다. 이 방법은 빠르게 연결을 종료해야 할 필요가 있을 때 사용된다.
- RST(Reset) 플래그 사용
- 발신자가 연결을 즉시 종료하고자 할 때, RST(Reset) 플래그가 설정된 TCP 패킷을 전송한다.
- 수신자는 RST 패킷을 받으면 즉시 연결을 종료하고, 관련 자원을 해제한다.
- 이 방식은 데이터 손실이나 상태 불일치의 위험이 있지만, 빠르게 연결 종료할 수 있다.
✅ 4-Way Handshake 과정에서 중간에 한쪽 네트워크가 강제로 종료된다면, 반대쪽은 이를 어떻게 인식할 수 있을까요?
4-Way Handshake 과정에서 한쪽 네트워크가 강제로 종료된다면, 반대쪽 네트워크는 TCP timeout을 통해 이를 인식할 수 있다.
- TCP timeout: 한쪽이 패킷을 보내고 이에 대한 응답을 기다리는데, 응답이 일정 시간 내에 도착하지 않으면 TCP는 연결이 종료되었거나 문제가 발생했다고 판단하고 연결을 종료한다.
✅ 왜 종료 후에 바로 끝나지 않고, TIME_WAIT 상태로 대기하는 것일까요?
서버가 FIN 패킷을 보낸 후 클라이언트는 ACK 패킷을 전송한다. 그리고 클라이언트는 TIME_WAIT 상태로 대기한다. TIME_WAIT 상태는 TCP 연결 종료 후에도 일정 기간 동안 유지되는 상태이다.
- 연결 종료 과정에서 남아 있을 수 있는 지연된 패킷을 처리하기 위해 TIME_WAIT 상태를 유지한다.
- 예: 서버가 FIN 패킷을 전송하기 전에 보낸 패킷이 라우팅 지연이나 패킷 유실로 인하여 재전송되며 FIN 패킷보다 늦게 도착할 수 있다.
RST를 사용하여 연결을 종료해야 하는 경우
1. 보안 위반: 악성 코드나 보안 위협에 대응할 필요가 있는 경우
2. 자원 부족: 시스템 자원이 부족하여 연결을 해제하고 자원을 회수해야 하는 경우
3. TCP 연결 장애: 네트워크 오류나 TCP 연결에 장애가 발생한 경우
📍 문제 출처
Tech-Interview / 03-NETWORK.md
📍 참고 자료
'Programming > Network' 카테고리의 다른 글
[Network] DNS (0) | 2024.08.18 |
---|---|
[Network] www.github.com을 브라우저에 입력하면? (0) | 2024.08.18 |
[Network] 3-way Handshake (0) | 2024.08.14 |
[Network] OSI 7계층 (0) | 2024.08.11 |
[Network] IP (0) | 2024.08.06 |