Search
Duplicate
🌊

흐름제어와 혼잡제어

간단소개
네트워크의 흐름제어와 혼잡제어에 대한 간단한 설명
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Network
Scrap
태그
network
9 more properties

0. 흐름 제어? 혼잡 제어?

흐름 제어와 혼잡 제어, 언뜻 보면 비슷해 보이는 두 기능에 대해 알아보겠습니다.

용어 정리

통신(communication): 데이터를 주고받는 행위
애플리케이션(application): 통신에 사용하는 프로그램
송신자(sender): 통신에서 데이터를 전송하는 사람
수신자(receiver): 통신에서 데이터를 받는 사람

1. 믿을 수 없는 네트워크

흐름 제어와 혼잡 제어는 왜 필요할까?

송신자와 수신자가 서로 통신하는 상황을 생각해 봅시다.
송신자는 수신자에게 데이터를 전송하고 수신자는 송신자가 보낸 데이터를 빠짐없이, 순서에 맞게 받을 것입니다.
이렇게 송신자가 전송한 데이터가 수신자에게 아무 문제 없이 갈 수 있다면 좋겠지만, 현실의 네트워크는 그렇지 않습니다.

비신뢰적 네트워크

현실의 네트워크는 송신자가 보낸 데이터를 잃어버리기도 하고, 데이터의 순서가 바뀌기도 합니다.
이러한 네트워크를 비신뢰적 네트워크(unreliable network)라고 부릅니다.
이름 그대로 믿을 수 없는 네트워크입니다.

비신뢰적 네트워크에서 발생하는 문제

비신뢰적 네트워크에서 발생할 수 있는 문제는 아래와 같습니다.
손실(lost): 패킷이 손실될 수 있는 문제
순서 바뀜: 패킷의 순서가 바뀌는 문제
혼잡(Congestion): 네트워크가 혼잡한 문제
과부하(Overload): 수신자가 과부하 되는 문제
비신뢰적 네트워크에서 송신자가 수신자에게 데이터를 잘 보내고 싶으면 어떻게 해야 할까요?
이러한 상황에서 데이터를 안정적으로 보낼 수 있도록 도와주는 것이 바로 TCP입니다.

2. 믿을 수 있는 프로토콜: TCP

TCP(Transmission Control Protocol)는 신뢰적인 데이터 전송을 보장해주는 프로토콜입니다.
신뢰적인 데이터 전송은 데이터가 빠짐없이 순서에 맞게 가는 것을 의미합니다.
비신뢰적인 네트워크에서 데이터를 전송할 때, TCP는 다양한 기능을 통해 데이터를 신뢰성 있게 보낼 수 있도록 도와줍니다.
앞으로 살펴볼 흐름 제어와 혼잡 제어도 TCP의 기능입니다.

3. 데이터는 어떻게 전송될까?

송신자부터 수신자까지 데이터가 전송되는 과정을 살펴보고, 발생할 수 있는 문제점을 알아봅시다.

통신 과정

통신 과정을 간단히 정리하면 아래와 같습니다.
1.
송신자가 수신자에게 데이터 전송을 시작합니다.
2.
송신자가 데이터를 전송하면 TCP에 의해 데이터가 보내집니다.
3.
데이터는 네트워크를 통해 수신자에게 도착합니다.
4.
도착한 데이터는 수신자의 버퍼에 저장됩니다.
5.
수신자의 애플리케이션이 버퍼에 저장된 데이터를 읽으면 전송이 완료됩니다.

통신에서 발생할 수 있는 문제점

위 과정은 무난해 보이지만 생각보다 많은 문제점이 있습니다.
첫 번째, 송신자가 엄청나게 빠른 속도를 데이터를 전송하면 어떨까요?
수신자의 버퍼에 데이터가 가득 차게 되고, 버퍼가 가득 차 있는 동안에 데이터를 잃어버릴 것입니다.
두 번째, 사용하는 네트워크에 엄청나게 많은 인원이 데이터를 전송해 정체 현상이 발생하는 상황은 어떨까요?
이 경우에도 데이터는 잘 전송되지 않을 것입니다.
흐름 제어와 혼잡 제어는 이러한 상황을 해결하기 위한 기능입니다.
각 기능들을 하나씩 알아봅시다.

4. 흐름 제어란?

