TCP/IP 흐름제어 & 혼잡제어

Onni·2022년 2월 1일
0

📌 흐름제어

✅ 개념

  • 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법.
  • 송신측의 데이터 전송량 제어

✅ 흐름제어 기법

✔ Stop & Wait 방식

  • 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법 (비효율적)

✔ Sliding window

  • 수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답(ACK) 없이 패킷을 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법
  • 송신 버퍼의 범위는 수신 측의 여유 버퍼 공간을 반영하여 동적으로 바뀜.

(1) 윈도우 크기

최초의 윈도우 크기는 호스트들의 '3 way handshaking'을 통해 수신 측 윈도우 크기로 설정되며, 이후 수신 측의 버퍼에 남아있는 공간에 따라 변한다. 윈도우 크기는 수신 측에서 송신 측으로 확인 응답(ACK)을 보낼 때 TCP 헤더(window size)에 담아서 보낸다. 즉, 윈도우는 메모리 버퍼의 일정 영역이라고 생각하면 된다.

(2) 동작 방식

윈도우에 포함된 패킷을 계속 전송하고, 수신 측으로부터 확인 응답(ACK)이 오면 윈도우를 옆으로 옮겨 다음 패킷들을 전송한다.

  • 최초로 수신자는 윈도우 사이즈를 7로 정한다.
  • 송신자는 수신자의 확인 응답(ACK)을 받기 전까지 데이터를 보낸다.
  • 수신자는 확인 응답(ACK)을 송신자에게 보내면, 슬라이딩 윈도우 사이즈을 충족할 수 있게끔 윈도우를 옆으로 옮긴다
  • 이후 데이터를 다 받을 때까지 위 과정을 반복한다.

(3) 재전송

송신 측은 일정 시간 동안 수신 측으로부터 확인 응답(ACK)을 받지 못하면, 패킷을 재전송한다. 만약, 송신 측에서 재전송을 했는데 패킷이 소실된 경우가 아니라 수신 측의 버퍼에 남는 공간 없는 경우면 문제가 생긴다. 이를 해결하기 위해 송신 측은 해결 응답(ACK)을 보내면서 남은 버퍼의 크기 (윈도우 크기)도 함께 보내 준다.

📌 혼잡제어

✅ 개념

  • 송신측의 데이터 전달과 네트워크 상의 데이터 처리 속도 차이를 해결하기 위한 기법.
  • 송신측의 데이터 전송 속도 제어
  • 데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다. 이때 송신 측에서는 라우터가 처리하지 못한 데이터를 손실 데이터로 간주하고 계속 재전송하여 네트워크를 혼잡하게 한다. 이런 상황은 송신 측의 전송 속도를 적절히 조절하여 예방할 수 있는데, 이것을 혼잡 제어라고 한다.

✅ 혼잡제어 기법

✔ AIMD (Additive Increase Multicative Decrease)

  • 합 증가/ 곱 감소 알고리즘
  • 처음에 패킷 하나를 보내는 것으로 시작, 전송한 패킷이 문제 없이 도착하면 윈도우 크기를 1씩 증가시키며 전송
  • 패킷 전송을 실패하거나 타임아웃이 발생하면 윈도우 크기를 절반으로 감소시킴
  • 여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만, 시간이 흐르면 평형 상태로 수렴
  • 문제점
    - 초기 네트워크의 높은 대역폭을 사용하지 못함
    - 처음에 전송 속도를 올리는 데 시간이 너무 오래 걸림
    - 네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄임

✔ Slow start

  • AIMD와 같이 패킷을 하나씩 보냄
  • 하나의 패킷이 문제없이 도착하여 ACK를 보낼 때마다 윈도우 크기를 1씩 늘림
  • 한 주기가 지나면 윈도우 크기는 2배 -> 그래프의 모양이 지수함수 꼴
  • 혼잡 현상이 발생하면 윈도우 크기를 1로 떨어트림
  • 한 번 혼잡 현상이 발생하고 나면 이전에 혼잡 현상이 발생했던 윈도우 크기의 절반까지는 이전처럼 지수함수 꼴로 윈도우 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킴

