블로그 이전했습니다. https://jeongzero.oopy.io/
TCP 혼잡제어
본문 바로가기
컴퓨터 관련 과목/Network

TCP 혼잡제어

728x90

TCP 혼잡제어


TCP는 다른 호스트에서 동작하는 두 프로세스 사이의 신뢰적인 전송 서비스를 제공한다. TCP의 다른 매우 중요한 요소는 TCP의 혼잡제어 메커니즘이다. 네트워크 혼잡에 따라 연결에 트래픽을 보내는 전송률을 각 송신자가 제한하도록 하는 방법을 뜻한다. 만약 TCP 송신자가 자신과 목적지 간의 경로에서 혼잡이 없음을 감지하면 송신자는 송신율을 높인다. 반면 송신자가 경로 사이에 혼잡을 감지하면, 송신자는 송신율을 줄인다.


그렇다면 송신자는 언제 트래픽 전송률을 어떻게 제한하는가? 송신자는 자신과 목적지 사이 경로의 혼잡을 어떻게 감지하는가? 마지막으로 송신자는 종단간의 혼잡을 감지함에 따라 송신율을 변화시키기 위해서 어떤 알고리즘을 사용해야 하는가?


우선 송신자가 연결로 트래픽을 보내는 전송률을 어떻게 제한하는지부터 살펴보자. 송신 측에서 동작하는 TCP 혼잡제어 메커니즘은 혼잡 윈도우(cwnd)를 기록한다. 혼잡 윈도우는 그냥 전송가능한 버퍼크기라고 생각하면 되는데 송신자는 최대 자신의 혼잡윈도우 크기만큼 트래픽을 전송가능하다. 이 혼잡윈도우는 네트워크의 혼잡도에 따라 커지기도하고 작아지기도 한다.


두번째로 자신과 목적지 사이 경로의 혼잡을 어떻게 감지하는지를 알아보자. 


타임아웃이 되거나 수신자로부터 3개의 중복된 ACK들의 수신이 발생하면 TCP 송신자 측에 손실 이벤트가 발생했다고 생각하고 혼잡위도우 크기를 조절한다.


마지막으로 혼잡을 감지했고 이제 송신율을 변화시켜야 하는데 그럼 어떠한 알고리즘을 사용해야 하는지를 살펴보겠다. 이는 TCP 혼잡제어 알고리즘으로 설명이 가능하다.


1. 슬로스타트

2. 혼잡 회피

3. 빠른 회복


이 세가지가 주요한 알고리즘이다. 



1. 슬로스타트


슬로스타트란 TCP 연결이 시작될 때, 혼잡윈도우의 값은 일반적으로 1MSS로 초기화 된다. 슬로스타트 단계에서는 혼잡윈도우 값을 1MSS에서 시작하여 한 전송 세그먼트가 첫 번째 확인응답을 받을 때 1MSS씩 증가한다. 그다음 혼잡윈도우  크기만큼 세그먼트를 보내고 그에대한 확인응답이 오게되면 2MSS만큼 혼잡윈도우를 증가시킨다. 이렇게 혼잡윈도우의 크기를 2^n 씩 증가를 시키게 되면(n은 0부터 시작) 슬로스타트는 지수함수의 형태를 띄게 된다.


이러한 지수적 증가가 끝나는 시점은 3가지로 나뉜다.


첫째. 타임아웃에 의한 손실이벤트가 있을 경우, TCP 송신자는 cwnd 값을 1로 하고 다시 처음부터 슬로스타트를 시작하고 ssthresh 값을 혼잡이 검출되었을 때의 cwnd/2으로 정한다.


둘째. 슬로스타트가 진행되다가 현재 ssthresh 값과 같아지면 슬로 스타트는 종료되고 TCP는 혼잡 회피 모드로 전환한다. 혼잡 회피 모드란 조만간 혼잡이 발생할 가능성이 매우 크므로 혼잡윈도우의 크기증가율을 매우 조심스럽게 증가시키는 구간을 뜻한다. 따라서 이때부터는 지수적인 증가가 아닌 1MSS씩 증가를 시킨다.


셋째, 만약 3개의 중복 ACK들이 검출되면 TCP는 빠른 재전송을 수행하여 빠른 회복 상태로 들어간다.





위 그림은 보면 x축은 RTT를 의미하고 y축은 RTT에 따른 혼잡윈도우를 뜻한다(그림이 잘못나온듯..)

1-4 라운드 까지는 슬로스타트를 진행하다가 ssthresh 값에 도달하고나서부터는 1MSS씩 증가된다. (4-8 라운드를 혼잡회피 구간이라 함)




2. 혼잡 회피


혼잡 회피는 ssthresh 값과 동일해졌을 때 아 혼잡이 발생할 가능성이 지금부터 매우 크겠구나! 라고 생각이 드는 부분이기 때문에 혼잡윈도우는 1MSS씩 선형으로 증가한다. 이렇게 선형으로 증가를 하다가 타임아웃이 발생했을 때는 슬로스타트와 똑같이 혼잡윈도우의 크기를 1MSS로 초기화 하고 빠른 회복으로 들어간다. 또한 타임아웃이 발생할 때의 혼잡윈도우 크기 값의 반으로 ssthresh를 설정한다. 만약 타임아웃이 아닌 3개의 중복 ACK 수신에 의한 손실 이벤트라면 혼잡윈도우의 크기를 현재 크기의 절반으로 줄이고 빠른 회복으로 들어간다.





 3. 빠른 회복


빠른회복은 크게 2가지로 나뉜다. 


1. TCP Tahoe

이는 초기버전으로 타임아웃이 되거나 3개의 중복 ACK에 의한 손실이 발생하면 무조건 혼잡윈도우를 1MSS로 줄이고, 슬로 스타트 단계로 들어간다.


2. TCP Reno

Tahoe 이후에 나온 버전으로 3개의 중복 ACK에 의한 손실이 발생하면 혼잡윈도우 크기를 1MSS로 줄이는게 아니라 현재 혼잡윈도우 크기의 절반으로 줄인다음 1MSS씩 선형으로 증가를 시킨다. 만약 타임아웃에 의한 손실이라면 Tahoe와 마찬가지로 1MSS로 초기화 되고 슬로스타트를 진행한다.




위 그림을 다시보면 9라운드 부터 타호와 리노의 모양이 달라지는 것을 확인 할 수 있다.  마지막으롤 부분적으로 하나를 보자면 4-8 라운드를 잘 보자.

이 부분은 혼잡회피라고 설명했는데 여기는 AIMD 형식의 혼잡제어라고 불린다. 단편적으로 저부분만 보면 혼잡윈도우는 1MSS 씩 증가하다가 손실이벤트가 발생하면 1로 다시 뚝 떨어지고 다시 1MSS씩 증가하다가 손실이벤트가 발생하면 1로 뚝떨어지게 되는 것을 반복할 것이다. 이러한 모양을 다음의 그림같이 톱니모양으로 반복된다.








728x90