CS

CS_네트워크_TCP 흐름제어 & 혼잡제어

99duuk 2024. 6. 3. 04:13

 Internet 프로토콜은 두 호스트 사이에서 데이터를 주고 받는 프로토콜이다.

다른 목적지 호스트로 보내는데 전송만 하면 된다.

 

하지만 인터넷 프로토콜은 데이터가 유실될 수도 있고 순서가 보장되지 않는다. 

즉, 신뢰할 수 없다.

 

그러나 프로세스 간의 통신에는 

데이터를 안정적으로 주고 받을 수 있어야 한다. 

=> TCP 프로토콜


■  TCP(Transmission Control Protocol)

TCP는 연결 지향적 프로토콜로, 데이터의 신뢰성과 순서를 보장한다.

송신자와 수신자 사이에 안정적인 연결을 설정하여 데이터가 올바르게 전달되도록 한다.

주로 파일 전송, 이메일, 웹 브라우징 등에서 사용한다. 

 

 

 

 

■  TCP는 기본적으로 신뢰할 수 없는 네트워크(unreliable network)에서, 신뢰할 수 있는 통신(reliable network)를 보장할 수 있도록 하는 프로토콜이다.

(unreliable : internet protocol을 거의 그대로 사용)

 

        → reliable network를 보장한다는 것은 4가지 문제점이 존재한다.

                   1. 손실 (Packet Loss) : 데이터 전송 과정에서 패킷이 중간에 손실되는 현상

 

                   2. 순서 바뀜 (Out-of-Order Delivery) : 패킷이 전송되는 과정에서 경로가 달라지거나

                          네트워크 장치의 처리 지연 등으로 인해 패킷이 전송된 순서와 다르게 수신되는 현상

 

                   3. 혼잡 (Congestion) : 네트워크 경로에 과도한 트래픽이 집중되어 네트워크 성능이 저하되는 현상이다.

 

                   4. 오버로드 (Overload) : 수신자가 처리할 수 있는 용량을 초과하는 트래픽이 도착하여 수신자가 과부하 상태에 빠지는 현상

 

 


 

 

흐름제어

송수신 측 데이터 처리 속도 차이 해결

 

송신자가 수신자의 처리 능력을 초과하는 데이터를 보내지 않도록 조절한다. 

 (수신자가 패킷을 지나치게 받지 않도록 조절하는 것을 말한다.)

 

이를 위해 윈도우 크기 조절 기법을 사용한다.

(Stop and Wait와 Sliding Window는 흐름 제어 기법의 일부로, 윈도우 크기 조절을 구현하는 방식이다.)

 

 

■ 윈도우 크기 조절

네트워크 통신에서 송신자가 수신자의 처리 능력을 초과하지 않도록 전송 데이터를 관리하는 흐름제어 메커니즘이다.

 

  - 수신자가 처리할 수 있는 양의 데이터만 보내도록 하여,

     수신자가 패킷을 지나치게 많이 받아 버퍼 오버플로우가 발생하지 않도록 한다.

 

 

 

□ Stop and Wait

     - 윈도우 크기1이다. 즉, 송신자는 한 번에 하나의 패킷만 보낸다.

 

     - 송신자가 하나의 패킷을 보낸 후, 수신자로부터 해당 패킷에 대한 ACK(승인 응답)을 받을 때까지 기다린다.

       ACK를 받으면 다음 패킷을 보낸다

 

     - 구현이 간단하다.

       송신자는 항상 수신자의 ACK를 기다리므로 데이터 손실이 적다.

       하지만 네트워크 대역폭을 비효율적으로 사용한다. 각 패킷에 대해 ACK를 기다려야 하므로 대기 시간이 길어진다

 

 

 

 

