본문 바로가기
데이터 통신

[데이터 통신과 네트워킹] TCP 혼잡 제어

by IT 정복가 2022. 10. 7.
728x90

 

◆ TCP 혼잡 제어

TCP는 네트워크에서 혼바 제어를 위해 서로 다른 정책을 사용

 

혼잡 창
- TCP의 많은 세그먼트 손실은 세그먼트의 재전송의 증가를 의미하고, 혼잡을 악화시켜 결국 통신에 충돌을 초래

- TCP는 IP 서비스를 사용하는 종단간(end-to-end) 프로토콜이며, 라우터에서의 혼잡은 IP 영역에 속해 있으며 IP에 의해 처리되어야 함

- 그러나 IP는 단순한 프로토콜이며, 혼잡 제어를 제공하지 않으므로, TCP 스스로 문제에 대한 책임을 져야 함

- TCP는 네트워크에서 혼잡을 무시할 수 없으며, 적극적으로 네트워크에 세그먼트를 보낼 수 없음. 왜냐하면 공격적인 결과는 TCP 스스로 좋지 않은 상황에 빠질 수 있음

- TCP는 네트워크에서 사용 가능한 대역폭을 활용할 수 없기 때문에 각 시간 간격마다 세그먼트의 적은 수를 전송하거나 매우 신중해야 처리해야 함

- TCP는 혼잡이 감지되면 전송 속도를 줄이고, 혼잡이 없을 경우에는 전송 속도를 빠르게 하는 정책을 정의해야 함

- 전송되는 세그먼트들의 개수를 제어하기 위해, TCP는 네트워크의 혼잡 상황에 의해 제어되는 윈도우 크기인 혼잡 창(cwnd)이라 불리는 또 다른 변수를 사용

- cwnd 변수와 rwnd 변수는 TCP에서 함께 전송 창 크기를 정의

- 첫 번째(cwnd)는 중간 네트워크에서 혼잡에 관련된 것이고, 두 번째(rwnd)는 종단에서 혼잡에 관한 것이며, 실제 창 크기는 두 값의 최솟값

(*Actual window size = minimum (rwnd, cwnd))

 

혼잡 감지
- TCP 송신자는 네트워크에서 타임아웃과 3개의 중복 ACK의 두 가지 이벤트 발생을 사용

1. 첫 번째는 타임아웃(time-out)
- 만일 TCP 송신자가 타임아웃이 발생하기 전 세그먼트 또는 세그먼트들의 ACK를 받지 못할 경우, 이것은 세그먼트가 혼잡에 의해 손실되었다고 가정함

2. 두 번째 이벤트는 3개의 중복 ACK의 수신(같은 응답 번호와 4개의 ACK)
- TCP 수신자가 중복된 ACK를 응답하면, 이것은 세그먼트가 지연되었다는 신호
- 그러나 3개의 중복 ACK를 보내는 것은 네트워크에서 혼잡 때문에 세그먼트가 손실된 것

*혼잡을 통제하기 위한 TCP의 전반적인 정책은 세 가지 알고리즘에 바탕을 두는데 1) 느린 시작, 2) 혼잡 회피,3) 빠른 회복

 TCP 혼잡 정책

1) 느린 시작

2) 혼잡 회피

3) 빠른 회복

 

느린시작: 지수 증가

느린 시작(slow start) 알고리즘에서 혼잡 창(cwnd)의 크기는 최대 세그먼트 크기(MSS, Maximum Segment Size)에서부터 시작하며, MSS는 연결 설정 과정 동안 동일한 이름의 옵션을 이용하여 협상함

 

이 알고리즘은 알고리즘 이름과 달리 천천히 시작되지만, 지수적으로 증가

(*MSS: 한 세그먼트에 최대로 보낼 수 있는 데이터 양)

느린 시작, 지수 증가

- 송신자의 창 크기는 cwnd와 같고, rwnd는 cwnd보다 훨씬 크다고 가정하며, 또한 동일 크기의 세그먼트와 MSS 바이트를 운반한다고 가정

