1️⃣ 흐름 제어 (Flow Control)
1) 개념
흐름 제어는 송신 측과 수신 측의 데이터 처리 속도의 차이를 해결하기 위한 방법이다. TCP의 특징중 하나는 패킷 교환 방식의 네트워크에서 패킷들의 안전한 전송을 보장해준다는 것이다. 그러나 패킷을 전송할 때 네트워크 상황에 따라 패킷의 도착 순서가 바뀌거나 유실될 수가 있다. 따라서 TCP는 패킷 번호를 통해 신뢰성 있는 데이터를 전송하고, 순서를 보장한다. 이를 위해선 수신 측에서 데이터 과부하를 송신 측에 통보하는 '피드백 메커니즘'이 필요하다.
패킷을 한 번에 하나씩 송수신하는 것보단 여러 패킷을 한 번에 송수신한 뒤 확인 응답 신호를 전송하는 것이 효율적이기 때문에 흐름 제어를 통해 이동하는 패킷의 양을 조절한다. 수신 측에서 한 번에 받을 수 있는 패킷의 양은 정해져있다. 만약 송신 측의 전송량이 수신 측의 수신량보다 많다면 전송된 패킷중 일부는 손실될 수 있다. 따라서 수신 측의 버퍼 크기에 따라 송신 측의 데이터 전송량을 조절해줄 필요가 있다. 즉, TCP 흐름 제어는 송수신 측 간의 데이터 전송 속도를 조절하여 네트워크 혼잡을 방지하고, 데이터 손실을 최소화하는 데에 도움이 된다. 이를 통해 안정적인 데이터 전송을 보장한다.
2) 종류
1) Stop and Wait (정지-대기 방식)
정지-대기 방식은 수신 측의 버퍼가 가득 차거나 수신 측이 데이터를 처리할 준비가 되지 않은 경우에 송신 측에서 데이터 전송을 중지하고 대기하는 방식이다. 따라서 전송한 패킷에 대한 확인 응답을 받은 뒤에 다음 패킷을 전송한다. 다음은 정지-대기 방식의 동작 과정이다.

- 송신 측은 데이터를 전송할 때마다 수신 측으로부터 확인 메시지인 ACK를 기다린다.
- 수신 측은 데이터를 수신할 때마다 해당 데이터를 확인하고 ACK를 송신 측에 전송한다.
- 만약 수신 측의 버퍼가 가득 차거나 수신 측이 데이터를 처리할 준비가 되지 않은 상태라면, ACK를 전송하지 않는다.
- 3의 경우 ACK를 받을 때까지 대기하며, 데이터 전송을 중지한다.
- 수신 측이 버퍼를 비우거나 데이터 처리 준비가 되면 ACK를 송신 측에 전송하고, 송신 측은 데이터 전송을 다시 시작한다.
2) Sliding Window (Go-Back-N-ARQ)
슬라이딩 윈도우 방식은 데이터를 안정적으로 전송하기 위해 송수신 측 간의 '윈도우 크기'를 동적으로 조절하는 방법이다. 여기서 윈도우 크기는 확인 응답을 하나씩 하지 않고, 연속하여 송수신할 수 있는 데이터의 크기를 말한다. 데이터를 전송할 때 한 번에 전송할 수 있는 전체 패킷의 크기를 'TCP 윈도우 크기'라고 하며, 윈도우 크기가 클수록 한 번에 많은 패킷을 전송할 수 있다. 이는 수신 측에서 설정한 윈도우 크기를 따르며, 송신 측에서 ACK를 받기 전까진 해당 크기 만큼 데이터를 전송할 수 있다. 송신 측 버퍼의 범위는 수신 측 여유 버퍼 공간을 반영하여 동적으로 바뀐다.