□ Sliding Window 

   - 송신자가 여러 패킷을 연속적으로 전송할 수 있게 한다.

     수신자는 자신의 수신 버퍼 크기에 따라 수신할 수 있는 데이터 양을 윈도우 크기로 송신자에게 알린다.

 

   - 송신자는 윈도우 크기 내에서 여러 패킷을 연속적으로 보낸다.

      수신자는 수신한 패킷에 대해 ACK를 보낸다.

      송신자는 수신자로부터 ACK를 받으면 윈도우를 이동(slide)하여 새로운 패킷을 전송할 수 있게 된다.

      윈도우 크기는 수신자의 수신 버퍼 상태에 따라 조절된다. 

 

 

 

    - 네트워크 대역폭을 효율적으로 사용하며, 높은 데이터 전송률을 유지할 수 있다.

     하지만 구현이 비교적 복잡하며, 패킷 손실이 발생할 경우 윈도우 크기 조절과 재전송 관리가 필요하다. 

 

 

 

 

 

이들은 모두 데이터를 송수신하는 동안 윈도우 크기를 관리하는 방법이다. 

 

Stop and Wait는 윈도우 크기가 1인 매우 단순한 형태이고,

Sliding Window는 여러 패킷을 한 번에 전송할 수 있는 더 복잡하고 효율적인 형태이다.

두 방식 모두 TCP의 흐름제어에서 윈도우 크기를 조절하는 기법으로 사용되며,

 

송수신 사이의 데이터 전송을 효율적으로 관리해, 네트워크의 성능을 최적화하고 데이터 손실을 최소화 한다. 

 


혼잡제어

송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결 

흐름제어가 송수신측 전송 속도를 다루는 데 반해, 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송 문제를 다룬다.

 

한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리할 수 없게 된다.

이런 경우 호스트는 또 다시 재전송을 하게 되고, 

혼잡은 가중되어 오버플로우나 데이터 손실이 발생하게 된다. 

 

따라서 이러한 네트워크 혼잡을 피하기 위해 송신 측에서 보내는 데이터의 전송 속도를 강제로 줄이게 되는데, 

이러한 작업을 혼잡제어라고 한다. 

 

이를 위해 느린 시작(Slow Start), 혼잡 회피(Congestion Avoidance), 빠른 재전송(Fast Retransmit), 빠른 회복(Fast Recovery) 등의 방법을 사용한다. 

 

 


□ AIMD (Additive Increase/Multiplicative Decrease) (합 증가/ 곱 감소)

     - TCP 혼잡 제어의 근본 개념으로서, 느린 시작과 혼잡 회피의 기본 원리를 설명한다.

 

 

     - Additive Increase : 네트워크가 혼잡하지 않을 때, 윈도우 크기를 선형적으로 증가시킴

         혼잡 회피 단계에서 사용된다.

         매 RTT마다 cwnd를 1 MMS씩 증가시킨다.

        

 

     - Mutiplicative Decrease : 네트워크 혼잡이 감지되면 윈도우 크기를 곱셈적으로 감소시킴

         혼잡이 감지되면 ssthresh를 현재 cwnd의 절반으로 설정하고, cwnd를 초기값으로 줄인다. 

         혼잡 회피와 패킷 손실 처리에 중요한 역할을 한다. 

 

 