- 설명을 간단하게 하기 위하여, 지연-ACK 정책을 무시하였으며, 각 세그먼트는 개별적으로 확인응답된다고 가정

- 송신자는 cwnd=1로 시작하는데, 즉 송신자는 단지 하나의 세그먼트를 전송가능

- 첫 번째 ACK가 도착하면 확인응답 세그먼트는 창에 의해 제거되는데, 이것은 창 안에 하나의 빈 세그먼트가 존재한다는 것

- 혼잡 창 크기가 1만큼 증가하는데, 그 이유는 확인응답이 제때에 도착한 것은네트워크 안에 혼잡이 없다고 판단될 수 있기 때문이며, 따라서 cwnd는 2로 증가됨

- 이제부터는 최대 2개의 세그먼트가 전송 가능하며, 만약 2개의 ACK가 도착하면, 혼잡 창 크기가 4가 되면서, 결과적으로 cwnd의 값은 4로 변경됨

- 느린 시작이 무한정 계속될 수는 없고, 이 단계를 중지할 임계치가 반드시 필요

- 송신자는 ssthresh(느린 시작 임계치: slow start threshold)라 불리는 변수를 관리하고, 바이트 단위의 창 크기가 임계치에 도달하면, 느린 시작은 중지되고 다음 단계가 시작됨

 

혼잡 회피: 가산 증가

혼잡이 발생하기 전에 미리 혼잡을 예방하기 위해서는 지수 형태로 증가하는 속도를 낮출 필요가 있음

 

TCP는 cwnd가 지수적이 아닌 가산적으로 증가하는 혼잡 회피(congestion avoidance) 알고리즘을 정의

 

혼잡 창 크기가 cwnd = i 인 느린 시작 임계치에 도달하면, 느린 시작 단계는 종료되고 가산 단계가 시작

 

이 알고리즘에서 전체 창만큼의 세그먼트가 확인응답될 때마다 혼잡 창의 값은 1씩 증가하고, 창은 RTT 동안 전송된 세그먼트의 수임

혼잡 회피, 가산 증가

- 송신자는 cwnd = 4 로 시작

- 이것은 송신자가 오직 4개의 세그먼트만 보낼 수 있다는 것

- 4개의 ACK가 도착한 후에 확인응답 세그먼트들은 창으로부터 제거되고, 그것은 지금 창에 1개의 빈 세그먼트 틈새가 있음을 의미

- 혼잡 창 크기도 1이 증가하게 되어 창 크기는 5로 변경됨

- 5개의 세그먼트를 전송하고, 5개의 확인응답을 받은 후에 혼잡 창 크기는 6 이 됨

- 창 크기는 오직 MSS(바이트 안의)의 1/cwnd 만큼을 증가

- 또한 이전 창의 모든 세그먼트들은 창 1 MSS 바이트를 증가시키기 위해 확인응답을 해야 함

- 혼잡 회피 알고리즘에서 혼잡이 감지되기 전까지 혼잡 창 크기는 가산적으로 증가

 

빠른 회복

- 빠른 회복(fast recovery) 알고리즘은 TCP선택 사항

 

- 이전 버전의 TCP는 사용하지 않았지만, 새로운 버전들은 빠른 회복을 사용하는 경향임

 

- 이것은 네트워크의 가벼운 혼잡으로 판단되는 3개의 중복 ACK가 도착될 때 시작되고, 혼잡 회피처럼 이 알고리즘은 가산 증가하지만, 중복된 ACK가 도착할 때 혼잡 창 크기를 증가시킴


 혼잡 제어 정책 전환

위에서 3개의 혼합 정책을 설명하였고 실제 운용되고 있는 혼잡 제어 알고리즘에 대해 설명하고자 함

 

TCP의 세 가지 버전인

1) Taho TCP

2) Reno TCP

3) New Reno TCP

 

1. Taho TCP

Taho TCP로 알려져 있는 초기 TCP는 그들의 혼잡 정책에 오직 서로 다른 두 가지 알고리즘인 느린 시작(slow start)과 혼잡 회피(congestion avoidance) 알고리즘을 사용

