비디오 트래픽은 정말 많은 인터넷 대역폭을 사용 중이다.
유튜브나 넷플릭스만 보더라도 정말 많은 유저들을 보유중이다.
그렇기 때문에 이 어마어마한 트래픽을 감당할 수 있어야한다.
또한 각각의 유저들은 서로 다른 단말들을 사용 중일테고 성능이 모두 다를 것이다.
이 두 가지 큰 문제를 해결할 수 있다.
그 전에 비디오는 어떤 식으로 구성되어 있는지 알아야 한다.
Video
비디오는 일정한 속도로 보여지는 연속적인 이미지이다.
아래와 같은 이미지를 보면 우선 이 이미지를 여러 픽셀로 나누어 디지털로 바꿔야 한다.
그런데 자세히 보면 위 아래 끝의 경우 색상이 비슷하다.
이럴 경우 N개의 픽셀로 같은 값을 표현하는 게 아닌 (색상 값, 픽셀의 숫자) 이런 식으로 압축해서 최대한 효율적으로 관리한다.
또한 비디오이기 때문에 이 이미지의 다음 이미지가 존재할 것이다.
물체는 달라졌지만 배경의 경우 거의 변하지 않은 모습을 확인할 수 있다.
이렇게 변하지 않은 부분은 그대로 두고 변한 부분만 인코딩하는 것이다.
이러한 방식들을 사용하여 효율적으로 관리한다.
비디오를 CBR이나 VBR 방식을 사용하여 인코딩 해서 서버에 올리면 클라이언트는 이 인코딩된 값을 받아서 디코딩을 할 것이다.
Streaming
클라이언트가 비디오를 보는 방법은 크게 두 가지가 있다.
첫 번째는 Download & Play로 동영상 자체를 전부 받은 다음에 재생한다.
두 번째는 Streaming 방법으로 조금 다운로드 하고 그 만큼만 재생하고 조금 다운로드 하고 그 만큼만 재생하는 것을 반복한다.
요즘에는 대부분 Streaming 방식으로 비디오를 본다.
Streaming 방식에도 여러가지가 존재하는데 그 중 하나인 DASH(Dynamic Adaptive Streaming over HTTP), 동적 적응 스트리밍에 대해서 알아보려고 한다.
DASH(Dynamic Adaptive Streaming over HTTP)
서버 측에서는 우선 파일을 여러 개의 chunk로 나눈다.
그리고 각각의 chunk들은 다른 속도들로 인코딩 된다.
다른 속도들로 인코딩 되는 이유는 단말마다 성능이 다르고 네트워크 환경이 바뀌는 경우에 대비하기 위해서이다.
서로 다른 chunk들에 대한 정보가 담겨있는 파일을 manifest file이라고 한다.
클라이언트는 주기적으로 서버와 클라이언트 사이의 대역폭을 체크한다.
만약 네트워크 성능이 떨어진다면 bit rate가 낮은 chunk를 manifest file로부터 가져오기 때문에 최대한 비디오가 끊기지 않게 스트리밍 할 수 있게 된다.
유튜브를 생각한다면 이해하기 쉽다.
유튜브도 처음에는 좋은 화질로 영상을 보다가 네트워크 환경이 나빠지면 낮은 화질로 바꾸어 보여준다.
정리 하자면 클라이언트는 buffer에 적당한 양의 chunk를 유지하기 위해 언제 chunk를 요청할 지 결정하고
사용 가능한 대역폭에 맞게끔 퀄리티를 조절하기 위해서 어떤 encoding rate를 요구할 지 결정하고
클라이언트에게 가장 가까운 URL server로부터 chunk를 가져오기 위해 어디에 있는 chunk를 요구할지 결정한다.
Content Distribution Networks (CDNs)
앞서 말했다싶이 하나의 큰 서버만 운영하는 것은 위험하다.
하나가 망가지면 전부 망가지고 트래픽이 너무 많이 몰리게 되고 멀리 있는 클라이언트의 경우 성능이 떨어질 수밖에 없다.
그래서 여러 개의 서버에 비디오의 복사본들을 넣어두고 지역적으로 넓게 설치하는 것이다.
이를 CDN이라고 한다.
이를 설치하는 방식은 두 가지가 있다.
enter deep은 많은 곳에 CDN 서버를 클라이언트와 가깝게 배치하는 것이고 bring home은 지역들 간의 접점 지역에 설치하여 CDN 서버의 개수를 줄이는 것이다.
클라이언트가 넷플릭스에서 영화 A를 보는 과정을 살펴보면
우선 영화 A를 보겠다고 요청을 하면 해당 url 정보가 담긴 manifest file을 받는다.
이 파일을 바탕으로 가장 가까운 CDN 서버에게 요청을 하고 만약 성능이 떨어진다면 다른 CDN도 찾아보면서 동적으로 대응한다.
'공부 > Network' 카테고리의 다른 글
[Network] Transport Layer (다중화/역다중화, TCP가 reliable한 이유) (0) | 2023.04.11 |
---|---|
[Network] 소켓 프로그래밍 (TCP/UDP) 개념 및 실습 (0) | 2023.04.07 |
[Network] P2P applications (0) | 2023.04.03 |
[Network] DNS (0) | 2023.03.27 |
[Network] FTP, Electronic Mail (0) | 2023.03.26 |
댓글