예를 들어 송신 측 컴퓨터에서 한 번에 전송할 송신 윈도우 크기가 패킷 4개의 크기라고 하자. 송신 측은 윈도우 크기에 따라 1~4번 패킷을 전송하고, 수신 측에서 수신 확인 ACK 신호를 수신하면 ACK 신호에서 요청한 5번 패킷 위치로 송신 윈도우를 옮긴다. 다시 윈도우 안의 패킷을 전송하고, 수신 측에서 ACK 신호를 수신하면 ACK 신호에서 요청한 9번 패킷 위치로 송신 윈도우를 옮긴다. 다음의 단계로 일반화할 수 있다.
- 송신 측은 수신 측에게 데이터를 전송할 때 윈도우 크기를 지정한다.
- 수신 측은 받을 준비가 된 데이터 범위를 윈도우 내에 표시한다. 윈도우의 시작과 끝은 수신 측이 받을 수 있는 데이터 범위를 나타낸다.
- 송신 측은 윈도우 내의 데이터를 전송하고 ACK를 기다린다. ACK를 받으면 요청한만큼 윈도우를 이동한다.
- 수신 측은 데이터를 받으면 해당 데이터를 확인하고 ACK를 송신 측에 전송한다. 이는 윈도우 크기를 조절하고, 어떤 데이터를 받았는지 알려준다.
- 송신 측은 ACK를 받으면 윈도우를 이동시켜 새로운 데이터를 전송하고, 데이터 전송 속도를 조절한다.
2️⃣ 혼잡 제어 (Congestion Control)
1) 개념
혼잡 제어는 네트워크로 유입되는 데이터 트래픽의 양이 네트워크 용량을 초과하지 않도록 유지하는 방법이다. 만약 데이터 총량이 네트워크가 처리할 수 있는 허용량을 초과하면 네트워크는 '혼잡 상태'가 된다. 흐름 제어는 송신 측과 수신 측 사이의 데이터 전송 속도를 다루는데에 반해 혼잡 제어는 호스트와 라우터를 포함한 넓은 관점에서 전송 문제를 다룬다. 즉, 흐름 제어는 송신 측과 수신 측의 데이터 처리 속도 차이를 해결하기 위한 기법이고 혼잡 제어는 송신 측의 데이터 전달 속도와 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법이다.

2) 종류

- AIMD
- Slow Start
- Congestion Avoidance
- Fast Retransmit
- Fast Recovery
1) AIMD (Additive Increase Multiplicative Decrease : 합 증가 곱 감소)

혼잡 제어 알고리즘 중 하나로, 네트워크 혼잡을 관리하기 위해 송신 측의 전송 속도를 동적으로 조절하는 알고리즘이다. 처음에 패킷을 하나씩 보내고 문제가 없다면 윈도우 크기를 1씩 증가시키며 전송하는 방법이다. 만약 패킷 전송에 실패하거나 일정 시간이 지나면 패킷 전송 속도를 절반으로 줄인다. 하지만 초기에 높은 대역폭을 가진 네트워크를 사용하지 못해 시간이 오래 걸리며, 네트워크가 혼잡해지고 나서야 대역폭을 줄여야 한다는 문제가 있다. 작동 원리는 다음과 같다.
- 가산적 증가 (Additive Increase) : 송신 측은 네트워크에서 패킷이 성공적으로 전송될 때마다 윈도우 크기를 1씩 증가시킨다. 이는 선형적인 증가로 이루어지며, 네트워크의 사용 가능한 대역폭을 효과적으로 활용하기 위해 시도한다.
- 곱셈적 감소 (Multiplicative Decrease) : 혼잡을 감지한 경우, 송신 측은 윈도우 크기를 반으로 줄인다. 이는 혼잡 상태에서 전송 속도를 급격히 감소히켜 혼잡을 완화한다. 이는 '혼잡 회피'와 조합되어 사용된다.
2) Slow Start (느린 시작)

느린 시작은 초기에 전송되는 패킷의 수를 제한하고, 네트워크 혼잡 상태를 파악하기 위해 전송할 때마다 윈도우 크기를 지수적으로 증가시키는 방법이다. 이는 AIMD처럼 패킷을 하나씩 보내면서 시작한다. 패킷이 문제 없이 전송되면 각 ACK 패킷마다 윈도우 크기를 1씩 증가시킨다. 한 주기가 지나면 윈도우 크기는 2배가 된다. 즉, 윈도우 크기를 한계치에 도달할 때까지 1, 2, 4, 8, 16, ... 처럼 지수적으로 증가시키다가 혼잡이 감지되면 윈도우 크기를 1로 줄이는 방식이다. 말 그대로 느리게 출발해 점점 증가 속도가 빨라진다.
3) Congestion Avoidance (혼잡 회피)