("Round-Trip Time”의 약자로, 패킷이 송신지에서 수신지로 전달된 후, 다시 송신지로 돌아오는 데 걸리는 시간을 의미 

"ssthresh”는 “slow start threshold”의 약자로, 네트워크의 혼잡 상태를 관리하기 위해 사용되며, 주로 혼잡 윈도우(cwnd) 크기를 결정하는 기준점으로 작용)

 

 


□ Slow Start 

     - 새로운 연결 초기 단계에서 네트워크를 혼잡하게 하지 않기 위해 윈도우 크기를 천천히 증가시키는 것

 

     - 연결이 처음 수립되거나 패킷 손실이 발생한 후, 윈도우 크기(cwnd)를 작은 값(일반적으로 1 MSS, Maximum Segment Size)으로 설정한다.

      각 ACK를 받을 때마다 cwnd를 1MMS씩 증가시킨다.

      cwnd의 증가 속도는 지수적으로 증가한다. 즉, 매 RTT마다 cwnd가 두 배가 된다.

      cwnd가 특정 입계값(ssthresh)에 도달할 때까지 이 과정을 반복한다.

 

     - cwnd가 ssthresh에 도달하면 Slow Start는 종료되고 Congest Avoidance 단계로 전환된다. 

    

 

 

 

■ Congestion Avoidance

     - 네트워크 혼잡을 피하면서도 효율적인 데이터 전송을 유지하기 위해 윈도우 크기를 점진적으로 증가시키는 것

 

     - Slow Start 단계에서 ssthresh에 도달하면 혼잡 회피가 시작된다.

       cwnd의 증가 속도는 선형적으로 조절된다. 즉, 매 RTT마다 cwnd가 두 배가 된다

       

    - 혼잡 발생 시 패킷 손실이 발생하면 sshthresh와 cwnd를 조정한다.

       ssthresh는 현재 cwnd의 절반으로 설정되고,

       cwnd는 1MMS로 줄어들어 다시 느린 시작 단계로 돌아간다. 

 

 

 

■ Fast Retansmit (빠른 재전송)

     - 패킷 손실을 빠르게 감지하고 재전송하여 데이터 흐름을 유지하는 것

 

     - 수신자가 동일한 패킷에 대해 중복 ACK를 세 번(혹은 그 이상)보내면,

       송신자는 해당 패킷이 손실되었음을 인지한다.

       타이머가 만료되기 전에 손실된 패킷을 즉시 재전송한다.

       타임아웃을 기다리지 않고 빠르게 손실된 패킷을 처리함으로써 데이터 전송의 지연을 최소화한다. 

       

 

 

 

■ Fast Recovery (빠른 회복)

     - 패킷 손실 후 혼잡 윈도우 크기를 급격하게 줄이지 않고, 빠르게 데이터 전송을 회복하는 것

 

     - Fast Retansmit 이후, 송신자는 ssthresh를 현재 cwnd의 절반으로 설정하고, 

       cwnd를 ssthresh + 3 MMS로 설정한다.

       추가 중복 ACK를 받을 때마다 cwnd를 1 MMS씩 증가시킨다.

       새로운 ACK를 받으면 (즉, 손실된 패킷 이후 모든 패킷이 ACK됨)

       cwnd를 ssthresh로 설정하고 혼잡 회피 단계로 돌아간다. 

     

    

       

 

 

 

이 네 가지 혼잡 제어 메커니즘(Slow Start, Congestion Avoidance, Fast Retransmit, Fast Recovery)과 AIMD는 TCP 혼잡 제어의 핵심을 구성하며,

 

각 메커니즘은 네트워크 상태에 따라 윈도우 크기를 조정해 혼잡을 예방하고,

패킷 손실 시 빠르게 회복하는 방법을 제공한다.

 

 

 


[ 요약 ]

흐름제어

  • 흐름제어 (Flow Control):
    • 목적: 송신자가 수신자의 처리 능력을 초과하는 데이터를 보내지 않도록 조절
    • 방법: 윈도우 크기 조절 기법(예: Sliding Window)을 사용하여 수신자가 처리할 수 있는 데이터 양을 송신자에게 알려주고, 송신자는 이를 기반으로 데이터를 전송
    • 예시: Stop-and-Wait, Sliding Window

윈도우 크기 조절 방식

  1. Stop-and-Wait
    • 윈도우 크기: 1
    • 특징: 송신자는 한 번에 하나의 패킷만 보내고, ACK를 받을 때까지 기다림
    • 장점: 구현이 간단하고, 데이터 손실이 적음
    • 단점: 대기 시간이 길고, 네트워크 대역폭 사용이 비효율적
  2. Sliding Window
    • 윈도우 크기: 수신 버퍼 크기에 따라 가변적
    • 특징: 송신자는 윈도우 크기 내에서 여러 패킷을 연속적으로 보냄. 수신자는 ACK를 보내고, 송신자는 ACK를 받으면 윈도우를 이동시켜(slideing) 다음 데이터를 전송
    • 장점: 네트워크 대역폭을 효율적으로 사용하며, 높은 데이터 전송률을 유지 가능
    • 단점: 구현이 복잡하고, 패킷 손실 시 윈도우 크기 조절과 재전송 관리가 필요

 

 

 

 

혼잡제어

혼잡제어 (Congestion Control):

  • 목적: 네트워크 혼잡을 예방하고 완화하여 전체 네트워크 성능을 최적화
  • 방법: 송신 측에서 보내는 데이터의 전송 속도를 조절하여 네트워크 혼잡을 관리
    • 느린 시작 (Slow Start): 새로운 연결 초기 단계에서 네트워크를 혼잡하게 하지 않기 위해 윈도우 크기를 천천히 증가시킴
    • 혼잡 회피 (Congestion Avoidance): 네트워크 혼잡을 피하면서도 효율적인 데이터 전송을 유지하기 위해 윈도우 크기를 점진적으로 증가시킴
    • 빠른 재전송 (Fast Retransmit): 패킷 손실을 빠르게 감지하고 재전송하여 데이터 흐름을 유지
    • 빠른 회복 (Fast Recovery): 패킷 손실 후 혼잡 윈도우 크기를 급격히 줄이지 않고, 빠르게 데이터 전송을 회복

AIMD (Additive Increase/Multiplicative Decrease)

  • 기본 개념: 느린 시작과 혼잡 회피의 기본 원리를 설명하는 TCP 혼잡 제어의 근본 개념
    • Additive Increase: 네트워크가 혼잡하지 않을 때 윈도우 크기를 선형적으로 증가시킴 (매 RTT마다 1 MSS씩 증가)
    • Multiplicative Decrease: 네트워크 혼잡이 감지되면 윈도우 크기를 곱셈적으로 감소시킴 (ssthresh를 현재 cwnd의 절반으로 설정하고, cwnd를 초기값으로 줄임)

Slow Start

  • 목적: 새로운 연결 초기 단계에서 네트워크를 혼잡하게 하지 않기 위해 윈도우 크기를 천천히 증가시킴
  • 작동 방식: 연결이 처음 수립되거나 패킷 손실이 발생한 후, 윈도우 크기(cwnd)를 작은 값(일반적으로 1 MSS)으로 설정하고 각 ACK를 받을 때마다 cwnd를 지수적으로 증가시킴. cwnd가 ssthresh에 도달하면 Slow Start는 종료되고 Congestion Avoidance 단계로 전환

Congestion Avoidance

  • 목적: 네트워크 혼잡을 피하면서도 효율적인 데이터 전송을 유지하기 위해 윈도우 크기를 점진적으로 증가시킴
  • 작동 방식: Slow Start 단계에서 ssthresh에 도달하면 혼잡 회피가 시작됨. cwnd의 증가 속도는 선형적으로 조절되며, 혼잡 발생 시 ssthresh를 현재 cwnd의 절반으로 설정하고, cwnd는 1 MSS로 줄여 다시 Slow Start 단계로 돌아감

Fast Retransmit

  • 목적: 패킷 손실을 빠르게 감지하고 재전송하여 데이터 흐름을 유지
  • 작동 방식: 수신자가 동일한 패킷에 대해 중복 ACK를 세 번(혹은 그 이상) 보내면, 송신자는 해당 패킷이 손실되었음을 인지하고 타이머가 만료되기 전에 손실된 패킷을 즉시 재전송

Fast Recovery

  • 목적: 패킷 손실 후 혼잡 윈도우 크기를 급격히 줄이지 않고, 빠르게 데이터 전송을 회복
  • 작동 방식: Fast Retransmit 이후, 송신자는 ssthresh를 현재 cwnd의 절반으로 설정하고, cwnd를 ssthresh + 3 MSS로 설정. 추가 중복 ACK를 받을 때마다 cwnd를 1 MSS씩 증가시킴. 새로운 ACK를 받으면 cwnd를 ssthresh로 설정하고 Congestion Avoidance 단계로 돌아감