승상의 코딩 블로그

TCP 연결 종료 과정 본문

잡다한 지식

TCP 연결 종료 과정

양승상 2024. 12. 3. 06:43

통신 프로토콜에 대한 이해는 통신에 대한 이해도를 높여주고 디버깅 시에 유용하게 쓰인다.

 

TCP 연결 종료 과정도 디버깅 시에 유용하게 쓰일 수 있다.


연결 종료 단계

일단은 TCP 가 어떻게 연결 종료되는지를 알아보자.

 

 

출처 : https://en.m.wikipedia.org/wiki/File:TCP_CLOSE.svg

A, B 두 프로그램이 TCP 통신을 하고 있다고 하자.

A 가 연결 종료를 먼저 요청했다고 가정한다.

 

  1. A 에서 FIN 패킷을 보낸다. 
  2. B 에서 A 의 FIN 패킷에 대한 ACK 패킷을 보낸다.
  3. B 에서도 FIN 패킷을 보낸다. (B 도 연결 종료를 요청)
  4. A 는 B의 FIN 패킷에 대한 ACK 패킷을 보낸다. 이 때, 2MSL(Maximum Segment Lifetime) 만큼 대기한다.
    • 2MSL (1~4분 정도) 를 대기하는 이유는 A -> B 로의 마지막 ACK 가 정상적으로 전송됨을 보장하기 위함이다.
      누락될 경우 연결 종료를 위한 패킷을 다시 보낸다.

연결 종료 단계의 TCP 상태

  • FIN_WAIT_1 : FIN 패킷(A->B)에 대한 ACK 를 대기하는 상태
  • FIN_WAIT_2 : 첫번째 FIN 패킷(A->B)에 대한 ACK 를 받은 이후 두번째 FIN 패킷(B->A)을 받을 때까지 대기하는 상태
  • TIME_WAIT : 마지막 ACK(B->A) 이 정상적으로 전송되기 위해 대기하는 상태 (패킷 전송 실패시 재전송 시간을 보장하기 위함)
  • CLOSE_WAIT : 첫번째 ACK (B->A) 이후 프로그램이 정상 종료되기까지 대기하는 상태
  • LAST_ACK : 두번째 FIN(B->A) 패킷전송이후 마지막 ACK 를 대기하는 상태
  • CLOSED: 종료된 상태

 

각 연결 상태는 아주 순식에 사라진다. 하지만 TIME_WAIT 의 상태는 netstat 명령어로 확인이 가능하다.

이를 활용하면 누가 먼저 연결을 종료했는지 확인할 수 있다. (* 정상적인 연결종료상태일 경우)

개인적으로 생각보다 자주 썻다. 기억하고 잘 활용해보자.

CLOSE_WAIT 은 TCP 연결종료단계에서 육안으로 확인가능하다.

2024.12.02 - [Linux (리눅스)] - [Linux] netstat 네트워크 상태 모니터링

 

[Linux] netstat 네트워크 상태 모니터링

TCP 연결 종료에 대한 예외처리를 하지 않아서 UI 상에서 연결이 되었다고 뜨는 상황이 종종 발생한다.당시에 당연히 연결이 된줄 알고 "왜 데이터가 보내지지 않는거지?" 했던 기억이 있다.프로

seungsang.tistory.com

반응형
Comments