TCP 통신에서 수신 측이 송신 측보다 데이터 처리 속도가 느릴 경우, 데이터를 손실할 위험이 존재하게 됩니다. 흐름 제어는 송신 측에서 전송하는 데이터의 양을 제어하는 방식으로 데이터 처리 속도를 일치시킵니다. 즉, 흐름 제어란 송신 측과 수신 측 간의 Packet 수를 제어하는 기능이라고 할 수 있습니다.
Flow Control(흐름 제어)는 송신 측과 수신 측 간의 데이터 전송 속도를 조정하여 수신 측 버퍼 오버플로우를 방지하고 효율적인 통신을 보장하는 중요한 메커니즘입니다.
송신 측 데이터 전송량이 수신 측 데이터 처리량 보다 많다면 수신측 버퍼에 데이터가 쌓이게 됩니다. 이로 인해 데이터 손실 및 통신 끊김 등 다양한 문제 발생할 가능성이 있습니다.
TCP는 주로 윈도우 크기(Window Size)를 기반으로 흐름 제어를 수행합니다. 아래에서 흐름 제어의 동작 방식과 구현 방법을 설명합니다.
매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
슬라이딩 윈도우는 Stop ans Wait 방식의 비효율적인 부분(매번 전송한 패킷에 대한 확인 응답을 받아야지만 다음 패킷을 전송함)을 개선한 방법.
윈도우는 송신 측이 ACK를 받지 않고 전송할 수 있는 데이터의 양을 의미함.
TCP 연결은 양방향으로 동작하며, 각 측은 자신의 수신 버퍼 크기를 기반으로 윈도우 크기를 조정함.
송신 측은 수신 측이 설정한 윈도우 크기만큼 데이터를 보내고, ACK를 수신하여 윈도우를 슬라이딩 하면서 새로운 데이터를 전송함
윈도우에 포함된 패킷을 계속 전송하고, 수신 측으로부터 확인 응답이 오면 윈도우를 옆으로 옮겨 다음 패킷들을 전송한다.
데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다. 이때 송신 측에서는 라우터가 처리하지 못한 데이터를 손실 데이터로 간주하고 계속 재전송하여 네트워크를 혼잡하게 한다. 이런 상황은 송신 측의 전송 속도를 적절히 조절하여 예방할 수 있는데, 이것을 혼잡 제어라고 한다.
즉 혼잡 제어란 네트워크 내의 패킷 수를 조절하여 네트워크의 오버플로우를 방지하는 기능이다.
우리 말로 직역하면 합 증가/곱 감소 방식이다. AIMD 방식은 처음에 패킷을 하나씩 보내고 문제 없이 도착하면 윈도우의 크기를 1씩 증가시켜가며 전송한다. 만약, 전송에 실패하면 윈도우 크기를 반으로 줄인다. 윈도우 크기를 너무 조금씩 늘리기 때문에 네트워크의 모든 대역을 활용하여 제대로 된 속도로 통신하기까지 시간이 오래 걸린다는 단점이 있다.
AIMD 방식이 네트워크의 수용량 주변에서는 효율적으로 동작하지만, 처음에 전송 속도를 올리는데 시간이 오래 걸리는 단점이 존재한다.
Slow Start 방식은 AIMD와 마찬가지로 패킷을 하나씩 보내면서 시작하고, 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window size를 1씩 늘려준다. 즉, 한 주기가 지나면 window size가 2배로 된다.
전송 속도는 AIMD에 반해 지수 함수 꼴로 증가한다. 대신에 혼잡 현상이 발생하면 Window size를 1로 떨어뜨리게 된다.
처음에는 네트워크 수용량을 예상할 수 있는 정보가 없지만, 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있다.
그러므로 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킨다.