[Networks] 대규모 비디오 스트리밍 프로토콜 (Netflix, YouTube, ...)
Networks Protocol
tl;dr
- 현재 대부분의 대규모 비디오 스트리밍 서비스들은
UDP
가 아닌HTTP/TCP
기반 프로토콜을 선호 - 안정성, 호환성, 방화벽 친화적인 특성
- 또한 HTTP를 사용하면 기존 CDN 인프라를 효과적으로 사용할 수 있음
DASH (Dynamic Adaptive Streaming over HTTP)
- 비디오를 작은 Chunk로 나누고 각 청크를 HTTP Req/Resp을 통해 전달하는 방식
- 동작 방식
- 비디오를 청크로 나눔
- 비디오 구성 정보가 포함된 매니페스트 파일 다운로드
- 클라이언트가 각 청크 당 HTTP GET 요청
- 서버에서 청크 응답
- DASH가 실시간으로 네트워크 상태를 모니터링해 네트워크 상황이 변할 때마다 비트레이트 조정
왜 UDP가 아닌 TCP(HTTP)를 쓰나?
1. 신뢰성
- TCP는 데이터 전송 중 패킷 손실 발생 시 재전송
- 모든 데이터가 정확히 수신되는 것이 보장됨
- 반면 UDP는 패킷 손실 시 재전송이 없기 때문에 비디오의 품질 저하에 큰 영향을 끼칠 수 있음
2. HTTP 인프라
- DASH는 HTTP를 기반으로 하기 때문에 모든 HTTP 인프라(CDN, 캐싱 서버, 방화벽, 프록시 등)와 원활히 작동
- 대부분의 인터넷 인프라가 HTTP 트래픽을 최적화하도록 설계되어 있으므로 새로운 프로토콜을 도입할 필요 없이 스트리밍 성능 극대화 가능
3. 네트워크 호환성
- HTTP/TCP는 대부분의 네트워크 환경에서 잘 작동하며 방화벽이나 프록시 등에서 차단되지 않는 경우가 많음
- 반면 UDP는 종종 방화벽에서 잘 차단되는 편
- TCP는 혼잡 제어를 자동으로 처리하지만, UDP는 이런 기능이 없어서 트래픽 제어를 좀 신중히 해야함
4. 적응형 스트리밍
- DASH의 핵심은 적응형 스트리밍
- 네트워크 상황에 맞춰 클라이언트가 다양한 비트레이트와 해상도 중에서 선택하는 방식
- TCP의 안정적인 연결을 기반으로 하는 HTTP의 요청/응답 모델이 이 방식과 핏함
UDP는 Live streaming에 더 적합
- 라이브 스트리밍은 더 낮은 지연 시간을 제공하기 위해 UDP를 많이 활용하고 있음 (e.g., Twitch, …)
- 그러나 데이터 신뢰성을 위해 TCP 또한 병행해서 활용 중 (e.g., VOD 재생 등)
Netflix 사례
AWS Infrastructure
- 콘텐츠 수집
- 영화를 수집하고 처리
- 영화의 마스터 버전을 받아 AWS 상의 호스트에 업로드
- 콘텐츠 처리
- 인스턴스에서 데스크탑, 스마트폰, TV 등 각 기기 사양에 적합하도록 각 영화를 여러 형식의 비디오로 변환
- DASH를 이용해 각 형식별로 다양한 비트율의 여러가지 버전 생성
- CDN으로 버전 업로드
- AWS의 각 호스트는 생성한 다양한 버전의 영화를 CDN으로 업로드
자체 CDN
- IXP 및 거주용 ISP 자체에 서버 랙 설치
- 200대 이상의 서버 랙 / 수백 개 이상의 ISP 장소 보유
- 각 서버 랙은 10 Gbps 이더넷 포트 / 100 TB 이상의 스토리지
- Push Caching 방식을 사용해 각 CDN 서버를 채움
- 클라이언트 요청이 발생하기 전에 미리 예상해서 CDN을 채워 놓는 방식
Steaming Flow
- 사용자가 재생할 영화 선택
- AWS에서 실행 중인 넷플릭스 애플리케이션이 영화 사본을 갖고 있는 CDN 서버를 결정
- 영화가 있는 서버 중 클라이언트 요청에 대한 최적의 서버 할당
- 클라이언트는 요청된 영화의 다른 버전에 대한 URL을 가진 매니페스트 파일과 특정 서버의 IP 주소를 보냄
- 클라이언트와 해당 CDN 서버는 독점 DASH를 이용해 직접 상호작용
YouTube 사례
- Netflix와 마찬가지로 자체 CDN 사용
- 대부분의 클러스터 선택 정책은 클라이언트와 클러스터 간의 RTT가 가장 적은 곳을 선택
- 작업 부하를 위해 멀리 있는 CDN을 선택하기도 함
- 재생 위치 조정과 조기 종료로 인한 대역폭과 서버 리소스 낭비를 줄이기 위해 HTTP byte-range 헤더를 사용해 목표한 분량의 선인출 데이터 이후에 추가로 전송되는 데이터 흐름을 제한