Programming/Network

[Network] 4-Way Handshake

soeun2537 2024. 8. 14. 20:29
해당 글은 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 동작 과정

  1. Client -> Server (FIN)
    • 클라이언트가 close()가 호출하여 연결 종료를 요청한다.
    • 클라이언트는 서버에게 연결을 종료를 알리는 FIN 패킷을 전송한다. 이 패킷에는 FIN 플래그가 설정되어 있으며, 데이터 전송을 확인하기 위한 ACK 플래그도 포함된다.
    • 클라이언트는 이 패킷을 보낸 후 FIN_WAIT_1 상태로 전환된다.
  2. Server -> Client (ACK)
    • 서버는 클라이언트로부터 FIN 패킷을 수신한다.
    • 서버는 FIN 패킷을 수신한 것을 확인하기 위해 ACK 패킷을 클라이언트에게 응답으로 보낸 후 CLOSE_WAIT 상태로 전환된다.
    • 서버는 남아있는 데이터가 있다면 이를 전송한 후, close()를 호출한다.
    • 클라이언트는 서버가 ACK 패킷을 받은 후, 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다리는 FIN_WAIT_2 상태로 전환된다.
  3. Server -> Client (FIN)
    • 서버가 모든 데이터를 전송한 후, 연결 종료를 완료하기 위해 FIN 패킷을 클라이언트에게 보낸다.
    • 서버는 이 FIN 패킷을 클라이언트가 ACK 응답을 받을 때까지 LAST_ACK 상태로 대기한다.
  4. Client -> Server (ACK)
    • 클라이언트는 서버의 FIN 패킷을 수신하고, 이를 확인하기 위해 ACK 패킷을 서버에게 보낸다.
    • 클라이언트는 서버가 아직 데이터를 전송 중일 수 있으므로, 서버가 소켓을 닫을 때까지 TIME_WAIT 상태로 대기한다.
      • TIME_WAIT 상태는 연결 종료 후 의도치 않은 에러나 패킷이 남아있는 상황을 방지한다.
      • 만약 에러로 인해 종료가 지연되다가 시간이 초과되면 CLOSED 상태로 전환된다.
  5. 서버는 클라이언트로부터 ACK 패킷을 수신한 후 소켓을 닫는다. (CLOSED)
  6. 클라이언트는 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) 플래그 사용
    1. 발신자가 연결을 즉시 종료하고자 할 때, RST(Reset) 플래그가 설정된 TCP 패킷을 전송한다.
    2. 수신자는 RST 패킷을 받으면 즉시 연결을 종료하고, 관련 자원을 해제한다.
    3. 이 방식은 데이터 손실이나 상태 불일치의 위험이 있지만, 빠르게 연결 종료할 수 있다.

 

 

✅ 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

 

📍 참고 자료