TCP 4way handshake and TIME_WAIT

TCP 연결 해제 과정

1. 과정

  • 클라이언트와 서버 둘다 ESTABLISED 상태에서 시작한다.

  • 클라이언트에서 먼저 closed() 호출하여 FIN 을 서버에 보낸다.

    • FIN : 전송자가 데이터 전송을 완료했고 더이상 응답을 기대하지 않는다는 것을 알리는 플래그. 세그먼트 형태로 전달된다.

    • 클라이언트는 이 직후, FIN_WAIT_1 상태로 전환된다.

  • 서버는 클라이언트에게 ACK 플래그를 전달하고, 자신도 CLOSE_WAIT 상태로 전환된다. 이때 클라이언트는 FIN_WAIT_2 로 전환된다.

  • 서버는 LAST_ACK 상태가 되고 일정한 시간 이후에 클라이언트에 FIN 이라는 세그먼트를 보낸다.

  • 클라이언트는 서버로부터 FIN 을 받고 나서 TIME_WAIT 상태로 전환된다. 다시 서버에게 ACK 플래그를 보낸다. 그러면 서버 역시 CLOSED 상태가 된다.

  • 클라이언트는 어느정도의 시간 (TIME_WAIT)을 대기한 후에 연결이 닫히게 된다.

2. TIME_WAIT

  • 소켓이 바로 소멸되지 않고, 일정 시간 유지되는 상태를 말하며, 지연 패킷 등의 문제점을 해결하는데 쓰인다.

    • 지연 패킷이 존재할 가능성이 있기 때문에 얼마간 기다려서 데이터의 무결성을 보장하기 위함이다.

    • 보통 두배의 최대 세그먼트 수명(MSL, Maximum Segment Lifetime) 시간을 기다린다.

    • 기본적으로는 MSL은 2분이다.

      • 하지만 OS에 따라서 다르다.

      • CentOS, Ubuntu : 60sec

      • Window : 4min

  • 또한, 연결을 올바르게 닫힌 상태로 만들기 위해서도 존재한다. 만약 클라이언트나 서버가 CLOSED 상태로 종료되지 않고, LASK_ACK 상태로 남아있다면, 다음 연결때 오류가 난다.

Last updated