CS/네트워크 - Top-down Approach + @

TCP의 연결과 종료 과정 - 흐름제어, 혼잡제어, 재전송 제어, 3-way handshake, 4-way handshake

조금씩 차근차근 2025. 4. 18. 19:12

본 게시글은 그림으로 공부하는 TCP/IP 구조 도서를 참고하였습니다.

 

TCP 의 주요 동작과 그 성공 시나리오들을 알아보자.

TCP 연결의 상태 다이어그램. 아래 글과 함께 보면서 흐름을 읽어나가길 권장한다.

 

TCP의 상태는 크게 다음과 같이 분류할 수 있다.

  • 접속 시작 단계
    • 액티브 오픈
      • 클라이언트가 커넥션을 만들어가는 처리를 의미한다.
    • 패시브 오픈
      • 서버가 클라이언트의 연결 요청을 받아들이는 처리를 의미한다.
  • 접속 확립 단계
  • 접속 종료 단계
    • 액티브 클로즈
      • FIN/ACK을 먼저 송출해서 커넥션을 종료하려는 처리를 의미한다.
    • 패시브 클로즈
      • FIN/ACK을 받고, 커넥션을 종료하는 과정을 받아들이려는 처리를 의미한다.

TCP는 컨트롤 비트를 구성하는 8개 플래그를 '0' 또는 '1'로 설정해 다음 그림과 같이 TCP 커넥션 상태를 제어한다.

각 단계 별 주요 동작으로는 다음과 같은 것들이 있다.

  • 접속 시작 단계
    • 3-way handshake
  • 접속 확립 단계
    • 흐름 제어
    • 혼잡 제어
    • 재전송 제어
  • 접속 종료 단계
    • 4-way handshake

지금부터 각 단계의 주요 동작과, 그 동작 방식에 대해 알아보자.

접속 시작 단계: 3-way handshake

3-way handshake의 시퀀스 다이어그램.

  • 3번의 통신과정을 거쳐, 연결을 수립하는 과정을 의미한다.
    • 양자 간에 송신 파이프/수신 파이프를 함께 열어야 하므로, 3번의 통신 과정이 필요하다.

작동 방식

  1. 먼저 클라이언트는 CLOSED, 서버는 LISTEN 상태에서 시작한다.
  • 예시) 웹 브라우저에서 웹 서버에 HTTP로 액세스하는 경우
    • 웹 브라우저는 웹 서버에 액세스하지 않는 한 CLOSED 상태이다.
    • 웹 서버는 기본으로 80번 포트를 LISTEN 으로 하고, 커넥션을 받아들일 수 있다.
  1. 클라이언트는 SYN 플래그를 '1', 시퀀스 번호에 무작위값(그림의 x)를 설정한 SYN 패킷을 송신하고, 오픈 처리에 들어간다.
  • 이때, 클라이언트는 SYN-SENT 상태로 전이하고, SYN/ACK 패킷을 기다린다.
  1. SYN 패킷을 받아들인 서버는 패시브 오픈 처리를 시작한다.
  • SYN 플래그와 ACK 플래그를 '1'로 설정한 SYN/ACK 패킷을 반환한다.
  • SYN-RECEIVED 상태로 전이한다.
  • 이때 시퀀스 번호는 무작위(그림의 y), 확인 응답 번호는 SYN 패킷의 시퀀스 번호에 '1'을 더한 값(x+1)이 된다.
  1. SYN/ACK 패킷을 받아들인 클라이언트는 ACK 플래그를 '1'로 설정한 ACK 패킷을 반환하고, ESTABLISHED 상태로 전이한다.
  2. ACK 패킷을 받아들인 서버도 ESTABLISHED 상태로 전이한다.

접속 확립 단계: 흐름 제어

통신 도중의 흐름 제어를 나타내는 상태 다이어그램.

  • 수신 측 단말이 수행하는 흐름 양 조정을 의미한다.
  • 수신 측 단말은 "윈도우 사이즈" 필드를 이용해, 자신이 받을 수 있는 데이터 양을 알린다.
  • 송신 측 단말은 해당 "윈도우 사이즈" 양 이상으로 데이터를 보내지 않음으로써, 버퍼에 들어가지 못하고 버려지는 데이터가 없도록 만든다.

접속 확립 단계: 혼잡 제어

네트워크에 갑작스레 지나치게 많은 데이터가 올라가면, 버퍼가 감당할 수 없는 상황이 발생할 수 있다.

  • 송신 측 단말이 수행하는 흐름 양 조정을 의미한다.

cwnd

  • Congestion Window
  • 혼잡 제어 알고리즘에서 조절하는 패킷 송신 수