✔ Fast Recovery

  • 혼잡 상태가 되면 윈도우 크기를 1로 줄이지 않고 반으로 줄인 후 선형증가.
  • 혼잡 상태를 한 번 겪고 나서부터는 AIMD 방식으로 동작

✔ Fast Retransmit

  • 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK패킷을 보냄
  • 순서대로 잘 도착한 마지막 패킷의 다음 패킷 순번을 ACK패킷에 실어보내게 되므로 송신측에서는 순번이 중복된 것을 알게됨
  • 이것을 감지하여 중복된 순번의 패킷을 3개 받으면 타임아웃 전에 문제가 되는 순번의 패킷을 즉시 재전송해줌
  • 이런 현상이 일어나면 혼잡 현상이 발생한 것이므로 윈도우 크기를 줄임

✅ 혼잡 제어 정책

✔ 기본용어 정리

(1) Timeout

말 그대로 여러 가지 요인으로 인해 송신 측이 보낸 데이터 자체가 유실되었거나, 수신 측이 응답으로 보낸 ACK가 유실되는 경우를 뜻한다.

(2) 3 ACK Duplicate

패킷을 받는 수신자 입장에서는 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 생길 수 있다. 이런 상황이 발생했을 때 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다. 그리고 이런 중복 ACK 3개를 받으면 문제가 있다고 판단하여 해당 패킷을 송신 측이 재전송한다.

당 기법을 빠른 재전송 이라고 부르며, 송신 측은 자신이 설정한 타임 아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있기 때문에 보다 빠른 전송률을 유지할 수 있게 된다.

(3) Slow Start 임계점 (ssthresh)

Tahoe와 Reno를 비교하는 그래프를 보면 Threshold(임계점) 이라는 단어가 등장한다. 이 임계점은 Slow Start Threshold(ssthresh) 를 뜻하는 것으로, 여기까지만 Slow Start를 사용하겠다는 의미를 가진다.

low Start를 사용하며 윈도우 크기를 지수적으로 증가시키다보면 어느 순간부터는 윈도우 크기가 기하급수적으로 늘어나서 제어하기가 힘들다. 또한, 네트워크의 혼잡이 예상되는 상황에서 빠르게 값을 증가시키기 보다는 조금씩 증가시키는 편이 훨씬 안전하다.

쉽게 생각해서 현재 윈도우 크기가 10이고, 현재 네트워크에 남은 공간이 15라고 할 때, Slow Start 방식을 사용하면 윈도우 크기가 20이 되지만 AIMD를 사용하면 앞으로 5번은 윈도우 크기를 천천히 늘릴 수 있다.

그래서 특정한 임계점을 정해 놓고, 그 임계점이 넘어가면 AIMD 방식을 사용하여 선형적으로 윈도우를 증가시킨다. 이때, 이 임계점을 Slow Start Threshold (ssthresh)라고 부른다.

✔ TCP Tahoe

  • 처음에는 Slow Start 방식을 사용하다가 임계점에 도달하면 AIMD 방식 사용
  • 그러다 3 ACK 순번 중복(중간패킷유실)이나 타임아웃이 발생하면 혼잡이라고 판단하여 임계점은 혼잡이 발생한 윈도우 크기의 절반으로, 윈도우 크기는 1로 줄임

위 그래프에서 청록색 선은 송신 측의 혼잡 윈도우 크기를, 굵은 검정선은 ssthresh 값을 보여주고 있다. 이 시나리오에서 송신 측의 혼잡 윈도우 크기는 8로 초기화 되었고, 그에 따라 ssthresh는 4로 설정되어 있다.

송신 측은 임계점을 만나기 전까지 Slow Start 방식을 사용하여 자신의 윈도우 크기를 증가시키다가 ssthresh를 넘어선 이후부터는 선형적으로 증가시키고 있다. 이 상황에서 3 ACK Duplicated나 Timeout과 같은 혼잡 상황을 만나면 어떻게 될까?