흐름 제어는 송신자의 전송 속도와 수신자의 처리 속도의 차이에서 생기는 문제를 해결하기 위한 기능입니다.

흐름 제어가 필요한 상황

첫 번째, 송신자가 데이터를 전송하는 속도가 수신자가 데이터를 처리하는 속도보다 빠른 상황입니다.
이 경우 수신자의 버퍼에는 미처 처리하지 못한 데이터가 쌓이게 됩니다.
이렇게 수신자의 버퍼는 가득 차게 되고, 버퍼가 가득 차있는 동안 전달된 데이터는 손실됩니다.

흐름 제어의 해결 방식

어떻게 송신자와 수신자의 속도 차이 문제를 해결할 수 있을까요?
흐름 제어는 송신자의 데이터 전송 속도를 조절합니다.
수신자가 데이터를 처리하는 속도만큼 송신자가 데이터를 천천히 보내게 하여 문제를 해결합니다.
흐름 제어의 기본 과정은 아래와 같습니다.
1.
송신자가 수신자에게 데이터를 보냅니다.
2.
수신자는 송신자에게 데이터를 받을 때마다 자신의 남은 버퍼 공간을 알려줍니다.
3.
송신자는 수신자가 보낸 정보를 보고 자신의 데이터 전송 속도를 조절합니다.

Stop and Wait 방식

데이터를 보낼 때마다 매번 위 과정을 반복하는 것이 Stop and Wait 방식입니다.
그림 1. Stop and Wait 방식
Stop and Wait 방식은 송신자가 데이터를 하나 보낼 때마다 수신자의 응답을 기다립니다.
구현이 간단하다는 장점은 있지만 매우 비효율적인 방법입니다.

Sliding Window 방식

비효율적인 Stop and Wait 방식을 개선한 것 중 하나는 Sliding Window 방식입니다.
Sliding Window 방식은 데이터를 하나만 보내고 기다리는 것이 아닌, 한 번에 여러 개의 데이터를 보내고 수신자의 응답을 기다립니다.
그림 2. Sliding Window 방식

5. 혼잡 제어란?

혼잡제어는 송신자의 전송 속도와 네트워크의 처리속도 차이로 인한 문제를 해결하기 위한 기능입니다.

혼잡 제어가 필요한 상황

두 번째, 송신자가 사용하는 네트워크에 엄청나게 많은 인원이 데이터를 전송하는 상황입니다.
라우터는 네트워크에서 송신자가 보낸 데이터를 알맞은 수신자에게 보내주는 장치입니다.
라우터 또한 데이터를 처리하는 속도와 처리할 데이터를 보관해두는 버퍼가 있습니다.
라우터가 데이터를 처리하는 속도보다 많은 양의 데이터가 들어오는 경우 문제가 발생하게 됩니다.
송신자는 라우터가 처리하지 못한 데이터를 잃어버린 것으로 간주하고 다시 데이터를 보냅니다.
이 과정이 반복되며 네트워크는 점점 혼잡해 집니다.

혼잡 제어의 해결 방식

혼잡 제어 또한 송신자의 데이터의 전송 속도를 조절합니다.
이를 통해 네트워크에 전송되는 데이터가 과도하게 증가하는 현상을 방지합니다.
그림 3. 혼잡제어 예시
혼잡 제어를 위해 AIMD(Additive Increase / Multiplicative Decrease)라는 기술을 사용합니다.
AIMD는 처음에 조금씩 패킷을 보내다가, 패킷이 문제 없이 도착하면 전송량을 조금씩 늘려갑니다.
만약 패킷 전송에 실패하게 되면 네트워크가 혼잡하다고 판단하고 패킷 전송 속도를 절반으로 줄입니다.
이외에 혼잡 제어에는 Slow Start, Fast Retransmit, Fast Recovery등의 기술이 사용됩니다.

6. 정리

흐름 제어와 혼잡 제어 모두 TCP의 신뢰성 있는 데이터 전송을 위한 기능입니다.
두 기능의 공통점은 송신자의 전송 속도를 제어함으로써 데이터 전송 시 오류를 줄이는 기능이라는 것입니다.
두 기능의 차이점은 흐름 제어는 송수신 측 사이의 패킷 수를 제어하는 기능이고, 혼잡제어는 네트워크 내의 패킷 수를 조절하는 기능이라는 것입니다.

7. 참고 자료