TCP 연결 수립과 마찬가지로 TCP 연결 종료 시에도 다양한 상태를 거치는 과정이 필요합니다. 

 연결 종료는 연결 수립보다 복잡한데 그 이유는 두 장비 모두 데이터를 주고받는 도중에 연결을 끊기게 됩니다.

 연결을 닫고 싶어하는 대상은 종료에 대해서 알고 있지만 상대방 장비는 연결을 끊으려고 하는 상황을 모를 수 있기 

 때문에 더 많은 단계가 필요합니다. 

 TCP 연결을 닫기 위해서는 연결된 두 장비가 "종료가 될 것이다."는 것을 인지하고 데이터를 더 이상 보내지

 않도록 해야 하기 때문에 연결 종료는 각 장비가 연결을 독립적으로 닫을 수 있도록 구현되어 있습니다.

 장비가 연결 종료를 했다는 것은 데이터를 더 이상 보내지 않는다는 것이므로 상대방 장비가 데이터 보낸다면

 계속 받을 수 있어야 하며 이래야 두 장비가 연결이 종료되기 전에 보낼 데이터를 모두 방출 할 수 있습니다. 

TCP 연결 종료시 사용되는 메시지

메 시 지 설명
FIN(finish) 종료 메시지. TCP 세그먼트의 FIN비트가 설정된 메시지. 장비의 종료 요청을 알린다. 
ACK(acknowledgment) 승인 메지시. 이 메시지는 SYN나 FIN의 메시지 대해서 잘 받았다는 응답을 처리한다.

TCP 연결 종료시 사용되는 TCP 소켓의 상태

상 태 설 명
CLOSE 연결 수립을 시작하기전의 기본 상태(연결 없음)
ESTABLISHED 연결의 수립이 완료된 상태. 서로 데이터를 교환 할 수 있다.
CLOSE-WAIT 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK을 보내고 애플리케이션에 종료를 알린다.
LAST-ACK CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK을 기다리는 상태.
FIN-WAIT-1 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
FIN-WAIT-2 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다린다.
CLOSING 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태
TIME-WAIT 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED로 전이한다.

TCP 정상 연결 종료

TCP 정상종료 과정

 위의 예제는 클라이언트에서 정상적인 종료 요청에 의해서 TCP 연결이 종료되는 것을 보여줍니다.

 클라이언트가 TCP 연결에 대해서 종료를 요청하려면 TCP 헤더의 제어 비드 필드에 FIN 비트를 설정한 FIN 메시지를

 서버에 보냅니다. FIN 메시지를 받은 서버 장비에서는 바로 FIN를 잘 받았다는 ACK 메시지를 보내고 애플리케이션에

 클라이언트에서 종료 요청이 왔다고 알리고, 애플리케이션의 응답을 기다립니다. 

 애플리케이션에서는 종료를 위해서 해야 할 작업을 진행하고 모든 준비를 마치면 종료 준비가 완료되었다고 알리고

 서버장비에서 FIN 메시지를 클라이언트에 보냅니다. FIN 메시지를 받은 클라이언트에서는 ACK 메시지를 보낸 후

 모든 연결 종료 처리를 끝이 나게 됩니다. 

TIME-WAIT 상태

 위의 예제를 보면 클라이언트의 경우 연결이 종료 된 후에 바로 CLOSED 상태로 전환 하지 않고 

 TIME-WAIT 상태로 전환된 후 일정 시간(최대 세그먼트 수명 2배)을 기다린 후에 CLOSED상태로 전환되는 데 그 이유는

  • 상대 장비가 ACK 메시지를 받았다는 것을 가정하기 위해서 일정한 시간을 둡니다. 
  • 한 연결의 종료와 다음 연결간에 일정 시간을 둡니다. 이런 시간을 둠으로써  다른 연결에서 온 패킷과 자신의 패킷이 뒤섞이는것을 방지합니다.

+ Recent posts