본문 바로가기
IT 이론/네트워크&무선통신

Transport Layer에서의 Congetion control

by 지식id 2013. 12. 11.
반응형

어떤 컴퓨터에서 다른 컴퓨터로 고용량의 데이터를 패킷 스위칭 방식을 통해서 전송 한다고 가정 해 보자.

수십메가 이상의 데이터를 보내려면 그 데이터를 패킷 하나에 다 담을 수 없기에 여러개의 작은 Segment로 분할해 하나씩 패킷에 실어 보내야 한다.

 

패킷이 정상적으로 전달되었는지 확인 하기 위해 네트워크는 ACK를 주고받는다. 패킷을 보내고, 정상적으로 받았다는 ACK가 오면 다음 패킷을 보내는 것이다. 하지만 말만 들어봐도 정말 느릴 것 같다. 그렇다고 무작정 패킷을 여러개씩 보내 버리자니 네트워크 혼잡도에 따라서 안정성이 걱정된다.

 

그래서 도입된 개념이 Window라는 것이다. 몇 개의 패킷을 묶은 단위를 Window라고 하고 Congetstion window size에 따라서 연속적으로 보낼 패킷의 양을 조절한다. 이 조절을 어떻게 하는지에 관한게 이번에 다룰 Congestion control이다.

 

Congetsion window size가 1이다.

즉 패킷 1개만 날린다. ACK가 올 경우

 

Congetsion window size는 2이다.

즉 패킷 2개를 연속으로 날린다. ACK 이 정상적으로 올 경우

 

Congetsion window size는 4이다.

사이즈는 x2를 하며 Exponential 하게 증가된다. 이런식의 증가를, 처음에는 느리게 시작해서 빠른 속도로 증가한다고 하여 Slow Start라고 부른다.

ACK이 정상적으로 올 경우

 

Congetsion window size는 8이다.

이런식으로 가파르게 증가하다 보면 나중엔 증가 속도가 너무 빨라서 불안정해 진다.

 

그래서 Slow start threshold(이하 ssthresh) 라는 한계점을 둔다. 예를 들어 ssthresh가 16일 경우 16까지는 exponential 하게 증가 하다가 그 뒤 부터는 Linear하게 증가시킨다. 어느정도 안전하다 싶은 지점 까지는 빠르게 증가시키고 조금 불안해 진다 싶으면 조심스럽게 증가시키는 것이다. 이렇게 Linear하게 증가되는 구간을 Congetstion avoidance이라고 부른다.

 

즉, Congestion control은 slow start, congestion avoidance 두가지 구간으로 나누어 지는데 그 기준이 slow start threshold인 것이다.

 

그럼 이 증가가 언제까지나 계속 될 것인가? 분명히 그렇지 않다. ACK이란걸 사용하는 이유도, Congestion control이라는 체계가 필요한 이유도 네트워크라는게 그렇게 전송이 보장 될 만큼 안정하지 않기 때문이다. congestion control도 네트워크 혼잡으로 패킷이 유실될 경우를 다 고려한 체계이다. 그렇다면 이를 어떻게 감지하고 이에 대한 대책은 무엇일까?

 

1. Congestion Detection - 3 Duplicated ACK

 

우선 ACK을 받아 들이는 방식에 관해 이해를 해야 되는데, 쉽게 예를 들어 보자면 ACK 12 가 왔다는건 12번을 받았다는게 아니라 12번 이전까지는 모두 받았으니 이제 12번을 보내라는 뜻이다. 즉 패킷 1을 보내면 ACK는 2가 오는 것이다. 이는 데이터는 정상적으로 전달 되었는데 ACK이 유실되어 데이터를 한번 더 보내는 비효율적인 상황을 방지하기 위함이기도 하고 어떤 패킷이 얼마동안 도착하지 않았다는걸 표현하기 위함이기도 하다. 이런 ACK교환 방식을 Cumulative ACK 이라고 한다. 여튼 이 ACK의 특징을 이용해서 네트워크는 데이터가 유실되었음을 감지 할 수 있다.

 

송신측에서는 1, 2, 3, 4, 5 를 보냈는데 수신측에서는 1, 2, 4, 5 만 받았을 경우.. 수신측은?

 

 패킷 1이 왔을때 ACK2를 보낸다.

 패킷 2가 왔을때 ACK3을 보낸다.

 패킷 4가 왔을때 ACK3을 보낸다.

 패킷 5가 왔을때 ACK3을 보낸다.

 

이런식으로 못 받은게 있다면 그 뒷 패킷을 받든 못받든 무조건 못 받은 패킷에 대한 ACK을 보낸다. 그러다가 뒤늦게 패킷 3이 온다면 ACK6을 보내면 되는 것이다. 하지만 이런식의 중복된 ACK이 3번 이상 올 경우 네트워크는 해당 패킷이 유실되었다고 간주하는데 이런 중복된 ACK을 Duplicated ACK이라고 하고 보통 제한을 3번까지로 두는데 이걸 3 Duplicated ACKs 또는 줄여서 3ACKs라고 부른다.

요약하면, 네트워크는 3ACKs가 발생하면 해당 패킷이 손실된 것으로 간주한다.

 

2. Congetion Detection - Timeout

 

그런데 이런 중복 ACK가 오지도 않고 그냥 ACK이 아예 오지 않는 경우도 있다. 중복 ACK이 올 경우엔 전송은 되고 있는데 패킷 한개가 유실된 것이라 추측 할 수 있지만 아예 ACK이 오지 않는건 좀 더 심각한 문제이다. 전송이 안되고 있는 것이다.

이럴 때는 정해진 시간동안 ACK을 기다려 보고 그때까지 ACK이 오지 않는다면 Timeout 처리를 해 버린다. 일정 시간동안 ACK이 오지 않으면 마찬가지로 패킷이 유실되었다고 보는 것이다.

 

3. Congestion Control

 

위의 두가지 경우와 같이 Congetstion이 Detection 될 경우 그에 맞춰서 Window size를 줄여야 한다. Congestion의 정도에 따라서 줄이는 방식도 다르다. 위에서 설명 했듯이 3 Duplicated ACKs보단 Timeout이 더 심각한 문제다.

 

만약 3 Duplicated ACKs이 발생 할 경우 Congestion window size를 반으로 줄이고 그 지점부터 Linear하게 증가시킨다. 하지만 Timeout이 발생하면 아예 1로 초기화를 해 버리고 다시 Slow start부터 시작한다. 그리고 ssthreshold를 Congestion window size의 반으로 줄인다. 즉, Timeout이 한번 발생한 뒤로는 발생하기 이전의 윈도우 최대값의 1/2만큼 exponential 하게 증가하고 그 다음부터는 라이너하게 증가하게 된다. 한번 불안정한 모습을 보여 준 네트워크이므로 좀 더 조심스럽게 올리겠다는 것이다.

반응형

'IT 이론 > 네트워크&무선통신' 카테고리의 다른 글

Channel Borrowing  (0) 2013.12.12
Near-far Problem  (0) 2013.12.12
Mobile Communication Systems  (0) 2013.12.11
Channel Coding and Error Control  (0) 2013.10.23
Propagation loss - Fading, Path loss, Delay spread, ISI  (0) 2013.10.23

댓글