Internet bandwidth의 주 소비자는 video traffic이다.
하지만 양이 너무 많아서 한 서버로는 불가능하다.
그리고 heterogeneity 문제도 있다. 그러니까 사용자들의 bandwidth가 다 다르다는 것이다.
이것에 대한 해결책은 distributed, application-level infrastructure이다.
video는 용량이 매우 크기 때문에, 이것을 줄이는 것이 중요하다
우리는 압축을 하기로 했는데, coding이라고 하는 중복을 이용해 이미지의 비트 수를 줄이는 것이다.
이에는 두 가지 방법이 있다.
하나는 한 이미지 내의 같은 부분에 대한 정보를 줄이는 것(spatial)과, 이전 이미지와 달라지지 않은 부분을 줄이는 것(temporal), 이렇게 두 가지가 있다.
Encoding rate가 일정, 즉 보내는 양이 일정한 것을 의미한다.
영상의 변화가 적어 이번에 보내야 하는 비트가 적을 때에는 데이터를 낭비하게 될 것이고 영상의 변화가 커 이번에 보내야 하는 비트가 클 때에는 데이터가 부족해서 화질이 저하되는 문제가 발생할 것이다.
이 방법은 그때그때의 변화량을 감지하여 보내는 양을 변화시키는 방법이다.
영상의 변화가 많으면 높은 bit rate를, 작으면 낮은 bit rate를 사용하는 방식이다.
용량을 효율적으로 사용하는 것은 장점이지만, 높은 bit rate가 요구될 떄는 순간적으로 서버에 과부하를 줄 수도 있다.
video를 스트리밍을 시작할 때, 재생이 시작되면 데이터를 전송받는 와중에도 재생할 수도 있다. 그러나 재생 속도보다 데이터 전송이 느리면, delay가 생기거나 품질 저하를 일으킨다. 버퍼링이 생기는 것이다.
그리고 사용자가 계속 가만히 보는 것이 아니라, 빨리 감기, 되감기, 일정 부분을 스킵하거나 그러면 비디오 패킷이 사라지거나 재전송 될 수도 있다.
그래서 우리는 바로 재생하는 것이 아닌 buffer에 일정량을 쌓아놨다가 송출하는 해결책이 있다.
DASh는 멀티미디어 스트리밍을 HTTP 위에서 하는 것이다.
server에서는 비디오 파일을 여러 chunk로 나누고, 각각의 chunk들을 저장하고 다른 rate로 인코딩을 한다.
그리고 manifest file이라는 관리를 위한 파일에 각각의 chunk들에 대한 URL을 저장하여서 제공한다. (시간대에 따른 특정 URL에 chunk를 저장)
client에서는 주기적으로 bandwidth를 측정한다. manifest file를 이용해 서버에 특정 chunk를 달라고 요청하는데 만약에 괜찮으면 화질 좋은 것을, 나쁘면 화질 낮은 것을 요청한다.
client는 언제 어떤 chunk를 요청할지, 요청할 때 어떤 화질의 chunk를 요청할지, 요청하는 chunk가 여러 군데 분산되어 있을 때 어떤 server로부터 다운 받을 것인지까지 판단한다.
만약에 넷플릭스처럼 수많은 시청자가 있으면 어떻게 서비스를 해야할까?
서버를 엄청 크게?
만약에 서버가 터지면 문제고 트래픽이 커지면 혼잡이 발생한다.
그리고 당연하게도 서버가 멀리 있으면 딜레이가 걸린다.
그리고 한 영화를 여러 사람이 다운 받는 상황도 발생한다.
content distribution networks
여러 개의 CDN 서버를 둔다. 그리고 컨텐츠의 복사본을 CDN 서버(노드)에 저장을 한다. 그렇다면 사용자는 가까운 서버를 통해 컨텐츠에 빠르게 접속할 수 있다.
예를 들면, 넷플릭스가 어떤 영화를 여러 군데 분산 시켜 저장했다고 가정하자.
그러면 구독자는 넷플릭스 서버에서 접속해서 어떤 영화를 찾으면 넷플릭스에서 manifest 파일을 보내준다.
manifest file에는 각각의 chunk가 어떤 url에 있는지 listr가 있다.
이 파일을 보고 클라이언트가 url로 요청하여 chunk를 받는다.
가까운데서 받아오는 것을 선호하지만 network path가 혼잡하면 다른데서 받아올 수도 있다.