대략적인 동작 방식

  1. 최초에, slow start를 통해 차근차근 cwnd를 늘려나간다.
  • RTT마다 2배씩 cwnd를 늘려나간다.
  1. 혼잡이 감지되면, cwnd를 다시 낮춘다.
  2. 이전에 혼잡이 발생한 부근까지 즉시 cwnd를 올린다.
  3. cwnd를 주기적으로 조금씩 더 올려보며, 시험해본다.

이를 2~4번을 반복하며 송신한다.

혼잡 감지 방식

  • 로그 기반
    • 패킷 로스가 발생하면, 혼잡이라고 판단한다.
  • 지연 기반
    • 지연이 발생하면 혼잡이라고 판단한다.
  • 하이브리드 기반
    • 패킷 로스와 지연 양쪽을 종합적으로 고려해 혼잡이라고 판단한다.

접속 확립 단계: 재전송 제어

  • 패킷 유실이 발생했을 때 수행하는 패킷 재전송 기능을 의미한다.
  • 재전송 제어는 다음 두가지 상황에서 발생한다.
    • 중복 ACK(Duplicate ACK)
    • 재전송 타임아웃(RTO)

중복 ACK(Duplicate ACK) - Fast Retransmit

중복 ACK를 표현하는 시퀀스 다이어그램.

  • 확인 응답이 같은 ACK 패킷을 연속해서 송출할 때, 해당 ACK 패킷을 duplicate ACK 라고 한다.
  • 송신 측 단말은 일정 수 이상 중복 ACK를 받으면, 대상이 되는 TCP 세그먼트를 재전송한다.
  • 중복 ACK 를 트리거로 하는 재전송 제어를 Fast Retransmit이라고 한다.
  • 해당 Fast Retransmit 이 발생하는 중복 ACK의 기준값은 OS나 그 버전에 따라 다르다.

재전송 타임아웃(RTO)

재전송 타임아웃 발생 흐름을 표현한 시퀀스 다이어그램.

  • ACK 패킷을 기다리기까지의 시간을 재전송 타이머로 유지하는 방식이다.
  • 재전송 타이머는 ACK 패킷을 받으면 초기화된다.

접속 종료 단계: 4-way handshake

  • 4번의 통신과정을 거쳐, 연결을 종료하는 과정을 의미한다.
    • 일반적으로 커넥션은 자신의 송신 파이프를 먼저 끊는 것으로 시작한다.
    • 따라서, 상대방 기준에 맞춰 파이프가 완전히 끊어지길 기다려야 하기 때문에, 그 시점부터 3번의 통신 과정이 필요하다.
    • 해당 글의 우아한 커넥션 끊기 내용을 참고하면 좋다.

작동 방식

  1. 연결을 종료하고자 하는 측은 액티브 클로즈 처리를 시작한다.
  • FIN 플래그와 ACK 플래그를 '1'로 한 FIN/ACK 패킷을 송신한다.
  • FIN-WAIT1 상태로 전이한다.
  1. FIN/ACK 패킷을 받은 측은 패시브 클로즈 처리를 시작한다.
  • FIN/ACK패킷에 대한 ACK 패킷을 송신하고, CLOSE-WAIT 상태로 전이한다.
    • 자신의 연결 종료가 준비 완료될때까지 기다리는 시간을 갖는다.
  1. ACK를 받은 액티브 클로즈 측은 패시브 클로즈 측의 FIN/ACK 패킷을 기다리는 FIN-WAIT2 상태로 전이한다.
  2. 패시브 클로즈 측은 자신의 연결 종료 준비가 완료되면, FIN/ACK 패킷을 송신하고, 자신이 송신한 FIN/ACK 패킷에 대한 ACK 패킷, 즉 클로즈 처리에 대한 최후의 ACK 를 기다리는 LAST-ACK 상태로 전이한다.
  3. 패시브 클로즈 측으로부터 FIN/ACK을 받은 클라이언트는 그에 대해 ACK 패킷을 반송하고 TIME-WAIT 상태로 전이한다.
  1. ACK 패킷을 받은 패시브 클로즈 측은 CLOSED 상태로 전이하고, 커넥션을 삭제한다.
  • 이와 함께, 커넥션에 확보하고 있던 모든 자원을 해제한다.
  • 이것으로 패시브 클로즈는 종료된다.
  1. 액티브 클로즈 측은 설정한 시간이 경과하면 CLOSED상태로 전이하고, 커넥션을 삭제한다.
  • 이와 함께, 커넥션에 확보하고 있던 모든 자원을 해제한다.
  • 이것으로 액티브 클로즈는 종료된다.