TCP의 흐름제어와 혼합제어

zito·2024년 9월 7일
post-thumbnail

TCP

TCP란? 에서 TCP는 안정성과 신뢰성을 높이기 위하여 크게 흐름제어, 혼합제어 라는 두 가지 방법을 사용한다고 하였습니다.
이번 글에서는, 두 가지 방법과 각 방법에서의 사용 기법. 그리고 ARQ에대해 적어보겠습니다.

각 방법에 대해 살펴보기 전에 흐름제어와 혼합제어의 차이점에 대해 간단하게 짚고 넘어가겠습니다.

흐름제어는 수신측이 받을 수 있는 버퍼에 맞게 전송하기 위한 기법입니다.
혼합제어는 네트워크의 데이터 처리 속도에 맞게 전송하기 위한 기법입니다.

즉, 흐름제어는 수신측의 상태, 혼합제어는 네트워크의 상태에 맞춘 기법입니다.

ARQ(Automatic Repeat Request)

ARQ란?

신뢰성 있는 데이터 전달을 위해 재전송을 기반으로 한 에러 제어 방식입니다.

GBn ARQ 기법

Go-Back-n ARQ 기법입니다.
수신측에서 특정 패킷을 못 받거나 문제가 생기면, 문제가 생긴 패킷부터 다시 전송합니다.

문제가 생긴 패킷 이후의 패킷들은 모두 폐기처분됩니다.

해당 기법은 수신측의 역할이 비교적 단순합니다.

SR ARQ 기법

Selected Report ARQ 기법입니다.
GBn ARQ와 달리 잘못보낸 패킷만 다시 전송합니다.

GBn ARQ보다 효율이 높지만, 수신측에서 버퍼를 사용해 패킷을 저장하고 정렬등의 추가 작업이 필요하여 수신측 기기에 부담이 증가합니다.
GBn ARQ에 비해 유자관리비용이 증가합니다.

TCP 흐름제어

TCP의 흐름제어 기법은 송신측과 수신측의 데이터 속도 차이를 해결하기위한 기법입니다.

WHY?

수신측에서 받을 수 있는 버퍼는 정해져있습니다.
송신측에서 수신측의 버퍼를 고려하지 않고 빠른 전송속도를 사용하게 되면, 버퍼가 작아 손실되는 패킷이 있을 수 있습니다.

이러한 문제를 해결하기 위해서는 수신측의 상태에 따라 송신측의 전송 속도가 필요하다.
위 처럼 수신측의 상태에 따라 송신측의 전송 속도를 조절하기 위해 TCP 흐름기법이 사용됩니다.

Stop-And-Wait

전송한 세그먼트에 대한 확인 응답을 받아야 다음 세그먼트를 전달하는 기법입니다.

단순하지만, 수신자의 응답을 기다려야한다는 점에서 효율이 낮습니다.

Sliding Window

수신측에서 설정한 버퍼만큼은 송신측에서 확인 응답없이 세그먼트를 전송할 수 있게 만든 기법입니다.
Stop-And-Wait의 비효율성을 개선한 기법입니다.

Window란?

전송, 수신 스테이션 양쪽에서 만든 버퍼의 크기입니다.
Window의 크기 = 가장 최근 ACK로 응답한 Frame 수 - 이전 ACK Frame을 보낸 수 입니다.

Sliding Window의 동작과정

윈도우 내의 패킷을 전송합니다.
보낸 패킷에 ACK가 수신되면, ACK만큼 Slide하여 윈도우 내의 패킷을 변경합니다.

TCP 혼합제어

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

WHY?

네트워크에 문제가 생겼을 때, 흐름제어 기법이나, ARQ를 사용하게 된다면 재전송이 일어날 것입니다.
이는 네트워크에 추가 부하를 주게 되고 문제 해결에서 멀어집니다.
혼합제어를 사용하면 송신측의 Window Size를 수정하여 문제를 해결할 수 있습니다.

혼잡 윈도우

혼잡윈도우는 송신측에서 Network를 고려해 생성하는 버퍼입니다.
송신측의 Window Size는 수신측에서 제공한 '수신윈도우'와 '혼잡윈도우'중 작은 사이즈를 채택합니다.

"송신 window size = min(수신윈도우, 혼잡윈도우)"

혼잡회피방식

혼잡제어방식은 어떤 상황을 혼잡상태로 인식할지, 윈도우 사이즈를 어떻게 키우고 줄일지를 조정하며 발전해왔습니다.
하지만, 기본적인 혼잡제어 방식은 혼잡회피방식인 AIMD와 Slow Start를 적절하게 조합하는 것 입니다.

AIMD(Addictive Increase Mulicative Decrease)

윈도우 사이즈의 변경 규칙을 합 증가, 곱 감소로 설정하는 방식입니다.
네트워크에 문제가 없다면 1씩 윈도우 사이즈를 키우지만, 문제가 발생하면 윈도우 사이즈를 절반으로 줄입니다.

네트워크가 큰 대역폭을 제공해도 빠르게 못 쓴다는 단점이 있습니다.

Slow Start

Slow Start라는 이름과 다르게, 빠르게 혼잡윈도우의 사이즈를 키웁니다.
ACK가 도착할 때 마다 혼잡윈도우의 사이즈를 2배씩 키우고, 네트워크에 문제가 발생하면 사이즈를 1로 줄입니다.

AIMD에 비해 빠르게 윈도우 사이즈를 키울 수 있습니다.

혼잡제어방식

TCPTahoe

Slow Start + AIMD 의 기법입니다.
Slow Start 기법으로 윈도우 사이즈를 빠르게 증가시키다가 ssthresh(slow start 임계점)을 만나면, AIMD 기법을 사용해 1씩 더하며 윈도우 사이즈를 키우는 기법입니다.

timeout이나 3 ACK Duplicated 같은 혼잡상황이 발생한경우, Window Size를 1로 줄입니다.

아래 이미지는 TCPTahoe의 시간에 따른 혼잡윈도우 크기를 보여주는 그래프입니다.
출처

TCP Reno

Reno는 TCPTahoe를 발전시킨 기법입니다.
Reno는 timeout과 3 ACK Duplicated 상황을 분리하여 대응합니다.

timeout이 발생할 경우 TCPTahoe와 같이 Window Size를 1로 줄입니다.
하지만, 3 ACK Duplicated 상황이 발생할경우 Window Size를 절반으로 줄여서, Window Size의 회복을 쉽게 만듭니다.

아래 이미지는 TCP Reno기법의 시간에 따른 혼잡윈도우 크기를 보여주는 그래프입니다.
출처


출처
https://evan-moon.github.io/2019/11/26/tcp-congestion-control/
https://blog.naver.com/krquddnr37/20197164336
https://ooeunz.tistory.com/91
https://velog.io/@haero_kim/TCP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4-%EA%B8%B0%EB%B2%95-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0

profile
DevOps Engineer를 희망하는 Network Engineer입니다.

0개의 댓글