Computer Science/Network

[Network] TCP 신뢰성의 특징: 흐름제어 / 혼잡제어

ooeunz 2020. 3. 22. 18:54
반응형

TCP의 가장 큰 특징은 신뢰성입니다. 신뢰성이란 중간에 데이터가 유실되지 않는 것을 이야기하는데 이러한 신뢰성을 구성해주는 대표적인 방법으로 흐름제어와 혼잡제어가 있습니다.

 

흐름제어

먼저 흐름제어에 대해 알아보겠습니다. 흐름제어란 송신 측과 수신 측의 데이터 처리 속도 차이를 해결하기 위한 기법입니다. 수신측이 송신측 보다 처리 속도가 빠르다면 문제가 될 것이 없지만, 만약 송식 측이 수신 측보다 전송 속도가 빠르게 되면 전송된 패킷은 수신측의 제한된 저장 용량을 초과하여 이후에 도착하는 데이터가 손실될 수 있습니다. 만약 데이터가 손실 된다면 추가적으로 응답과 데이터의 재전송이 이루어져야 하기 때문에 리소스의 낭비로 이어질 수 있습니다.

 

이러한 위험을 줄이기 위해 송신측의 데이터 전송량을 수신측의 처리량에 따라 조절하게 됩니다. 이러한 작업을 바로 흐름제어라고 이야기 합니다. 아래는 흐름제어의 기법들입니다.

 

 

1. 정지-대기(Stop-and-wait)

데이터를 1개 보내고 ACK가 오면 그 다음 데이터를 보내는 간단한 방식입니다. 하지만 하나를 주고 응답을 받기 때문에 속도가 느리고 비효율 적입니다.

 

 

 

 

2. 슬라이딩 윈도우(Sliding Window)

TCP 슬라이딩 윈도우 기법은 앞선 정지-대기 기법의 비효율성을 개선한 기법으로 수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답 없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법입니다.

 

※ 여기서 윈도우란 전송, 수신 스테이션 양쪽에서 만들어진 버퍼의 크기를 이야기 하는데,

윈도우의 크기 = (가장 최근 ACK로 응답한 프레임 수) - (이전에 ACK 프레임을 보낸 프레임 수)

 

수신측이 한번에 처리할 수 없는 없는 양의 데이터를 송신측이 전송하게 된다면 drop 되는 패킷이 자꾸만 발생하게 될 것이고, 네트워크 자원이 낭비된다고 위에서 이야기했습니다. 이러한 drop이 발생하지 않도록 한번에 전송하는 패킷의 양을 조절하는 것을 Sliding Window라고 합니다.

 

위의 이미지에서 알 수 있듯이 송신 측에서는 1~5까지의 프레임이 전송이 가능합니다. 따라서 1~5까지를 window에 담습니다. 그리고 먼저 1, 2를 전송하게 됩니다. 그럼 송신측의 윈도우는 (이미지에는 표현되지 않았지만) 3, 4, 5만큼 윈도우의 크기가 줄어듭니다.

이때 수신측에서 0, 1 데이터를 정상적으로 수신했음을 알리는 ACK를 송신측으로 보냅니다. 송신측은 ACK를 받고 ACK의 프레임 수만큼 오른 쪽으로 윈도우의 경계를 확장시킵니다.

 


혼잡 제어

혼잡제어는 역시 송신 측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법입니다.

송신 측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 데이터를 전달하는데, 만약 하나의 라우터에 데이터가 몰릴 경우 (혼잡할 경우) 자신에게 온 데이터를 모두 처리할 수 없게 됩니다. 마찮가지로 그렇게 되면 송신측은 라우터로 다시 데이터를 재전송을 하게 되고, 설상가상으로 혼잡한 데이터가 더욱 가중되어서 오버플로우나 데이터 손실을 발생 시키게 됩니다. 이러한 위험을 줄이기 위해 송신측에서 보내는 데이터의 전송 속도를 강제로 줄이기 되는데 이를 혼잡 제어라고 합니다.

 

혼잡제어는 흐름 제어보다 조금 더 넓은 관점에서의 전송 문제를 다룹니다. 앞서 살펴본 흐름 제어는 두 장비간의 데이터 송신을 통제하는 것으로 연결에 참여하는 두 장비의 상황만 고려합니다. 반면 혼잡제어는 라우터와 같은 다른 장비의 상태 역시 고려합니다.

 

 

1. 합 증가 / 곱 감소 (AIME: Additive Increase / Multiplicative Decrease)

처음 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window를 1씩증가시켜 전송하는 방법입니다. 만일 패킷 전송을 실패하거나 일정 시간을 넘기게 되면 패킷을 보내느 속도를 절반으로 줄이게 됩니다. 이러한 방식을 사용하게 되면 모든 호스트가 공평하게 네트워크를 사용한다는 장점이 있지만 초기의 네트워크 대역폭을 사용하지 못하면 오랜 시간이 걸리고, 네트워크가 혼잡해지는 상황을 미리 감지할 수 없다는 단점이 있습니다. 따라서 사후처리로 네트워크가 혼잡해지고 나서야 대역폭을 줄여야 합니다.

 

 

2. Slow start

앞서 이야기 했듯이 합 증가/ 곱 감소 방식은 네트워크가 혼잡해지는 상황을 미리 감지할 수 없습니다. 따라서 전송 속도를 올리는데 걸리는 시간이 너무 길다는 단점이 있습니다. 이러한 단점을 극복한 방법으로 slow start 방식이 있습니다.

 

slow start 방식 역시 합 증가 / 곱 감소 방식과 마찬가지로 패킷을 하나씩 보내기 시작합니다. 하지만 이 방식은 패킷이 문제없이 도착하면 ACK 패킷마다 window 크기를 1씩 늘립니다. 즉 하나의 주기가 끝나면 window의 크기가 2배가 됩니다. 따라서 전송 속도가 합 증가/곱 감소 방식과 다르게 지수 꼴로 증가합니다.

 

대신 혼잡 현상이 발생하면 window 크기를 1로 줄여버립니다. 합 증가 / 곱 감소 방식과 마찬가지로 처음에는 네트워크의 수용량을 예상할 수 없지만, 한번 혼잡 현상을 경험하면 네트워크 수용량을 어느 정도 예상할 수 있으므로 혼잡 현상이 발생하였던 window 크기의 절반까지는 이전처럼 지수 꼴로 window의 크기를 증가시키고, 그 이후부터는 완만하게 1씩 증가시킵니다.

 

 

3. 혼잡 회피 (Congestion Avoidance)

혼잡이 감지되면 지수적이 아닌 가산적인 증가 방식을 채택하는 방식입니다.

 

 

4. Fast Retrasmit (빠른 재전송)

정상적인 재전송 큐 과정을 따르지 않고, 중간 누락된 세그먼트를 빠르게 재전송하는 방식입니다.

 

 

5. Fast Recovery (빠른 회복)

빠른 회복 기법은 혼잡 상태가 되면 window의 크기를 1로 줄이지 않고 반으로 줄이고 선형으로 증가시키는 방법입니다. 빠른 회복 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 합 증가/곱 감소 방식으로 동작하게 됩니다.

 

반응형