Taho TCP의 FSM

- Taho TCP는 혼잡 감지, 타임아웃, 그리고 3개의 중복된 ACK을 발견하기 위해 2개의 신호를 이용

- 이 버전에서 연결이 설정될 때, TCP는 느린 시작 알고리즘을 시작하고 ssthresh 변수를 pre-agreed value(사전-동의값, MSS의 일반적 배수)로 설정하고, 1개의 MSS에 cwnd를 설정

- 이 상태에서 전에 말했듯이 ACK가 도착할 때마다 혼잡 창 크기는 1씩 증가한다. 이 정책이 매우 적극적이고 전형으로 창 크기를 증가시킨다는 것을 알고 있으며, 이것이 혼잡을 초래할지도 모른다.

- 만약 혼잡이 감지되면(타임아웃의 발생이나 3개의 중복된 ACK 도착), TCP는 즉시 이러한 공격적인 증가를 가로막고 임계치를 현재 cwnd의 절반으로 제한하고 혼잡 창을 1로 재설정하여 새로운 느린 시작 알고리즘을 다시 시작한다.

- 즉, TCP는 처음부터 다시 시작될 뿐만 아니라 임계치를 조정하는 방법도 학습한다. 만약 임계치에 도달하는 동안 혼잡이 감지되지 않으면, TCP는 최댓값의 한계에 도달했음을 인식한다.

- 이 속도로 계속해서는 안 된다. 혼잡 회피 상태로 이동하고 그 상태로 계속 유지한다.
 
- 혼잡 회피 상태에서, 혼잡 창 크기는 ACK의 크기가 현재 창 크기와 같아질 때마다 1씩 증가된다. 예를 들어 만약 창 크기가 지금 5 MSS이면, 창 크기가 6 MSS가 되기 전에 5개의 ACK를 더 수신해야 한다.
- 이 상태에서 혼잡 창 크기의 상한이 없을 때 혼잡이 탐지되지 않는 한 혼잡 창의 가산 증가는 데이터 전송 단계의 끝에서 계속된다. 만약 이 상태에서 혼잡이 탐지되면, TCP는 다시 ssthresh의 값을 현재 cwnd 값의 반으로 재설정하고, 다시 느린 시작 상태로 이동한다.
- 비록 이 버전의 TCP에서 ssthresh의 크기가 지속적으로 혼잡 탐지에서 조정될지라도 이것은 반드시 전 값보다 더 낮게 설정됨을 의미하지 않는다.
- 예를 들어, 만약 원래 ssthresh 값이 8MSS이고, TCP가 혼잡 회피 상태이고 cwnd의 값이 20일 때 혼잡이 탐지되면, ssthresh의 새로운 값은 10으로 증가되었음을 알 수 있다.

예시)

Taho TCP의 예

1. TCP는 데이터 전송을 시작하고, ssthresh 변수를 16MSS로 정한다. TCP는 cwnd=1에서 느린 출발(SS, slow-start)을 시작한다.

2. 혼잡 창은 기하급수적으로 증가하지만 타임아웃은 세 번째 RTT(임계치에 도달하기 전에) 후에 발생한다.

3. TCP는 네트워크에 혼잡이 있다고 가정한다. 즉시 새로운 ssthresh를 4MSS(현재 8로 설정된 cwnd의 반)로 설정한 다음 cwnd=1로 설정된 새로운 느린 시작(SA) 상태를 시작한다.

4. 혼잡은 기하급수적으로 새로 설정된 임계치까지 증가하게 된다. TCP는 이제 혼잡 회피(CA) 상태로 변하고, 혼잡 창은 추가적으로 cwnd=12 MSS에 도달할 때까지 증가한다. 그 순간 3개의 중복된 ACK가 도착하고, 또 다른 혼잡이 암시된다. TCP는 ssthresh 값을 반인 6 MSS로 줄이고, 느린 시작 상태가 된다. cwnd의 지수 증가는 계속된다.