혼잡 회피는 느린 시작 이후 혼잡한 상황을 회피하기 위해 윈도우 크기를 선형적으로 증가시키는 방법이다. 이 때, 네트워크 혼잡 상태를 감지하고 윈도우 크기를 조절하여 네트워크의 처치량을 넘지 않도록 한다. 혼잡 상태가 감지될 때까지 혼잡 윈도우 크기를 1씩 증가시킨다. 느린 시작과는 달리 비교적 큰 값에서 시작하지만, 일정하게 1씩 증가한다. 혼잡 감지 단계에서 상호 연계하여 동작되도록 한다.
4) Fast Retransmit (빠른 재전송)
빠른 재전송은 패킷 손실을 감지하고 재전송을 빠르게 수행하여 전체적인 성능을 유지하는 방법이다. 이는 TCP 혼잡 조절에 추가된 정책으로, 수신 측에서 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK를 전송한다. 하지만 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK에 담아 전송하므로, 만약 중간에 하나가 손실된다면 송신 측에서는 순번이 중복된 ACK를 받는다. 이 때 문제되는 순번의 패킷을 재전송한다.
5) Fast Recovery (빠른 회복)
빠른 회복은 빠른 재전송으로 손실된 패킷을 재전송하고, 윈도우 크기를 조절하여 빠르게 정상 상태로 복구하는 방법이다. 혼잡 상태가 되면 윈도우 크기를 1이 아닌 반으로 줄이고, 선형증가시킨다. 해당 방법까지 적용하면 혼잡 상태를 겪고 나서부터 순수 AIMD 방식으로 동작한다.
참고
1️⃣ 흐름 제어 (Flow Control)
1) 개념
흐름 제어는 송신 측과 수신 측의 데이터 처리 속도의 차이를 해결하기 위한 방법이다. TCP의 특징중 하나는 패킷 교환 방식의 네트워크에서 패킷들의 안전한 전송을 보장해준다는 것이다. 그러나 패킷을 전송할 때 네트워크 상황에 따라 패킷의 도착 순서가 바뀌거나 유실될 수가 있다. 따라서 TCP는 패킷 번호를 통해 신뢰성 있는 데이터를 전송하고, 순서를 보장한다. 이를 위해선 수신 측에서 데이터 과부하를 송신 측에 통보하는 '피드백 메커니즘'이 필요하다.
패킷을 한 번에 하나씩 송수신하는 것보단 여러 패킷을 한 번에 송수신한 뒤 확인 응답 신호를 전송하는 것이 효율적이기 때문에 흐름 제어를 통해 이동하는 패킷의 양을 조절한다. 수신 측에서 한 번에 받을 수 있는 패킷의 양은 정해져있다. 만약 송신 측의 전송량이 수신 측의 수신량보다 많다면 전송된 패킷중 일부는 손실될 수 있다. 따라서 수신 측의 버퍼 크기에 따라 송신 측의 데이터 전송량을 조절해줄 필요가 있다. 즉, TCP 흐름 제어는 송수신 측 간의 데이터 전송 속도를 조절하여 네트워크 혼잡을 방지하고, 데이터 손실을 최소화하는 데에 도움이 된다. 이를 통해 안정적인 데이터 전송을 보장한다.
2) 종류
1) Stop and Wait (정지-대기 방식)
정지-대기 방식은 수신 측의 버퍼가 가득 차거나 수신 측이 데이터를 처리할 준비가 되지 않은 경우에 송신 측에서 데이터 전송을 중지하고 대기하는 방식이다. 따라서 전송한 패킷에 대한 확인 응답을 받은 뒤에 다음 패킷을 전송한다. 다음은 정지-대기 방식의 동작 과정이다.

