Streaming Stored Video: 두 판 사이의 차이
편집 요약 없음 |
|||
| (같은 사용자의 중간 판 3개는 보이지 않습니다) | |||
| 9번째 줄: | 9번째 줄: | ||
# 서버에서 클라이언트로의 지연이 일시적으로 늘어나 특정 비디오 청크의 도착이 지연되더라도, 해당 청크가 아직 재생되지 않은 버퍼된 청크가 소진되기 전에 도착하기만 하면, 이러한 지연은 사용자에게 전혀 인지되지 않는다. | # 서버에서 클라이언트로의 지연이 일시적으로 늘어나 특정 비디오 청크의 도착이 지연되더라도, 해당 청크가 아직 재생되지 않은 버퍼된 청크가 소진되기 전에 도착하기만 하면, 이러한 지연은 사용자에게 전혀 인지되지 않는다. | ||
# 서버에서 클라이언트로의 대역폭이 일시적으로 비디오 소비 속도보다 낮아지더라도, 클라이언트의 버퍼가 완전히 고갈되지만 않는다면 사용자는 끊김 없이 비디오를 시청할 수 있다. | # 서버에서 클라이언트로의 대역폭이 일시적으로 비디오 소비 속도보다 낮아지더라도, 클라이언트의 버퍼가 완전히 고갈되지만 않는다면 사용자는 끊김 없이 비디오를 시청할 수 있다. | ||
[[파일:Client playout delay in video streaming.png|섬네일|400x400픽셀|Figure | [[파일:Client playout delay in video streaming.png|섬네일|400x400픽셀|Figure 1. Client playout delay in video streaming ]] | ||
Figure | Figure 1은 클라이언트 측의 버퍼링을 시각적으로 보여준다. 예를 들어 비디오가 CBR로 인코딩되었다고 가정하자. 따라서 각 비디오 청크는 일정시간 Δ 동안 재생될 프레임들을 포함한다. 이 경우 서버는 첫 번째 청크를 시간 t<sub>0</sub>에 전송하고, 두 번째 블록을 <code>t<sub>0</sub> + Δ</code>, <code>t<sub>0</sub> + 2Δ</code>에 전송하며, 그 이후도 마찬가지로 일정 간격으로 전송한다. 한편 클라이언트 입장에서는 재생을 시작한 이후, 각 청크가 이전 청크 이후의 Δ 시간 간격으로 재생되어야, 비디오가 끊김 없이 재생된다. 그러나 네트워크의 end system 간의 지연은 가변적이므로, 비디오 청크마다 서버에서 전송된 시간과 클라이언트에서 수신된 시간 사이의 지연은 다르다. 예를 들어 첫 번째 블록은 t<sub>1</sub>에 도착하고, 두 번째 블록은 t<sub>2</sub>에 도착한다고 하자. 이때 각 청크 사이의 네트워크 지연은 figure 1에서의 수평 거리로 표현된다. 이렇게 네트워크에서 연속적인 패킷들이 일정한 간격으로 도착하지 않고, 도착 시간이 들쑥날쑥 해지는 현상을 jitter라고 한다. | ||
두 번째 청크는 <code>t<sub>1</sub> + Δ</code>까지 도착하지 않아 재생이 불가능하며, 이는 서비스의 품질을 저하시킨다. 하지만 만약 클라이언트가 재생을 t<sub>3</sub>까지 지연시키고, 그동안 청크 1~6이 모두 도착해 있다면, 이후에는 모든 청크가 재생 시간 전에 이미 도착해 있으므로, 정상적인 타이밍으로 재생이 가능하다. | |||
만약 클라이언트가 첫 번째 청크가 도착한 즉시, 즉 t<sub>1</sub>에 재생을 시작한다면, 두 번째 청크는 <code>t<sub>1</sub> + Δ</code>까지 도착하지 않아 재생이 불가능하며, 이는 서비스의 품질을 저하시킨다. 하지만 만약 클라이언트가 재생을 t<sub>3</sub>까지 지연시키고, 그동안 청크 1~6이 모두 도착해 있다면, 이후에는 모든 청크가 재생 시간 전에 이미 도착해 있으므로, 정상적인 타이밍으로 재생이 가능하다. | |||
==UDP Streaming== | ==UDP Streaming== | ||
UDP 스트리밍에서는 서버가 [[UDP]] 프로토콜을 통해 일정한 속도로 비디오 청크를 전송하여 클라이언트의 비디오 소비 속도에 맞추어 전송 속도를 조절한다. 예를 들어, 비디오 소비 속도가 2Mbps이고, 각 UDP 패킷이 8,000비트의 비디오 데이터를 담고 있다면, 서버는 자신의 소켓에 (8,000비트)/(2Mbps) = 4밀리초마다 UDP 패킷 하나를 전송한다. 이때 UPC는 혼잡 제어(congestion control) 메커니즘을 사용하지 않기 때문에, 서버는 TCP에서 요구되는 속도 제어 제약 없이 비디오 소비 속도 그대로 패킷을 네트워크에 밀어 넣는다. | UDP 스트리밍에서는 서버가 [[UDP]] 프로토콜을 통해 일정한 속도로 비디오 청크를 전송하여 클라이언트의 비디오 소비 속도에 맞추어 전송 속도를 조절한다. 예를 들어, 비디오 소비 속도가 2Mbps이고, 각 UDP 패킷이 8,000비트의 비디오 데이터를 담고 있다면, 서버는 자신의 소켓에 (8,000비트)/(2Mbps) = 4밀리초마다 UDP 패킷 하나를 전송한다. 이때 UPC는 혼잡 제어(congestion control) 메커니즘을 사용하지 않기 때문에, 서버는 TCP에서 요구되는 속도 제어 제약 없이 비디오 소비 속도 그대로 패킷을 네트워크에 밀어 넣는다. 이러한 UDP 스트리밍은 RTP(Real-time Transport Protocol)을 통해서 구현된다. 이때 UDP는 reliable transfer를 제공하지 않으므로, 이를 오류를 애플리케이션 수준에서 처리한다. | ||
또한 UDP 스트리밍은 서버 → 클라이언트 사이의 비디오 스트림 외에도, 클라이언트 ↔ 서버 간 별도의 제어 연결(control connection)을 유지한다는 것이다. 이 연결은 클라이언트가 세션 상태 변경 명령어(예: 일시 정지, 재개, 위치 이동 등)를 전송하는 데 사용된다. 이러한 제어 연결을 위해 RTSP(Real-Time Streaming Protocol) 프로토콜이 사용된다. | 또한 UDP 스트리밍은 서버 → 클라이언트 사이의 비디오 스트림 외에도, 클라이언트 ↔ 서버 간 별도의 제어 연결(control connection)을 유지한다는 것이다. 이 연결은 클라이언트가 세션 상태 변경 명령어(예: 일시 정지, 재개, 위치 이동 등)를 전송하는 데 사용된다. 이러한 제어 연결을 위해 RTSP(Real-Time Streaming Protocol) 프로토콜이 사용된다. | ||
| 24번째 줄: | 25번째 줄: | ||
==HTTP Streaming== | ==HTTP Streaming== | ||
HTTP 스트리밍에서는 비디오가 단순히 특정 URL을 가진 일반 파일 형태로 HTTP 서버에 저장된다. 사용자가 비디오를 보고 싶을 때, 클라이언트는 서버와 TCP 연결을 맺고, 해당 URL에 대해 HTTP GET 요청을 보낸다. 그러면 서버는 HTTP 응답 메시지 안에 비디오 파일을 담아 가능한 한 빠르게<ref>TCP의 혼잡 제어(congestion control) 및 흐름 제어(flow control)이 허용하는 한도 내에서</ref> 전송한다. 클라이언트 측에서는, 수신된 바이트들이 클라이언트 애플리케이션 버퍼에 저장된다. 이 버퍼에 저장된 바이트 수가 임계값을 넘으면, 클라이언트 애플리케이션은 재생을 시작한다. | HTTP 스트리밍에서는 비디오가 단순히 특정 URL을 가진 일반 파일 형태로 HTTP 서버에 저장된다. 사용자가 비디오를 보고 싶을 때, 클라이언트는 서버와 TCP 연결을 맺고, 해당 URL에 대해 HTTP GET 요청을 보낸다. 그러면 서버는 HTTP 응답 메시지 안에 비디오 파일을 담아 가능한 한 빠르게<ref>TCP의 혼잡 제어(congestion control) 및 흐름 제어(flow control)이 허용하는 한도 내에서</ref> 전송한다. 클라이언트 측에서는, 수신된 바이트들이 클라이언트 애플리케이션 버퍼에 저장된다. 이 버퍼에 저장된 바이트 수가 임계값을 넘으면, 클라이언트 애플리케이션은 재생을 시작한다.<ref>TCP는 그 특성상 전송이 매끄럽지 않기 때문에, 더 큰 초기 지연 시간을 요구한다.</ref> | ||
얼핏 보면 TCP를 통한 서버-클라이언터 간의 전송 속도는 혼잡 제어 메커니즘에 의해서 제한되기 때문에, TCP 상에서의 비디오 스트리밍이 제대로 작동할 수 없을 것처럼 보인다. 하지만 버퍼링과 프리패칭(prefatching) 기법은 혼잡 제어 메커니즘에도 불구하고 TCP에서의 HTTP 스트리밍을 가능케 한다. 또한 TCP 상에서의 HTTP 사용은 방화벽 및 NAT에 의해 제약을 받지 않고, RTSP 서버 같은 미디어 제어 서버가 필요 없다는 장점이 있다. | 얼핏 보면 TCP를 통한 서버-클라이언터 간의 전송 속도는 혼잡 제어 메커니즘에 의해서 제한되기 때문에, TCP 상에서의 비디오 스트리밍이 제대로 작동할 수 없을 것처럼 보인다. 하지만 버퍼링과 프리패칭(prefatching) 기법은 혼잡 제어 메커니즘에도 불구하고 TCP에서의 HTTP 스트리밍을 가능케 한다. 또한 TCP 상에서의 HTTP 사용은 방화벽 및 NAT에 의해 제약을 받지 않고, RTSP 서버 같은 미디어 제어 서버가 필요 없다는 장점이 있다. | ||
| 32번째 줄: | 33번째 줄: | ||
===Client Application Buffer and TCP Buffers=== | ===Client Application Buffer and TCP Buffers=== | ||
[[파일:Streaming stored video over HTTP-TCP.png|섬네일|400x400픽셀|Figure | [[파일:Streaming stored video over HTTP-TCP.png|섬네일|400x400픽셀|Figure 2. Streaming stored video over HTTP/TCP ]] | ||
Figure | Figure 2는 HTTP 스트리밍 시의 클라이언트와 서버 간의 상호 작용을 보여준다. 서버 측에서 흰색 부분은 이미 소켓에 전송된 비디오 데이터이며, 하늘색 부분은 아직 전송되지 않은 부분이다. 소켓을 통해 전송된 바이트는 TCP 송신 버퍼에 저장된 뒤에 인터넷으로 보내진다. Figure 3에서는 TCP 송신 버퍼가 가득 차있는 상태이므로, 서버는 일시적으로 소켓을 통해 바이트를 저장할 수 없다. 한편 클라이언트 측에서는, TCP 수신 버퍼에서 바이트를 읽어서 애플리케이션 버퍼로 이동시킨다. 동시에 클라이언트 애플리케이션은 주기적으로 애플리케이션 버퍼에서 비디오 프레임을 가져오고 압축 해제 후 사용자 화면에 출력한다. | ||
사용자가 비디오를 일시 정지하였을 때에는, 버퍼에서 바이트를 제거하지 않지만, 서버에서는 계속 데이터를 전송하므로 결국 클라이언트 애플리케이션 버퍼가 가득 찬다. 이 경우 역방향 압력(back pressure)이 발생하여, TCP 수신 버퍼도 데이터를 내보내지 못해 가득 차고, 서버의 TCP 송신 버퍼도 데이터를 전송할 수 없어 가득 찬다. 이에 따라 서버는 전송을 멈추고, 사용자가 재생을 재개할 때까지 블록(block)된다. 이러한 역방향 압력은 꼭 일시 정지 시에만 발생하는 것은 아니다. 즉, 일반적으로 재생할 때에도 애플리케이션 버퍼가 가득 차면, TCP 버퍼들도 가득 차게 되고, 서버는 전송 속도를 줄일 수밖에 없다. | 사용자가 비디오를 일시 정지하였을 때에는, 버퍼에서 바이트를 제거하지 않지만, 서버에서는 계속 데이터를 전송하므로 결국 클라이언트 애플리케이션 버퍼가 가득 찬다. 이 경우 역방향 압력(back pressure)이 발생하여, TCP 수신 버퍼도 데이터를 내보내지 못해 가득 차고, 서버의 TCP 송신 버퍼도 데이터를 전송할 수 없어 가득 찬다. 이에 따라 서버는 전송을 멈추고, 사용자가 재생을 재개할 때까지 블록(block)된다. 이러한 역방향 압력은 꼭 일시 정지 시에만 발생하는 것은 아니다. 즉, 일반적으로 재생할 때에도 애플리케이션 버퍼가 가득 차면, TCP 버퍼들도 가득 차게 되고, 서버는 전송 속도를 줄일 수밖에 없다. | ||
| 40번째 줄: | 41번째 줄: | ||
===Analysis of Video Streaming=== | ===Analysis of Video Streaming=== | ||
[[파일:Analysis of client-side buffering for video streaming.png|섬네일|400x400픽셀|Figure | [[파일:Analysis of client-side buffering for video streaming.png|섬네일|400x400픽셀|Figure 3. Analysis of client-side buffering for video streaming ]] | ||
Figure | Figure 3와 같은 상황을 통해서 비디오 스트리밍의 초기 지연과 버퍼 고갈로 인한 멈춤 현상을 이해해 보자. Figure 3에서는 다음과 같은 정의를 사용한다:<ref>TCP 송/수신 버퍼는 단순화를 위해 무시한다.</ref> | ||
* B: 클라이언트 애플리케이션 버퍼의 크기 (비트 단위) | * B: 클라이언트 애플리케이션 버퍼의 크기 (비트 단위) | ||
* Q: 재생을 시작하기 위해 필요한 최소 버퍼량 (<code>Q < B</code>) | * Q: 재생을 시작하기 위해 필요한 최소 버퍼량 (<code>Q < B</code>) | ||
| 47번째 줄: | 48번째 줄: | ||
이 상황에서, 서버가 클라이언트 버퍼가 가득 차있지 않은 이상, 고정된 전송률 x로 비트를 전송한다고 가정하자. 또한 이때 시점 t = 0일 때 버퍼는 비어있으며, 비디오가 도착하기 시작한다. 이때 재생이 시작되기 위해서는 Q개의 비트가 도착해야 하고, 비트가 도착하는 속도는 x이고, 버퍼에서 제거되는 비트는 없다. 따라서 재생이 시작되는 시점 t<sub>p은 아래와 같이 계산된다: | 이 상황에서, 서버가 클라이언트 버퍼가 가득 차있지 않은 이상, 고정된 전송률 x로 비트를 전송한다고 가정하자. 또한 이때 시점 t = 0일 때 버퍼는 비어있으며, 비디오가 도착하기 시작한다. 이때 재생이 시작되기 위해서는 Q개의 비트가 도착해야 하고, 비트가 도착하는 속도는 x이고, 버퍼에서 제거되는 비트는 없다. 따라서 재생이 시작되는 시점 t<sub>p은 아래와 같이 계산된다: | ||
t<sub>p</sub> = Q / x | t<sub>p</sub> = Q / x | ||
t<sub>p</sub> 이후, 만약 <code>x < r</code>이라면, 버퍼는 절대 가득 차지 않으며, 재생 시작 후, r 속도로 버퍼가 고갈되며, x 속도로 채워지므로 결국 버퍼는 고갈되고 비디오는 멈춘다.(freeze) 이에 따라 다시 Q 비트를 모으기까지 tₚ만큼 대기하며, 재생과 멈춤이 반복된다. 이때 주목할 만한 것은 Q의 크기, 즉 t<sub>p</sub>가 커짐에 따라 | t<sub>p</sub> 이후, 만약 <code>x < r</code>이라면, 버퍼는 절대 가득 차지 않으며, 재생 시작 후, r 속도로 버퍼가 고갈되며, x 속도로 채워지므로 결국 버퍼는 고갈되고 비디오는 멈춘다.(freeze) 이에 따라 다시 Q 비트를 모으기까지 tₚ만큼 대기하며, 재생과 멈춤이 반복된다. 이때 주목할 만한 것은 Q의 크기, 즉 t<sub>p</sub>가 커짐에 따라 버퍼의 고갈 가능성이 낮고, 이에 따라 더욱 끊김 없는 재생이 가능하다는 것이다. 하지만 이 경우, 사용자는 재생이 시작하기 까지 더 오래 기다려야 한다.<br> | ||
<br> | |||
반면 <code>x > r</code>이면 t<sub>p</sub> 이후 버퍼 내에 저장된 비트의 수는 <code>x - r</code> 속도로 증가한다. 이에 따라 버퍼 내에 저장된 비트의 수가 Q에서 B까지 도달하는데 걸리는 시간인 t<sub>f</sub>는 아래와 같이 계산된다: | 반면 <code>x > r</code>이면 t<sub>p</sub> 이후 버퍼 내에 저장된 비트의 수는 <code>x - r</code> 속도로 증가한다. 이에 따라 버퍼 내에 저장된 비트의 수가 Q에서 B까지 도달하는데 걸리는 시간인 t<sub>f</sub>는 아래와 같이 계산된다: | ||
t<sub>f</sub> = (B - Q) / (x - r) | t<sub>f</sub> = (B - Q) / (x - r) | ||
이 경우, 초기 지연 이후 비디오가 멈추는 일 없이 비디오가 끝날 때까지 연속 재생된다. | 이 경우, 초기 지연 이후 비디오가 멈추는 일 없이 비디오가 끝날 때까지 연속 재생된다. | ||
==각주== | ==각주== | ||
[[분류:컴퓨터 네트워크]] | [[분류:컴퓨터 네트워크]] | ||
2025년 6월 15일 (일) 14:25 기준 최신판
상위 문서: Multimedia Networking
개요
스트리밍 비디오 애플리케이션의 경우, 사전 녹화된 비디오들은 서버에 저장되어 있고, 사용자들은 이러한 비디오를 요청하여 원하는 때에 재생할 수 있도록 서버에 요청을 보낸다. 사용자는 비디오를 처음부터 끝까지 중단 없이 볼 수도 있고, 끝나기 훨씬 전에 시청을 중단할 수도 있으며, 또는 일시정지하거나 앞으로/뒤로 이동하면서 비디오와 상호작용할 수도 있다. 이때 스트리밍 비디오 시스템은 다음의 세 가지 범주로 분류될 수 있다:
- UDP 스트리밍
- HTTP 스트리밍
- 적응형(Adaptive) HTTP 스트리밍
이 세 가지 방식 모두 실제로 사용되지만, 오늘날 대부분의 시스템은 HTTP 스트리밍 및 적응형 HTTP 스트리밍을 사용한다. 이 세 가지 방식의 스트리밍 비디오는 모두 공통적으로 클라이언트 측 애플리케이션 버퍼링을 광범위하게 사용하여, 서버-클라이언트 간의 지연 변화 및 사용 가능한 대역폭 변화의 영향을 완화한다는 특성을 가진다. 이는 각 클라이언트는 비디오를 요청한 후 실제 재생이 시작되기까지의 몇 초 정도의 초기 지연은 허용하므로, 클라이언트는 비디오가 도착하자마자 바로 재생을 시작할 필요가 없으며 대신에 버퍼에 일정량의 비디오를 저장(버퍼링)한 뒤 재생을 시작하는 방식으로 구현된다. 이러한 방식은 몇가지 이점을 가진다:
- 서버에서 클라이언트로의 지연이 일시적으로 늘어나 특정 비디오 청크의 도착이 지연되더라도, 해당 청크가 아직 재생되지 않은 버퍼된 청크가 소진되기 전에 도착하기만 하면, 이러한 지연은 사용자에게 전혀 인지되지 않는다.
- 서버에서 클라이언트로의 대역폭이 일시적으로 비디오 소비 속도보다 낮아지더라도, 클라이언트의 버퍼가 완전히 고갈되지만 않는다면 사용자는 끊김 없이 비디오를 시청할 수 있다.

Figure 1은 클라이언트 측의 버퍼링을 시각적으로 보여준다. 예를 들어 비디오가 CBR로 인코딩되었다고 가정하자. 따라서 각 비디오 청크는 일정시간 Δ 동안 재생될 프레임들을 포함한다. 이 경우 서버는 첫 번째 청크를 시간 t0에 전송하고, 두 번째 블록을 t0 + Δ, t0 + 2Δ에 전송하며, 그 이후도 마찬가지로 일정 간격으로 전송한다. 한편 클라이언트 입장에서는 재생을 시작한 이후, 각 청크가 이전 청크 이후의 Δ 시간 간격으로 재생되어야, 비디오가 끊김 없이 재생된다. 그러나 네트워크의 end system 간의 지연은 가변적이므로, 비디오 청크마다 서버에서 전송된 시간과 클라이언트에서 수신된 시간 사이의 지연은 다르다. 예를 들어 첫 번째 블록은 t1에 도착하고, 두 번째 블록은 t2에 도착한다고 하자. 이때 각 청크 사이의 네트워크 지연은 figure 1에서의 수평 거리로 표현된다. 이렇게 네트워크에서 연속적인 패킷들이 일정한 간격으로 도착하지 않고, 도착 시간이 들쑥날쑥 해지는 현상을 jitter라고 한다.
만약 클라이언트가 첫 번째 청크가 도착한 즉시, 즉 t1에 재생을 시작한다면, 두 번째 청크는 t1 + Δ까지 도착하지 않아 재생이 불가능하며, 이는 서비스의 품질을 저하시킨다. 하지만 만약 클라이언트가 재생을 t3까지 지연시키고, 그동안 청크 1~6이 모두 도착해 있다면, 이후에는 모든 청크가 재생 시간 전에 이미 도착해 있으므로, 정상적인 타이밍으로 재생이 가능하다.
UDP Streaming
UDP 스트리밍에서는 서버가 UDP 프로토콜을 통해 일정한 속도로 비디오 청크를 전송하여 클라이언트의 비디오 소비 속도에 맞추어 전송 속도를 조절한다. 예를 들어, 비디오 소비 속도가 2Mbps이고, 각 UDP 패킷이 8,000비트의 비디오 데이터를 담고 있다면, 서버는 자신의 소켓에 (8,000비트)/(2Mbps) = 4밀리초마다 UDP 패킷 하나를 전송한다. 이때 UPC는 혼잡 제어(congestion control) 메커니즘을 사용하지 않기 때문에, 서버는 TCP에서 요구되는 속도 제어 제약 없이 비디오 소비 속도 그대로 패킷을 네트워크에 밀어 넣는다. 이러한 UDP 스트리밍은 RTP(Real-time Transport Protocol)을 통해서 구현된다. 이때 UDP는 reliable transfer를 제공하지 않으므로, 이를 오류를 애플리케이션 수준에서 처리한다.
또한 UDP 스트리밍은 서버 → 클라이언트 사이의 비디오 스트림 외에도, 클라이언트 ↔ 서버 간 별도의 제어 연결(control connection)을 유지한다는 것이다. 이 연결은 클라이언트가 세션 상태 변경 명령어(예: 일시 정지, 재개, 위치 이동 등)를 전송하는 데 사용된다. 이러한 제어 연결을 위해 RTSP(Real-Time Streaming Protocol) 프로토콜이 사용된다.
하지만 UDP는 아래와 같은 단점을 지닌다:
- 연속 재생이 보장되지 않음: 서버와 클라이언트 사이의 사용 가능 대역폭이 예측 불가능하게 변동하기 때문에, 고정 속도 UDP 스트리밍은 연속적인 재생을 보장하지 못할 수 있다.
- 미디어 제어 서버 필요: 클라이언트 → 서버로의 상호작용 요청이나, 클라이언트의 현재 상태를 추적하기 위해 RTSP 서버 같은 미디어 제어 서버가 필요하다.
- UDP 차단 문제: 많은 방화벽이 UDP 트래픽을 차단하도록 설정되어 있어, 이러한 방화벽 뒤에 있는 사용자는 UDP 비디오를 수신할 수 없다.
HTTP Streaming
HTTP 스트리밍에서는 비디오가 단순히 특정 URL을 가진 일반 파일 형태로 HTTP 서버에 저장된다. 사용자가 비디오를 보고 싶을 때, 클라이언트는 서버와 TCP 연결을 맺고, 해당 URL에 대해 HTTP GET 요청을 보낸다. 그러면 서버는 HTTP 응답 메시지 안에 비디오 파일을 담아 가능한 한 빠르게[1] 전송한다. 클라이언트 측에서는, 수신된 바이트들이 클라이언트 애플리케이션 버퍼에 저장된다. 이 버퍼에 저장된 바이트 수가 임계값을 넘으면, 클라이언트 애플리케이션은 재생을 시작한다.[2]
얼핏 보면 TCP를 통한 서버-클라이언터 간의 전송 속도는 혼잡 제어 메커니즘에 의해서 제한되기 때문에, TCP 상에서의 비디오 스트리밍이 제대로 작동할 수 없을 것처럼 보인다. 하지만 버퍼링과 프리패칭(prefatching) 기법은 혼잡 제어 메커니즘에도 불구하고 TCP에서의 HTTP 스트리밍을 가능케 한다. 또한 TCP 상에서의 HTTP 사용은 방화벽 및 NAT에 의해 제약을 받지 않고, RTSP 서버 같은 미디어 제어 서버가 필요 없다는 장점이 있다.
Prefetching Video
비디오 프리패칭(Prefetching Video)이란, 앞으로 재생할 데이터를 일시적으로 버퍼에 저장하는 것이다. 이는 end system 사이의 지연 시간 변화와, 가용 대역폭 변화의 영향을 완화한다. Figure 2에서는 서버가 비디오를 재생 속도에 맞추어 전송한다고 가정했지만, 저장형 비디오 스트리밍의 경우 클라이언트는 보다 높은 속도로 다운로드를 시도하여 미래에 재생될 프레임을 미리 받아둘 수 있으며, 이렇게 미리 로드된 프레임들은 클라이언트 측의 버퍼에 저장된다. TCP 스트리밍에서는 이러한 프리패칭이 자연스럽게 발생하는데, 이는 TCP의 혼잡 회피 메커니즘이 사용 가능한 대역폭을 최대한 활용하고자 하기 때문이다. 예를 들어 클라이언트의 비디오 소비 속도가 1 Mbps이고, 서버→클라이언트 전송 가능 속도가 1.5 Mbps일 때, 아주 짧은 초기 지연 후 재생이 가능하며, 초당 500 Kbit 씩 버퍼에 축적된다. 이렇게 버퍼에 데이터를 축적함으로써, 향후의 네트워크 속도가 1 Mbps 아래로 일시적으로 떨어지더라도, 클라이언트는 버퍼 덕분에 끊김 없는 재생을 유지할 수 있다.
Client Application Buffer and TCP Buffers

Figure 2는 HTTP 스트리밍 시의 클라이언트와 서버 간의 상호 작용을 보여준다. 서버 측에서 흰색 부분은 이미 소켓에 전송된 비디오 데이터이며, 하늘색 부분은 아직 전송되지 않은 부분이다. 소켓을 통해 전송된 바이트는 TCP 송신 버퍼에 저장된 뒤에 인터넷으로 보내진다. Figure 3에서는 TCP 송신 버퍼가 가득 차있는 상태이므로, 서버는 일시적으로 소켓을 통해 바이트를 저장할 수 없다. 한편 클라이언트 측에서는, TCP 수신 버퍼에서 바이트를 읽어서 애플리케이션 버퍼로 이동시킨다. 동시에 클라이언트 애플리케이션은 주기적으로 애플리케이션 버퍼에서 비디오 프레임을 가져오고 압축 해제 후 사용자 화면에 출력한다.
사용자가 비디오를 일시 정지하였을 때에는, 버퍼에서 바이트를 제거하지 않지만, 서버에서는 계속 데이터를 전송하므로 결국 클라이언트 애플리케이션 버퍼가 가득 찬다. 이 경우 역방향 압력(back pressure)이 발생하여, TCP 수신 버퍼도 데이터를 내보내지 못해 가득 차고, 서버의 TCP 송신 버퍼도 데이터를 전송할 수 없어 가득 찬다. 이에 따라 서버는 전송을 멈추고, 사용자가 재생을 재개할 때까지 블록(block)된다. 이러한 역방향 압력은 꼭 일시 정지 시에만 발생하는 것은 아니다. 즉, 일반적으로 재생할 때에도 애플리케이션 버퍼가 가득 차면, TCP 버퍼들도 가득 차게 되고, 서버는 전송 속도를 줄일 수밖에 없다.
결과적으로, 클라이언트가 버퍼에서 f 비트를 제거하면, 서버는 f 비트를 새로 전송할 수 있게 된다. 따라서, 서버 전송 속도는 클라이언트의 소비 속도보다 클 수 없다. 즉, 클라이언트 애플리케이션 버퍼가 가득 차면, HTTP 스트리밍에서 서버의 전송 속도에 상한이 생긴다.
Analysis of Video Streaming

Figure 3와 같은 상황을 통해서 비디오 스트리밍의 초기 지연과 버퍼 고갈로 인한 멈춤 현상을 이해해 보자. Figure 3에서는 다음과 같은 정의를 사용한다:[3]
- B: 클라이언트 애플리케이션 버퍼의 크기 (비트 단위)
- Q: 재생을 시작하기 위해 필요한 최소 버퍼량 (
Q < B) - r: 비디오 소비 속도 (예: 초당 30프레임 × 프레임당 100,000비트 → r = 3 Mbps)
이 상황에서, 서버가 클라이언트 버퍼가 가득 차있지 않은 이상, 고정된 전송률 x로 비트를 전송한다고 가정하자. 또한 이때 시점 t = 0일 때 버퍼는 비어있으며, 비디오가 도착하기 시작한다. 이때 재생이 시작되기 위해서는 Q개의 비트가 도착해야 하고, 비트가 도착하는 속도는 x이고, 버퍼에서 제거되는 비트는 없다. 따라서 재생이 시작되는 시점 tp은 아래와 같이 계산된다:
tp = Q / x
tp 이후, 만약 x < r이라면, 버퍼는 절대 가득 차지 않으며, 재생 시작 후, r 속도로 버퍼가 고갈되며, x 속도로 채워지므로 결국 버퍼는 고갈되고 비디오는 멈춘다.(freeze) 이에 따라 다시 Q 비트를 모으기까지 tₚ만큼 대기하며, 재생과 멈춤이 반복된다. 이때 주목할 만한 것은 Q의 크기, 즉 tp가 커짐에 따라 버퍼의 고갈 가능성이 낮고, 이에 따라 더욱 끊김 없는 재생이 가능하다는 것이다. 하지만 이 경우, 사용자는 재생이 시작하기 까지 더 오래 기다려야 한다.
반면 x > r이면 tp 이후 버퍼 내에 저장된 비트의 수는 x - r 속도로 증가한다. 이에 따라 버퍼 내에 저장된 비트의 수가 Q에서 B까지 도달하는데 걸리는 시간인 tf는 아래와 같이 계산된다:
tf = (B - Q) / (x - r)
이 경우, 초기 지연 이후 비디오가 멈추는 일 없이 비디오가 끝날 때까지 연속 재생된다.