5. RTT 15일 후에 cwnd 크기 4 MSS이다. 4개의 세그먼트를 보내고 오직 두 ACK를 받은 후에, 창 크기가 ssthresh(6)에 도달한 TCP는 혼잡 회피 상태에 들어간다. 연결이 RTT 20 이후 끊어질 때까지 데이터 전송은 현재 혼잡 회피(CA) 상태에서 계속된다.

2. Reno TCP

TCP의 새로운 비전인 Reno TCP는 혼잡 제어 FSM에 빠른 회복이라는 상태를 추가한 것이다.

Reno TCP의 FSM

- 이 버전은 혼잡한 2개 신호인 타임아웃과 각각 다르게 도착하는 3개의 중복된 ACK를 다룬다. 이 버전에서 만약 타임아웃이 일어나면, TCP는 느린 시작 상태(이미 이 상태에 있다면 새로운 라운드를 시작한다)로 들어간다.

- 또 한편으로는 만약 3개의 중복된 ACK가 도착하면, TCP는 빠른 회복 상태로 전환하고, 더 중복된 ACK들이 도착하는 한 같은 상태를 유지한다. 빠른 회복 상태는 느린 시작 상태와 혼잡 회피 상태의 중간 형태이다.

- 이것은 cwnd가 지수적으로 증가하는 느린 시작처럼 동작한다. 그러나 cwnd ssthresh에 3 MSS(1 대신에)을 더한 값에서 시작한다. TCP가 빠른 회복 상태에 돌입할 때, 세 가지의 주요 이벤트가 발생할 것이다.

- 만약 중복 ACK가 계속 도착하게 되면, TCP는 이 상태에서 머무르지만 cwnd는 지수적으로 증가하게 된다.

- 만약 타임아웃이 발생하면, TCP는 네트워크에 실재적인 혼잡이 있다고 가정하고, 느린 시작 상태로 돌입한다.

- 만약 새로운 ACK(중복되지 않은)가 도착하면, TCP는 혼잡 회피 상태로 돌입하고, 마치 3개의 중복 ACK들이 나타나지 않았던 것처럼 ssthresh 값으로 cwnd의 크기를 줄여 느린 시작 상태에서 혼잡 회피 상태로 전환한다.

 

예시)

Reno TCP의 예제

1. 3개의 중복 ACK들이 도착할 때 혼잡 창의 변화는 RTT 13까지 동일하다. 그 순간, Reno TCP는 ssthresh를 6 MSS(Taho TCP로서 동일한 것)로 감소하지만, 대신 cwnd를 1 MSS보다 높은 값(ssthresh+3=9 MSS)으로 설정한다.

2. Reno TCP는 빠른 회복 상태로 전환한다. 추가적으로 2개의 중복 ACK가 RTT 15까지 도착하고 cwnd가 지수적으로 증가한다고 가정하고 있다.

3. 그 순간 잃어버린 새로운 세그먼트를 알리기 위해 새로운 ACK(중복되지 않은)가 도착한다.

4. Reno TCP는 혼잡 회피 상태로 전환하게 된다. 하지만 첫 번째로 빠른 회복 상태를 무시하고 혼잡 창을 이전 트랙 뒤로 움직이는 것과 같이 6MSS로 줄인다.

3. New Reno TCP

TCP의 가장 최신 버전인 NewReno TCP는 Reno TCP에 최적화를 추가한 것이다.

- 이 버전은 TCP에서 3개의 중복 ACK가 도착할 때, 현재 1개 이상의 세그먼트를 잃었는지에 대해 조사한다. 만약 새로운 ACK가 창의 끝을 정의한 후 혼잡을 감지한다면, 오직 하나의 세그먼트만 잃었다고 확신한다.

- 그러나 만약 ACK 수가 재전송 세그먼트와 창의 끝 사이에 정의된다면, ACK로 정의된 세그먼트 또한 잃었을 가능성이 있다.

- NewReno TCP는 더 많은 중복된 ACK의 수신을 회피하기 위해 이 세그먼트를 재전송한다.
728x90