❗ network jitter를 해결하기 위한 DASH와 manifestfile

 

streaming 서비스에서는 네트워크 jitter(network delay)가 존재한다. 서버에서 영상을 받는 과정에서 딜레이가 발생할 수 밖에 없다. 딜레이를 방지하기 위해 버퍼링 시간을 가진다. 이것이 유튜브에서 영상을 클릭하는 순간 곧 바로 재생되는 것이 아니라 순간적으로 버퍼링이 걸리는 이유이다. 버퍼링은 버퍼를 채우는 과정이다. 클라이언트에서의 영상재생 속도보다 서버에서 받아오는 영상 데이터 량이 더 느리다면 영상이 끊기고 다시 버퍼링이 시작된다.

 

버퍼링이 길면 데이터를 많이 받은 후에 시작하는 것이기 때문에 영상시청 중간에 끊길 확률이 적다. 하지만 너무 길면 유저의 이탈률이 늘어날 것이다. 사람의 인내심과 영상이 끊기지 않은 정도 사이의 중용을 지켜야한다.

youtube ↔ client 통신은 에플리케이션간 통신으로 tcp 혹은 udp 에 의존한다.

udp를 쓰면 인코딩된 bps를 충족하는 속도로 server가 영상을 보낼 수 있지만 네트워크 상황을 고려하지 않기 때문에 네트워크 환경이 일정 수준 이하로 떨어지면 영상의 퀄리티에 심각한 피해가 생긴다. 그렇다고 tcp를 쓰자니 서버가 전송 속도를 조절할 수 없기에 원활한 서비스를 제공할 수 가 없다.

 

youtube에서 실제 사용하는 방식은 tcp를 사용하되 application layer에서 DASH라는 기술을 이용하는 방식이다. DASH는 Dynamic Adaptive Streaming Http의 약자로 네트워크에 적응하며 동적으로 http 스트리밍을 하는 방식이다. 이를 구현하기 위해 manifest file이 사용된다.

 

manifest이란?

영상이 업로드 될때, 영상전체가 올라가는 것이 아니라 256kb정도의 chanks로 분할되어서 저장된다. 또한 동일한 chanks에 대해서 여러개의 coding rate version이 생성된다.(128kbps, 256kbps, 512kbps, 1mbps, 2mbps, …) 유튜브에서 영상을 클릭하면 유튜브 서버는 클라이언트에게 manifestfile 을 넘겨준다. 그때 그때 네트워크 상황에 맞는 청크를 요청해서 가져온다. 이는 영상 중간에 화질 바뀌는 이유이다.

 

[manifestfile 예시]

chanks 128kbps 256kbps 512kbps 1Mbps 2Mbps ...
1 URL URL URL URL URL
2 URL URL URL URL URL
3 URL URL URL URL URL
4 URL URL URL URL URL
5 URL URL URL URL URL
n URL URL URL URL URL

 

❗ 서버 부화 방지와 통신속도 상향을 위한 CDN 분산저장(content delivery network)

 

manifestfile를 받아서 네트워크 환경에 따라 다른 버전의 chanks를 요청한다고 해도 많은 사용자가 서버 한곳에 몰리게 되면 과부화가 걸릴 수 밖에 없다. 이것을 해결하기 위해 전세계 CDN업체에 각 chanks를 분산저장하는 방식이 사용된다.

 

[구현원리]

manifestfile의 chanks URL의 ip를 알아내기 위해 cdn업체의 dns 서버에 접근하게 된다.(URL이 CDN 업체의 URL이기 때문이다.) 이때 요청자의 ip 주소를 기반으로 요청자의 위치와 가장 가까운 cdn 서버의 ip를 준다.

 

cdn위치는 사용자에게 가장 가까운 곳에 존재하는 것이 유리하다. 그래서 보통 access network(skt ,kt같은)의 내부 혹은 근처에 CDN이 즐비해 있다.

+ Recent posts