✔ 한정된 네트워크 자원 내에서 특정 트래픽이 일정수준의 성능, 속도를 보장받는 네트워크 기술이다. QoS(Quality of Service)는 트래픽을 생성하는 애플리케이션의 필수 동작에 맞게 라우터나 스위치 같은 네트워크 디바이스가 해당 트래픽을 전달할 수 있도록 트래픽을 조작하는 것이다.
💡 Flow 특징
- Reliability: 네트워크에서 데이터를 전송하는 과정에서의 패킷의 손실정도를 의미한다. 주된 원인은 네트워크 혼잡으로 인한 버퍼 오버플로우, 흐름제어이다.
- Delay: 서비스 또는 특정 처리를 위해 기다림으로 발생하는 지연이다. 발송지에서 목적지까지 가는 경로에서 발생 되는 지연이라고 볼 수 있다.
- Jitter: 신호가 네트워크를 통해서 전달되는 과정에서 원래 신호로부터 왜곡되는 정도이다.
- Bandwidth: 특정 어플리케이션에 할당된 네트워크 자원의 양을 의미한다. 일정시간에 처리한 데이터의 총량을 가리키는 지표라고 볼 수 있다.
- First-in, First-out(FIFO) 큐잉: FIFO(선입 선출) 대기열에서 패킷은 노드(라우터 또는 스위치)가 처리할 준비가 될 때까지 버퍼(대기열)에서 기다린다. 평균 도착 속도가 평균 처리 속도보다 높으면 대기열이 채워지고 새 패킷이 삭제된다.
- 우선순위 큐잉: 우선 순위 큐에서 패킷은 우선 순위 클래스에 먼저 할당된다. 우선 순위가 가장 높은 대기열에 있는 패킷이 먼저 처리하고 가장 낮은 우선 순위 대기열의 패킷이 마지막으로 처리된다. 우선 순위 대기열은 멀티미디어와 같은 우선 순위가 높은 트래픽이 더 적은 지연 시간으로 대상에 도달할 수 있기 때문에 FIFO 대기열보다 더 나은 QoS를 제공할 수 있다. 그러나 높은 우선 순위 대기열에 연속적인 흐름이 있는 경우 낮은 우선 순위 대기열의 패킷은 처리될 기회가 없다는 단점이있다. 이것은 기아상태라고 불린다.
- 가중 공정 큐잉: 더 나은 스케줄링 방법은 가중 공정 대기열이다. 이 기술은 대기열의 우선 순위에 따라 가중치가 부여된다. 더 높은 우선 순위는 더 높은 가중치를 의미한다. 시스템은 해당 가중치를 기반으로 각 대기열에서 선택된 패킷 수를 사용하여 라운드 로빈 방식으로 각 대기열의 패킷을 처리한다. 예를 들어 가중치가 3, 2, 1이면 첫 번째 대기열에서 3개의 패킷, 두 번째 대기열에서 2개, 세 번째 대기열에서 1개의 패킷이 처리된다. 이런 식으로 우선 순위가 있는 공정한 대기열이 있다.
- Leaky bucket(누수 버킷): 양동이 바닥에 작은 구멍이 있으면 양동이에 물이 있는 한 일정한 속도로 양동이에서 물이 새게 된다. 물이 새는 비율은 양동이가 비어 있지 않는 한 양동이에 물이 유입되는 비율에 의존하지 않는다. 입력 속도는 다를 수 있지만 출력 속도는 일정하게 유지된다. Bursty traffic을 fixed-rate traffic으로 바꿔주는 것을 의미한다.
호스트는 총 24Mbit의 데이터에 대해 2초 동안 12Mbps의 속도로 데이터 버스트를 보낸다. 호스트는 5초 동안 침묵을 지킨 다음 3초 동안 2Mbps의 속도로 데이터를 전송하여 총 6Mbit의 데이터를 전송한다. 전체적으로 호스트는 30Mbits의 데이터를 10초 단위로 보냈다. Leaky Bucket은 동일한 10초 동안 3Mbps의 속도로 데이터를 전송하여 트래픽을 부드럽게 한다.Leaky bucket 동작과정
if(packet arrive) if(buffer is full) discard; else packet stored; run(timer) if(time-out) if(buffer is not empty) send packet; run(timer)
- Token bucket(토큰 버킷): 호스트에 버스트 데이터가 있는 경우 누수 버킷은 평균 속도만 허용한다. 호스트가 idle 상태였던 시간은 고려되지 않는다. 반면에 토큰 버킷 알고리즘을 사용하면 idle한 호스트가 토큰 형태로 미래에 대한 크레딧을 축적할 수 있다. 시계의 각 틱에 대해 시스템은 n개의 토큰을 버킷으로 보낸다. 시스템은 전송된 데이터의 모든 셀(또는 바이트)에 대해 하나의 토큰을 제거한다. 예를 들어 n이 100이고 호스트가 100틱 동안 idle 상태인 경우 버킷은 10,000개의 토큰을 수집한다는 것이다.
토큰 버킷은 카운터로 쉽게 구현할 수 있다. 토큰은 0으로 초기화된다. 토큰이 추가될 때마다 카운터는 1씩 증가한다. 데이터 단위가 전송될 때마다 카운터는 1씩 감소한다. 카운터가 0이면 호스트는 데이터를 보낼 수 없다.Token bucket 동작과정
run(timer) if(time-out) if(현재 토큰수 == Max_num) continue; // Max-num: 가질수 있는 최대 토큰 수 else 현재 토큰수++; run(timer)
- 예시
컴퓨터는 25Mbytes/sec의 데이터를 제공(200Mbps), 라우터는 짧은 인터벌동안 오직 25Mbytes/sec를 다룬다.(200Mbps) 오랜 인터벌 동안은 최고의 rate를 제공하는 속도는 2Mbytes/sec를 넘지 않도록 일한다.(16Mbps)
input to bucket으로는 25MB/sec for 40 msec이다. 이떄 Leaky bucket으로 데이터를 보낸다고 했을때 보내는 속도는 2MB/sec 이고 bucket의 용량은 1MB이다. 그러면 전체 보내는데 걸리는 시간은 500sec이다. Leak bucket에서는 버켓의 용량은 중요치 않고 바로바로 처리한다고 보면 된다.
Token bucket으로 했을때 용량은 250KB이고 token의 도착률은 2Mbps이다. 버스티하게 처리한다고 했을때 처리되는 양이 25MB/sec이고 토큰이 도착하는 속도가 2MB/sec이므로 처음에 처리되는 속도는 23 MB/sec라고 볼 수 있다. 버킷의 용량이 250KB이기 때문에 초반에 용량만큼 다 보내는데 쓰이는 시간은 250/23을 해서 약 11 msec이다. 그 후 토큰이 도착할때마다 처리하므로 2MB/sec로 속도로 보내게 되면 364msec가 걸린다.