- 송신 측은 데이터를 전송할 때마다 수신 측으로부터 확인 메시지인 ACK를 기다린다.
- 수신 측은 데이터를 수신할 때마다 해당 데이터를 확인하고 ACK를 송신 측에 전송한다.
- 만약 수신 측의 버퍼가 가득 차거나 수신 측이 데이터를 처리할 준비가 되지 않은 상태라면, ACK를 전송하지 않는다.
- 3의 경우 ACK를 받을 때까지 대기하며, 데이터 전송을 중지한다.
- 수신 측이 버퍼를 비우거나 데이터 처리 준비가 되면 ACK를 송신 측에 전송하고, 송신 측은 데이터 전송을 다시 시작한다.
2) Sliding Window (Go-Back-N-ARQ)
슬라이딩 윈도우 방식은 데이터를 안정적으로 전송하기 위해 송수신 측 간의 '윈도우 크기'를 동적으로 조절하는 방법이다. 여기서 윈도우 크기는 확인 응답을 하나씩 하지 않고, 연속하여 송수신할 수 있는 데이터의 크기를 말한다. 데이터를 전송할 때 한 번에 전송할 수 있는 전체 패킷의 크기를 'TCP 윈도우 크기'라고 하며, 윈도우 크기가 클수록 한 번에 많은 패킷을 전송할 수 있다. 이는 수신 측에서 설정한 윈도우 크기를 따르며, 송신 측에서 ACK를 받기 전까진 해당 크기 만큼 데이터를 전송할 수 있다. 송신 측 버퍼의 범위는 수신 측 여유 버퍼 공간을 반영하여 동적으로 바뀐다.

예를 들어 송신 측 컴퓨터에서 한 번에 전송할 송신 윈도우 크기가 패킷 4개의 크기라고 하자. 송신 측은 윈도우 크기에 따라 1~4번 패킷을 전송하고, 수신 측에서 수신 확인 ACK 신호를 수신하면 ACK 신호에서 요청한 5번 패킷 위치로 송신 윈도우를 옮긴다. 다시 윈도우 안의 패킷을 전송하고, 수신 측에서 ACK 신호를 수신하면 ACK 신호에서 요청한 9번 패킷 위치로 송신 윈도우를 옮긴다. 다음의 단계로 일반화할 수 있다.
- 송신 측은 수신 측에게 데이터를 전송할 때 윈도우 크기를 지정한다.
- 수신 측은 받을 준비가 된 데이터 범위를 윈도우 내에 표시한다. 윈도우의 시작과 끝은 수신 측이 받을 수 있는 데이터 범위를 나타낸다.
- 송신 측은 윈도우 내의 데이터를 전송하고 ACK를 기다린다. ACK를 받으면 요청한만큼 윈도우를 이동한다.
- 수신 측은 데이터를 받으면 해당 데이터를 확인하고 ACK를 송신 측에 전송한다. 이는 윈도우 크기를 조절하고, 어떤 데이터를 받았는지 알려준다.
- 송신 측은 ACK를 받으면 윈도우를 이동시켜 새로운 데이터를 전송하고, 데이터 전송 속도를 조절한다.
2️⃣ 혼잡 제어 (Congestion Control)
1) 개념
혼잡 제어는 네트워크로 유입되는 데이터 트래픽의 양이 네트워크 용량을 초과하지 않도록 유지하는 방법이다. 만약 데이터 총량이 네트워크가 처리할 수 있는 허용량을 초과하면 네트워크는 '혼잡 상태'가 된다. 흐름 제어는 송신 측과 수신 측 사이의 데이터 전송 속도를 다루는데에 반해 혼잡 제어는 호스트와 라우터를 포함한 넓은 관점에서 전송 문제를 다룬다. 즉, 흐름 제어는 송신 측과 수신 측의 데이터 처리 속도 차이를 해결하기 위한 기법이고 혼잡 제어는 송신 측의 데이터 전달 속도와 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법이다.

2) 종류

