◆ 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는 혼잡 감지, 타임아웃, 그리고 3개의 중복된 ACK을 발견하기 위해 2개의 신호를 이용
- 이 버전에서 연결이 설정될 때, TCP는 느린 시작 알고리즘을 시작하고 ssthresh 변수를 pre-agreed value(사전-동의값, MSS의 일반적 배수)로 설정하고, 1개의 MSS에 cwnd를 설정
- 이 상태에서 전에 말했듯이 ACK가 도착할 때마다 혼잡 창 크기는 1씩 증가한다. 이 정책이 매우 적극적이고 전형으로 창 크기를 증가시킨다는 것을 알고 있으며, 이것이 혼잡을 초래할지도 모른다.
- 만약 혼잡이 감지되면(타임아웃의 발생이나 3개의 중복된 ACK 도착), TCP는 즉시 이러한 공격적인 증가를 가로막고 임계치를 현재 cwnd의 절반으로 제한하고 혼잡 창을 1로 재설정하여 새로운 느린 시작 알고리즘을 다시 시작한다.
- 즉, TCP는 처음부터 다시 시작될 뿐만 아니라 임계치를 조정하는 방법도 학습한다. 만약 임계치에 도달하는 동안 혼잡이 감지되지 않으면, 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에 빠른 회복이라는 상태를 추가한 것이다.
- 이 버전은 혼잡한 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의 크기를 줄여 느린 시작 상태에서 혼잡 회피 상태로 전환한다. |
예시)
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의 수신을 회피하기 위해 이 세그먼트를 재전송한다. |
'데이터 통신' 카테고리의 다른 글
[데이터 통신과 네트워킹] Chapter 10 응용층 기본 연습문제 풀이 (0) | 2022.11.02 |
---|---|
[데이터 통신과 네트워킹] SCTP란? (0) | 2022.10.10 |
[데이터 통신과 네트워킹] Chapter 9 전송층 기본 연습문제 풀이 (2) | 2022.09.30 |
[데이터 통신과 네트워킹] TCP 창, 흐름 제어, 오류 제어 (0) | 2022.09.27 |
[데이터 통신과 네트워킹] TCP 서비스와 특징, 세그먼트, TCP 연결 (1) | 2022.09.26 |