흐름 제어는 받는 쪽이 처리할 수 있는 만큼만 보내도록 보내는 양을 맞추는 것이고, 혼잡 제어는 네트워크가 감당할 수 있는 만큼만 보내도록 줄이는 것입니다. TCP는 둘 다 확인 없이 한 번에 보낼 수 있는 양, 곧 윈도우(window, 창) 크기로 조절합니다.
TCP와 UDP의 TCP는 확인이 없으면 다시 보냅니다. 그런데 받는 쪽이 넘치거나 길이 막혀 버려진 것이라면 다시 보낼수록 더 버려지므로, 보내는 빠르기를 상대와 네트워크에 맞춰야 합니다. 아래 그림은 창이 확인을 받는 만큼 미끄러지는 모습과, 혼잡 창이 자랐다가 손실에 꺾이는 모습을 보여 줍니다.
1흐름 제어 — 받는 쪽에 맞춘다
흐름 제어(flow control)는 받는 쪽의 버퍼(buffer, 받은 데이터를 잠시 두는 곳)가 넘치지 않게 합니다. 데이터 링크 계층(프레임)에서도 TCP(세그먼트)에서도 하며, 아래에서는 프레임이라 부릅니다.
- 정지-대기(stop-and-wait): 프레임 하나를 보내고 그 확인(ACK)이 올 때까지 기다린 뒤 다음을 보냅니다. 단순하지만 기다리는 동안 선이 놀아, 멀리 떨어질수록 느려집니다.
- 슬라이딩 윈도우(sliding window): 창 크기만큼은 확인을 기다리지 않고 잇달아 보냅니다. 확인이 오는 만큼 창이 앞으로 미끄러져 다음 프레임을 보낼 수 있게 됩니다.
창 크기는 받는 쪽이 TCP 헤더의 윈도우 칸으로 알려 줍니다. 처리가 밀리면 창을 줄여 알리고, 보내는 쪽은 그만큼만 보냅니다. 같은 틀을 오류를 바로잡는 데 쓰면 ARQ(정지-대기 ARQ·Go-Back-N ARQ·선택적 재전송 ARQ)이고, 오류 검출과 정정에서 봅니다.
2혼잡 제어 — 네트워크에 맞춘다
받는 쪽이 넉넉해도 중간 라우터가 밀리면 패킷이 버려집니다. 혼잡 제어(congestion control)는 보내는 쪽이 혼잡 창(congestion window)을 따로 두고, 손실이 생기는지를 보며 키우고 줄입니다. 실제로 보내는 양은 받는 쪽이 알린 창과 혼잡 창 가운데 작은 쪽입니다.
| 단계 | 언제 | 혼잡 창이 느는 꼴 |
|---|---|---|
| 느린 시작(slow start) | 시작할 때, 손실 뒤 | 전송 차례마다 두 배(1 → 2 → 4 → 8) |
| 혼잡 회피(congestion avoidance) | 창이 임곗값에 닿은 뒤 | 전송 차례마다 1씩 |
느린 시작은 자료에 따라 슬로 스타트라고도 부릅니다. 임곗값(ssthresh, 자료에 따라 임계값·임계치)은 느린 시작을 멈출 자리입니다. 처음에는 아주 크게 두고, 시간 초과로 손실을 알면 임곗값을 그때 창의 절반으로 내리고 창을 1로 되돌립니다. 계산 문제는 창 1에서 시작합니다. 두 배로 늘다 임곗값을 넘게 되면 임곗값에서 멈추고 혼잡 회피로 넘어갑니다.
받는 쪽은 세그먼트 하나가 빠진 채 뒤의 것이 오면 '아직 그것을 기다린다'는 같은 확인(중복 ACK)을 되풀이해 보냅니다. 중복 ACK가 세 번 오면 시간 초과를 기다리지 않고 빠진 것을 바로 다시 보내는데, 이것이 빠른 재전송(fast retransmit)입니다. 이어서 창을 1이 아니라 절반으로 줄여 혼잡 회피로 이어 가는 것이 빠른 회복(fast recovery)입니다. 늘릴 때는 1씩 더하고(덧셈 증가) 줄일 때는 절반으로 깎는(곱셈 감소) 이 원리를 AIMD(Additive Increase Multiplicative Decrease)라고 합니다.
3둘을 가르는 기준
| 가르는 기준 | 흐름 제어 | 혼잡 제어 |
|---|---|---|
| 지키는 것 | 받는 쪽의 버퍼 | 중간 네트워크 |
| 창을 정하는 쪽 | 받는 쪽이 알려 준다 | 보내는 쪽이 손실을 보고 정한다 |
| 기법 | 정지-대기, 슬라이딩 윈도우 | 느린 시작, 혼잡 회피, 빠른 재전송, 빠른 회복 |
예제
임곗값이 8일 때 전송 차례마다 혼잡 창의 크기를 구해 보세요. 8번째 차례(창 12)에서 시간 초과가 났습니다.
| 차례 | 혼잡 창 | 임곗값 | 단계 |
|---|---|---|---|
| 1 | 1 | 8 | 느린 시작 |
| 2 | 2 | 8 | 느린 시작 |
| 3 | 4 | 8 | 느린 시작 |
| 4 | 8 | 8 | 혼잡 회피 |
| 5 | 9 | 8 | 혼잡 회피 |
| 6 | 10 | 8 | 혼잡 회피 |
| 7 | 11 | 8 | 혼잡 회피 |
| 8 | 12 — 시간 초과 | 8 → 6 | 혼잡 회피 |
| 9 | 1 | 6 | 느린 시작 |
| 10 | 2 | 6 | 느린 시작 |
| 11 | 4 | 6 | 느린 시작 |
| 12 | 6 | 6 | 혼잡 회피 |
| 13 | 7 | 6 | 혼잡 회피 |
11번째의 4 다음은 8이 아니라 6입니다. 두 배인 8이 새 임곗값 6을 넘어 6에서 멈추고, 그 뒤로는 1씩 늘어납니다.
시험 포인트
- 필기: 흐름 제어는 받는 쪽, 혼잡 제어는 네트워크를 지킵니다. 기법을 둘로 나누게 합니다 — 정지-대기·슬라이딩 윈도우는 흐름 제어, 느린 시작·혼잡 회피·빠른 재전송·빠른 회복은 혼잡 제어입니다. 느린 시작은 이름과 달리 두 배씩 빠르게 늘고, 혼잡 회피는 1씩 늘어난다는 데서 헷갈리게 냅니다. 손실을 시간 초과로 알면 창을 1로, 중복 ACK 세 번으로 알면 절반으로 줄입니다.
- 실기: 설명을 보고 이름을 한글 이름과 영문으로 씁니다 — 흐름 제어(Flow Control), 혼잡 제어(Congestion Control), 정지-대기(Stop-and-Wait), 슬라이딩 윈도우(Sliding Window), 느린 시작(Slow Start), 혼잡 회피(Congestion Avoidance), 빠른 재전송(Fast Retransmit), 빠른 회복(Fast Recovery), AIMD(Additive Increase Multiplicative Decrease).
확인 문제
1. 다음 가운데 혼잡 제어에 해당하는 일을 고르세요.
- ① 받는 쪽이 버퍼가 차서 창을 4에서 2로 줄여 알린다
- ② 프레임 하나를 보낼 때마다 확인을 받은 뒤 다음을 보낸다
- ③ 시간 초과가 나자 보내는 쪽이 창을 1로 줄이고 다시 조금씩 키운다
- ④ 창 크기 4만큼 확인 없이 보내고, 확인이 오는 대로 창을 옮긴다
정답
③입니다. 시간 초과를 네트워크가 밀린 신호로 보고 보내는 쪽이 스스로 창을 줄였습니다. 네트워크에 맞추는 혼잡 제어입니다.
- ① 받는 쪽이 자기 사정으로 창을 정했습니다. 흐름 제어입니다.
- ② 정지-대기로, 흐름 제어 기법입니다.
- ④ 슬라이딩 윈도우로, 흐름 제어 기법입니다.
2. 다음 (가)~(다)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 무전기처럼 한 번 말하고 상대의 '수신 완료'를 들은 뒤에야 다음 말을 하는 방식
- (나) 정해 둔 개수만큼은 답을 기다리지 않고 잇달아 보내고, 답이 오는 만큼 보낼 수 있는 범위가 앞으로 옮겨 가는 방식
- (다) (가)와 (나)처럼 받는 쪽이 감당할 만큼만 보내도록 보내는 양을 맞추는 일
정답
받는 답: (가) 정지-대기(Stop-and-Wait) · (나) 슬라이딩 윈도우(Sliding Window) · (다) 흐름 제어(Flow Control)
(가)의 실마리는 '하나 보내고 확인을 들은 뒤에야', (나)는 '여럿을 잇달아 보내고 범위가 옮겨 감', (다)는 '받는 쪽이 감당할 만큼'입니다.
- 틀리는 꼴 슬라이딩 윈도우 — (가)에: 여러 개를 확인 없이 잇달아 보냅니다. (가)는 하나마다 기다립니다.
- 틀리는 꼴 혼잡 제어 — (다)에: 받는 쪽이 아니라 중간 네트워크에 맞추는 일입니다.
3. 다음 (가)~(다)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 보내는 쪽이 창을 1에서 시작해, 확인이 올 때마다 늘려 왕복 한 번에 두 배가 되게 하는 단계
- (나) 창이 미리 정한 선에 닿은 뒤로는 왕복 한 번에 1씩만 늘리는 단계
- (다) (가)와 (나)처럼 네트워크가 감당할 만큼만 보내도록 보내는 쪽이 창을 조절하는 일
정답
받는 답: (가) 느린 시작(Slow Start) 또는 슬로 스타트 · (나) 혼잡 회피(Congestion Avoidance) · (다) 혼잡 제어(Congestion Control)
(가)의 실마리는 '1에서 시작해 두 배씩', (나)는 '선에 닿은 뒤 1씩', (다)는 '네트워크가 감당할 만큼 보내는 쪽이 조절'입니다.
- 틀리는 꼴 혼잡 회피 — (가)에: 두 배씩 느는 쪽은 느린 시작입니다. 이름이 '느린'이라 1씩 느는 쪽으로 헷갈리기 쉽습니다.
- 틀리는 꼴 흐름 제어 — (다)에: 받는 쪽이 알린 창에 맞추는 일입니다. (다)는 보내는 쪽이 네트워크 사정을 보고 정합니다.
4. 예제와 같이 임곗값 8에서 시작했는데, 이번에는 6번째 차례(창 10)에서 시간 초과가 났습니다. 7번째부터 11번째 차례까지 혼잡 창의 크기를 차례대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 1, 2, 4, 5, 6
시간 초과로 임곗값은 10의 절반인 5가 되고 창은 1로 돌아갑니다. 1 → 2 → 4로 두 배씩 늘다가, 4의 두 배인 8이 임곗값 5를 넘으므로 5에서 멈춥니다. 그 뒤로는 혼잡 회피라 6이 됩니다.
- 틀리는 꼴 1, 2, 4, 8, 9: 두 배가 임곗값을 넘어도 그대로 늘렸습니다.
- 틀리는 꼴 5, 6, 7, 8, 9: 시간 초과 뒤 창을 임곗값에서 다시 시작했습니다. 시간 초과면 창은 1로 돌아갑니다.
5. 다음 (가)~(다)에 맞는 이름을 쓰세요. (가)·(나)는 한글 이름과 영문으로 함께, (다)는 약어와 영문 원어로 씁니다. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 보내는 쪽이 같은 확인 응답을 세 번 잇달아 받자, 타이머가 끝나기를 기다리지 않고 빠진 세그먼트를 곧바로 한 번 더 보냅니다.
- (나) (가) 뒤에 혼잡 창을 1로 떨어뜨리지 않고 반으로만 줄여, 느린 시작을 건너뛰고 혼잡 회피로 이어 갑니다.
- (다) 혼잡 창을 키울 때는 왕복 한 번에 1씩 천천히, 손실 신호를 받으면 한 번에 반으로 크게 줄이는 원리입니다.
정답
받는 답: (가) 빠른 재전송(Fast Retransmit) · (나) 빠른 회복(Fast Recovery) · (다) AIMD(Additive Increase Multiplicative Decrease)
(가)의 실마리는 '같은 확인 세 번 · 타이머를 기다리지 않음', (나)는 '1이 아니라 반으로 · 혼잡 회피로 이어 감', (다)는 '키울 때는 1씩 · 줄일 때는 반으로'입니다.
- 같은 이름의 다른 꼴: (다) 덧셈 증가·곱셈 감소 — 한글 풀이입니다. 문제가 약어와 영문 원어로 쓰라고 했습니다.
- 틀리는 꼴 느린 시작 — (나)에: 창을 1에서 다시 시작해 두 배씩 키우는 단계입니다. (나)는 1로 떨어뜨리지 않습니다.
- 틀리는 꼴 혼잡 회피 — (다)에: 1씩 늘리는 단계 하나의 이름입니다. 늘리는 꼴과 줄이는 꼴을 함께 묶은 원리는 AIMD입니다.