그래프를 보면 처음 혼잡 상황이 발생한 상태의 혼잡 윈도우 크기는 6이며, 그에 따라 ssthresh를 3으로 변경하고, 자신의 혼잡 윈도우 크기를 1로 줄였다. 이후 다시 Slow Start로 시작하여 임계점에 도달하면 AIMD를 시작한다.

이 정책은 한 번 혼잡 상황이 발생한 지점을 기억하고 그 지점이 가까워지지 않도록 합리적으로 조절하고 있다. 하지만, 초반의 Slow Start 구간에 윈도우 크기를 늘릴 때 오래 걸린다는 단점이 있고, 혼잡 상황이 발생했을 때 다시 윈도우 크기를 1에서부터 시작해야 한다는 단점이 있다.

✔ TCP Reno

  • Tahoe와 마찬가지로 slow start로 시작하여 임계점 이후에는AIMD방식으로 변경.
  • 단, 3 ACK 중복과 타임아웃을 구분함
  • 3 ACK 중복이 발생하면 Fast Recovery 방식을 사용
  • 윈도우 크기를 1로 줄이는 것이 아니라 반으로 줄인 후 윈도우 크기를 선형적으로 증가시킴.
  • 임계점은 줄어든 윈도우 값으로 설정
  • 타임아웃이 발생하면 Tahoe와 마찬가지로 윈도우 1로 줄이고 Slow start 진행.(임계점 변경하지 x)

Reno는 3개의 중복 ACK가 발생했을 때, 윈도우 크기를 1로 줄이는 것이 아니라 AIMD처럼 반으로만 줄이고 sshthresh를 줄어든 윈도우 값으로 정하게 된다. 이 방식을 빠른 회복이라고 부른다.

그러나 Timeout에 의해서 데이터가 손실되면 Tahoe와 마찬가지로 윈도우 크기를 바로 1로 줄여버리고 Slow Start를 진행한다. 이때 ssthresh를 변경하지는 않는다.

즉, Reno는 ACK 중복은 Timeout에 비해 그리 큰 혼잡이 아니라고 가정하고 혼잡 윈도우 크기를 1로 줄이지도 않는다는 점에서 혼잡 상황의 우선 순위를 둔 정책이라 볼 수 있다.

🟣 Q&A

1. TCP/IP 통신에서 흐름 제어 기법이 왜 사용되는가?
송 수신자 간의 TCP 버퍼의 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기 위해 사용된다.

2. TCP/IP 흐름 제어 기법은 무엇이 있는가?
Stop and Wait과 Sliding Window 기법이 있다. Stop and Wait은 전송한 패킷에 대해 확인 응답(ACK)을 받으면 다음 패킷을 전송하는 제어 기법이고, Sliding Window는 수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답(ACK) 없이 패킷을 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법이다.

3. TCP/IP 혼잡 제어 기법이 왜 사용되는가?
송신 측에서 보내는 데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다. 송신 측은 초과된 데이터를 손실 데이터로 간주하고 계속 재전송하여 네트워크를 혼잡하게 한다. 이런 상황을 예방하기 위해 송신 측의 전송 속도를 적절히 조절하는 혼잡 제어 기법이 사용된다. 대표적으로 AIMD, Slow Start, 빠른 재전송, 빠른 회복 등이 있다.

4. TCP/IP 혼잡 제어 정책은 무엇이 있는가?
대표적으로 TCP Tahoe와 TCP Reno가 있다. TCP Tahoe는 처음에는 Slow Start를 사용하여 자신의 윈도우 크기를 지수적으로 빠르게 증가시키다가 ssthresh를 만난 이후부터는 AIMD을 사용하여 선형적으로 윈도우 크기를 증가시킨다. 반면, TCP Reno는 Tahoe와 마찬가지로 Slow Start로 시작하여 임계점을 넘어서면 AIMD을 사용하되, Tahoe와 다르게 3 ACK Duplicated와 Timeout 혼잡 상황을 구분한다.

🧩 Reference

profile
꿈꿈

0개의 댓글