- AIMD
- Slow Start
- Congestion Avoidance
- Fast Retransmit
- Fast Recovery
1) AIMD (Additive Increase Multiplicative Decrease : 합 증가 곱 감소)

혼잡 제어 알고리즘 중 하나로, 네트워크 혼잡을 관리하기 위해 송신 측의 전송 속도를 동적으로 조절하는 알고리즘이다. 처음에 패킷을 하나씩 보내고 문제가 없다면 윈도우 크기를 1씩 증가시키며 전송하는 방법이다. 만약 패킷 전송에 실패하거나 일정 시간이 지나면 패킷 전송 속도를 절반으로 줄인다. 하지만 초기에 높은 대역폭을 가진 네트워크를 사용하지 못해 시간이 오래 걸리며, 네트워크가 혼잡해지고 나서야 대역폭을 줄여야 한다는 문제가 있다. 작동 원리는 다음과 같다.
- 가산적 증가 (Additive Increase) : 송신 측은 네트워크에서 패킷이 성공적으로 전송될 때마다 윈도우 크기를 1씩 증가시킨다. 이는 선형적인 증가로 이루어지며, 네트워크의 사용 가능한 대역폭을 효과적으로 활용하기 위해 시도한다.
- 곱셈적 감소 (Multiplicative Decrease) : 혼잡을 감지한 경우, 송신 측은 윈도우 크기를 반으로 줄인다. 이는 혼잡 상태에서 전송 속도를 급격히 감소히켜 혼잡을 완화한다. 이는 '혼잡 회피'와 조합되어 사용된다.
2) Slow Start (느린 시작)

느린 시작은 초기에 전송되는 패킷의 수를 제한하고, 네트워크 혼잡 상태를 파악하기 위해 전송할 때마다 윈도우 크기를 지수적으로 증가시키는 방법이다. 이는 AIMD처럼 패킷을 하나씩 보내면서 시작한다. 패킷이 문제 없이 전송되면 각 ACK 패킷마다 윈도우 크기를 1씩 증가시킨다. 한 주기가 지나면 윈도우 크기는 2배가 된다. 즉, 윈도우 크기를 한계치에 도달할 때까지 1, 2, 4, 8, 16, ... 처럼 지수적으로 증가시키다가 혼잡이 감지되면 윈도우 크기를 1로 줄이는 방식이다. 말 그대로 느리게 출발해 점점 증가 속도가 빨라진다.
3) Congestion Avoidance (혼잡 회피)

혼잡 회피는 느린 시작 이후 혼잡한 상황을 회피하기 위해 윈도우 크기를 선형적으로 증가시키는 방법이다. 이 때, 네트워크 혼잡 상태를 감지하고 윈도우 크기를 조절하여 네트워크의 처치량을 넘지 않도록 한다. 혼잡 상태가 감지될 때까지 혼잡 윈도우 크기를 1씩 증가시킨다. 느린 시작과는 달리 비교적 큰 값에서 시작하지만, 일정하게 1씩 증가한다. 혼잡 감지 단계에서 상호 연계하여 동작되도록 한다.
4) Fast Retransmit (빠른 재전송)
빠른 재전송은 패킷 손실을 감지하고 재전송을 빠르게 수행하여 전체적인 성능을 유지하는 방법이다. 이는 TCP 혼잡 조절에 추가된 정책으로, 수신 측에서 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK를 전송한다. 하지만 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK에 담아 전송하므로, 만약 중간에 하나가 손실된다면 송신 측에서는 순번이 중복된 ACK를 받는다. 이 때 문제되는 순번의 패킷을 재전송한다.
5) Fast Recovery (빠른 회복)
빠른 회복은 빠른 재전송으로 손실된 패킷을 재전송하고, 윈도우 크기를 조절하여 빠르게 정상 상태로 복구하는 방법이다. 혼잡 상태가 되면 윈도우 크기를 1이 아닌 반으로 줄이고, 선형증가시킨다. 해당 방법까지 적용하면 혼잡 상태를 겪고 나서부터 순수 AIMD 방식으로 동작한다.
참고