I. 서론
최근 국내에서 LTE(Long Term Evolution) 서비스가 상용화된 이후 가장 주목받고 있는 것이 VoLTE(Voice over LTE) 이다. VoLTE는 LTE환경에서 음성 서비스를 의미하며, 이는 음성과 데이터 통신이 모두 인터넷 프로토콜(IP)방식에서 제공될 수 있다는 의미이며 동시에 진정한 All-IP 시대의 시작을 의미한다. VoLTE를 통한 음성 서비스를 제공할 때에, 사용자의 체감 음성 품질은 중요하다[1]. VoIP(Voice over IP) 환경에서 이 음성 품질에 영향을 주는 기술 요소들은 패킷 손실(Loss), 패킷 지연 분포(지터:Jitter), 단말간 네트워크 지연(Delay), 코덱의 음성 품질, 에코(Echo) 등이 있다. 본 논문에서는 음성 품질에 영향을 주는 지터(Jitter)의 정의와 지터를 감소시키기 위한 지터 버퍼 알고리즘의 종류를 소개하며, 특히 이벤트 방식 지터 버퍼 알고리즘에 대한 분석을 통해서 지터 버퍼 알고리즘의 성능 향상 방안을 제안한다.
II. 지터의 정의
[그림 1]은 음성 패킷의 지터 발생을 도시한 그림이다. VoIP(Voice over IP) 음성 서비스 환경에서 음성 패킷은 송신측에서 20 ms 간격으로 출발하게 되며, 수신측에 20 ms 간격으로 도착해야 사용자 입장에서 음성 품질이 좋다고 느끼게 된다. 하지만, IP 망에서 여러 가지 이유로 지연이 발생해서 음성 패킷이 20 ms 간격으로 수신측에 도달하지 못하면, 사용자는 음성 품질이 나쁘다고 판단한다. 이처럼 음성 패킷의 지연 차이를 지터(Jitter)라고 한다. 좀 더 정확히 표현하면, 음성 패킷 도착 시간 사이의 통계적 변화량(Statistical variance)을 지터라고 한다. 지터가 발생하게 되는 원인은 네트워크 장비에서의 큐잉 (Queuing)/버퍼링(Bufferring), 패킷 재라우팅, 네트워크 멀티플렉싱(Multiplexing), 타이밍 드리프트(Timing Drift) 등 여러 가지가 존재한다.
[그림 1] 음성 패킷의 지터 발생
[그림 2]는 랜(LAN) 환경의 패킷 정체(Congestion)에 의해서 발생하는 패킷의 지연을 도시한 그림이다[2][7]. Congestion의 의해서 패킷의 지연 차이가 발생하는데, 이것은 수신측에서 지터를 의미한다.
[그림 2] 랜(LAN)망의 Congestion에 의한 지연 변화
[그림 3]는 지터를 계산하는 공식을 도시한 그림이다[3]. ①식은 두 개 패킷(i번째/j번째 패킷:j>i)의 송신 시간과 수신 시간을 차이를 계산한 식이고, ②식은 계산된 ①식을 이용한 i번째 패킷을 수신한 이후의 지터를 계산한 식이다. 이전 (i-1)번째 패킷을 수신 했을 때의 지터를 16으로 나눈 것은 노이즈(잡음)를 줄이기 위한 것이다.
[그림 3] 지터 계산 공식
[표 1]은 지터 계산 공식에 의해서 계산한 예제 테이블이다. 3번째 패킷이 수신되었을 때부터 지터가 발생한 상태를 확인 할 수 있다. 지터는 사용자의 음성 품질을 저하 시키는 원인이 되며, 지터를 최소한으로 줄여서 음성 품질을 향상시키기 위한 방법으로 지터 버퍼를 두고 있으며, 지터 버퍼를 통해서 지터를 제어하기 위한 알고리즘을 디지터(De-jitter), 또는 지터 버퍼 알고리즘이라고 한다. 다음 장에서 지터 버퍼 알고리즘에 대해서 자세히 소개 하도록 한다.
[표 1] 공식에 의한 지터 계산 예제
III. 지터 버퍼의 종류
[그림 4]는 지터 제거를 위한 지터 버퍼의 역할을 도시한 그림이다. 송신측에서 음성 패킷을 20ms 단위로 송신했지만, 인터넷망을 통과하는 동안 패킷과 패킷의 간격이 20ms 단위로 유지가 되지 않고 빠르거나, 느리게 차이가 발생하게 된다. 지터를 제거하기 위한 방법으로 수신측에 지터 버퍼를 사용하여 20ms 단위로 도착하지 못한 음성 패킷을 버퍼에 저장한 후에, 코덱 디코딩 모듈로 20ms 단위로 균일한 시간 차이로 보내게 된다. 즉, 버퍼를 이용해서 지터를 제거하여 사용자의 귀에 들리도록 한다.
[그림 4] 지터 제거를 위한 지터 버퍼
[그림 5]는 지터 버퍼의 구조를 도시한 그림이다. 지터를 제거하기 위해서 지터 버퍼의 크기를 너무 크게 정하거나, 또는 너무 작게 정하면, 문제가 발생한다. 지터 버퍼의 크기가 너무 크면, 패킷이 버퍼에 머무르는 시간이 늘어나기 때문에 단대단(End-to End) 지연이 그만큼 증가한다. 반대로, 지터 버퍼 크기가 너무 작으면, 버퍼가 모두 차게 되어 패킷이 손실(Loss)되는 문제가 발생한다. 즉, 네트워크 상태, 단말기 상태 등에 맞는 적절한 지터 버퍼 사이즈가 결정되어야 하며, 이를 위해서 지터 버퍼 알고리즘이 필요하다.
[그림 5] 지터 버퍼의 구조
[그림 6]은 네트워크상의 지연과 지터 버퍼의 크기의 관계를 도시한 그림이다. 결국, 고정된 지연은 지터를 제거하기 위한 지터 버퍼의 크기와는 관계가 없고, 가장 이상적인 지터 버퍼의 크기는 가변 지연의 총합이며, 가장 우수한 지터 버퍼 알고리즘은 네트워크상의 가변 지연을 최대한 정확히 찾아내는 알고리즘이라고 볼 수 있다.
[그림 6] 가변 지연과 지터 버퍼 크기의 관계
지터 버퍼의 종류는 크게 고정형(Fixed) 지터 버퍼와 적응형(Adpative) 지터 버퍼, 두 종류로 나누어진다. 고정형 지터 버퍼는 구현이 간단하고, 단말시스템에 오버헤드가 적은 장점이 있다. 하지만, 네트워크의 가변 지연을 반영하지 못하기 때문에 지터 버퍼의 크기를 너무 작게 설정하면, 지터 버퍼가 모두 차게 되어 패킷이 손실되고, 지터 버퍼의 크기를 너무 크게 설정하면, 지연이 커지는 단점이 있다.
적응형 지터 버퍼는 다시 타임 방식과 이벤트 방식, 두 가지 종류의 지터 버퍼 알고리즘을 수행하는 지터 버퍼로 나누어진다. 먼저 타임 방식의 적응형 지터 버퍼는 RTP[4] 패킷의 타임스탬프와 같은 정보를 이용해서 네트워크의 가변 지연 상태를 유추하여 지터 버퍼 크기를 계산하는 알고리즘을 수행하여 지터 버퍼를 동작시킨다. 이것은 네트워크의 상태를 유추하여 지터 버퍼 크기의 계산하기 때문에, 고정형 지터 버퍼에 비해서 보다 적절한 지터 버퍼 크기를 찾아내는 장점이 있지만, 지속적으로 네트워크 상태를 이용해서 지터 버퍼 크기를 계산하는 방법이 복잡하여 단말 시스템에 오버헤드가 되고, 단말 시스템 마다 클럭이 다르기 때문에 가변 지연을 계산하는데 오차가 발생하는 단점이 있다.
[그림 7]은 타임 방식 적응형 지터 버퍼 알고리즘 에서 사용되는 지터 버퍼 크기 계산 수식이다[5]. ① 식의 Di,min는 I번째 까지 수신된 패킷들의 네트워크 지연 중에 가장 작은 네트워크 지연을 나타내는데 이것은 고정 지연을 의미한다. ②식에서 i-1번째 패킷의 네트워크 지연에서 고정 지연을 뺀 값을 지터 버퍼의 크기로 Bi-1으로 정했는데, 결국 이것은 네트워크 가변 지연을 의미한다. ③식은 Bi-1값에 인자 f를 추가하여 초기 Bi값인 B′i를 도출하고 B′i에 가변 지연을 더해서 최종적인 지터 버퍼 크기인 Bi를 도출한다.
[그림 7] 타임 방식 적응형 지터 버퍼 알고리즘의 지터 버퍼 크기 계산 수식
다음, 이벤트 방식의 적응형 지터 버퍼 알고리즘은 수신 패킷의 코덱 프레임이 지터 버퍼에 입력되고, 출력되는 개수를 이용해서 지터 버퍼의 크기를 결정하는 알고리즘으로서, 다음 장에서 자세히 소개하도록 한다.
IV. 이벤트 방식 지터 버퍼 알고리즘의 분석
[그림 8]은 이벤트 방식의 적응형 지터 버퍼의 구조를 도시한 그림이다[6]. RTP 패킷에 포함된 코덱 프레임이 지터 버퍼에 들어가는 동작을 PUT으로 정하고, 지터 버퍼에 저장 되었던 코덱 프레임이 다시 지터 버퍼에서 출력되는 동작을 GET 동작을 정한다. GET과 PUT 동작을 각각 카운트해서 GET과 PUT의 개수가 같으면(+1/-1 차이는 허용), 지터가 발생하지 않은 것으로 간주하여, 기존의 지터 버퍼 크기(jb_prefetch)를 그대로 유지한다. 개수에 차이가 발생하면 지터가 발생한 것으로 간주하여 지터 버퍼 크기 계산 로직을 이용해서 다시 지터 버퍼 크기를 결정하게 된다.
[그림 8] 이벤트 방식 적응형 지터 버퍼의 구조
이벤트 방식의 지터 버퍼 구조에서 지터 버퍼 크기를 계산하는 알고리즘은 다음과 같다. PUT과 GET의 차이를 계산해서 기존 지터 버퍼 크기보다 작은 상태가 일정한 횟수만큼 반복되면, 현재 지터 버퍼의 크기를 조정하게 된다. 기존 지터 버퍼 크기에서 PUT 과 GET의 차이가 가장 컸던 값의 차이를 3으로 나누어서 최종 차이를 계산하고, 다시 기존 지터 버퍼 크기에서 최종 차이를 빼서 새로운 지터 버퍼 크기를 계산해서 적용한다. 한편, PUT과 GET의 차이를 계산해서 기존 지터 버퍼 크기보다 큰 상태가 되면, 역시 현재 지터 버퍼의 크기를 조정하게 된다. PUT과 GET의 차이가 가장 컸던 값의 차이와 물리적인 지터 버퍼 크기에 가중치를 적용한 값에서 가장 작은 값을 새로운 지터 버퍼 크기를 계산한다.
이벤트 방식의 지터 버퍼 구조는 타임 방식의 지터 버퍼 구조에 비해서 단순한 알고리즘으로 동작하기 때문에, 시스템의 오버헤드가 적어서 스마트폰과 같은 모바일 단말의 VoIP 미디어 엔진에 적용하기에 적합한 구조이다.
V. 결론
지터 버퍼의 종류는 크게 고정형(Fixed) 지터 버퍼와 적응형(Adpative) 지터 버퍼, 두 종류로 나누어진다. 적응형 지터 버퍼는 다시 타임 방식과 이벤트 방식, 두 가지 종류의 지터 버퍼 알고리즘을 수행 하는 지터 버퍼로 나누어진다. 이벤트 방식의 지터 버퍼 구조는 타임 방식의 지터 버퍼 구조에 비해서 단순한 알고리즘으로 동작하기 때문에, 시스템의 오버헤드가 적은 장점을 가지고 있다.
[그림 9]는 지연과 지터 버퍼 알고리즘의 상관관계를 도시한 그림이다. 고정형 지터 버퍼는 패킷 지연 차이에 상관없이 지터 버퍼 크기라 정해져 있기 때문에 그림처럼 지연 버퍼에 의한 지연이 항상 존재한다. 기존의 적응형 지터 버퍼는 패킷의 지연 정보를 이용해서 지터 버퍼의 크기를 가변적으로 조정하기 때문에, 고정형 지터 버퍼보다 지터 퍼버 지연이 줄어들게 되어 음성 품질에 좋은 영향을 주게 된다. 하지만, [그림 9]에서처럼 가변적으로 변하는 패킷의 지연 차이를 적응형 지터 버퍼 알고리즘도 비교적 정확하게 지터 버퍼 크기를 결정하지 못하는 문제가 발생하여, 지터 버퍼 지연이나 지터 버퍼에서의 패킷 손실이 발생한다. 즉, 기존의 적응형 지터 버퍼 알고리즘을 개선한 보다 향상된 지터 버퍼 알고리즘(Advanced Jitter Buffer)의 연구가 필요하다.
[그림 9] 지연과 지터 버퍼 알고리즘의 관계
참고문헌
- 최택진 LG유플러스 기술부장, "VoLTE 시대 눈 앞...무엇이 달라지나," KAIT 웹매거진, 11호, pp. 28-31, 2012년 5월
- "Indepth Article: Jitter ," http://www.voiptroubleshooter.com/indepth/jittersources. html.
- Vladimir Tincar, "VoIP Basics: About Jitter", http://toncar.cz/Tutorials/VoIP/VoIP_Basics_Jitter.html.
- H. Schulzrinne, S. Casner, R. Frederick, V. Jacobson, "RTP: A Transport Protocol for Real-Time Applications," IETF RFC 3550, Jul. 2003.
- Gagan L. Choudhury, Robert G. Cole, "Design and analysis of optimal adaptive de-jitter buffers," Computer Communications, vol. 27, Issue 6, pp. 529-537, Apr. 2004. https://doi.org/10.1016/j.comcom.2003.08.018
- "Adaptive Jitter Buffer," http://www.pjsip. org.
- 신상욱, 이경현, "안전한 데이터 통신에서의 지연 분석," 한국정보호호학회 논문지, 7(4), pp. 23-26, 1997년 12월