206 - Partial Content
HTTP 206 Partial Content is a success response indicating that the server is sending only a specific portion of a resource, as requested by the client via a Range header. It is the architectural backbone of video streaming, resumable large-file downloads, and multi-part byte-serving.
Last reviewed: March 10, 2026|Editorial standard: source-backed technical guidance
What Does Partial Content Mean?
A 206 response confirms that the server has successfully processed a "Range Request." Instead of delivering the entire payload, the server provides specific segments (byte ranges). This allows media players to "seek" to any timestamp instantly and enables download managers to resume interrupted transfers without re-downloading existing data. It relies on the "Accept-Ranges" and "Content-Range" headers to coordinate the data reassembly.
Common Causes
- -Large Media Streaming: Modern browsers request video/audio in chunks to allow playback to start before the full file is fetched.
- -Resume Operations: A client resumes an interrupted 2GB download by requesting only the remaining bytes (e.g.,
Range: bytes=500000-). - -Multi-threaded Downloading: Tools like IDM opening multiple parallel connections, each requesting a different byte-range to maximize throughput.
- -Cloudfront/CDN Slicing: Intermediate proxies fetching and caching files in "slices" to improve delivery performance for massive assets.
How to Fix Partial Content
- 1Verify Accept-Ranges: The server must return
Accept-Ranges: bytesin the initial 200 OK or HEAD response to signal support. - 2Check Content-Range Format: Ensure the response header follows the strict
bytes <start>-<end>/<total>format (e.g.,bytes 0-1023/5000). - 3Enable Range Support in Nginx/Apache: Verify that your web server isn't configured to ignore the Range header or force a 200 OK full-body response.
- 4Align ETags: Ensure your server cluster generates identical ETags for the same file, as any mismatch will fail a conditional
If-Rangerequest.
Step-by-Step Diagnosis for Partial Content
- 1Test raw range delivery: Run
curl -i -H "Range: bytes=0-100" [URL]and confirm the server returns exactly 101 bytes with a 206 status. - 2Inspect the "Content-Length" header: In a 206 response, it must reflect the size of the chunk, not the total file size.
- 3Check for "416 Range Not Satisfiable" errors: This usually means the requested range start is higher than the actual file size (e.g., requesting byte 1001 of a 1000-byte file).
- 4Verify "If-Range" presence: If the client provides an ETag, confirm the server only sends 206 if the ETag matches current resource state.
Range Request Handshake Logic
- -Step 1: Client asks for
Range: bytes=100-200. - -Step 2: Server validates the offset and checks
If-Range(if present). - -Step 3: Server returns
206 Partial ContentwithContent-Range: bytes 100-200/5000.
Decision Matrix: 206 vs. 200 vs. 416
- -206 Partial: Success; server fulfilled the specific byte-range requested.
- -200 OK: Server ignored the range and sent the whole file (usually due to misconfiguration).
- -416 Not Satisfiable: Failure; the requested byte range is out of bounds or invalid.
Implementation Examples
curl -v -H "Range: bytes=0-1023" https://errorreference.com/assets/video.mp4
# Look for:
# < HTTP/1.1 206 Partial Content
# < Content-Range: bytes 0-1023/10485760
# < Accept-Ranges: bytesconst getChunk = async (url, start, end) => {
const response = await fetch(url, {
headers: { 'Range': `bytes=${start}-${end}` }
});
if (response.status === 206) {
const reader = response.body.getReader();
// Reassemble the byte stream...
}
};How to Verify the Fix
- -Establish a partial download: Request
Range: bytes=100-and verify the server starts exactly at byte 100. - -Observe video seeker behavior: Move the playhead in the browser and confirm new 206 requests appear in the Network tab.
- -Check data integrity: Concatenate two 206 chunks and verify the hash (MD5/SHA) matches the same segment of the original file.
How to Prevent Recurrence
- -Avoid Inode-based ETags: In Nginx, use
etag on;and avoid using inodes, as different server nodes will produce different ETags for the identical file. - -Smoke Test Range Logic: Include a test case that requests
Range: bytes=0-0to ensure your backend supports the minimum possible range request. - -Buffer Management: Ensure your proxy (e.g., Nginx) doesn't buffer the entire file before serving a 206 chunk to a streaming client.
- -Pro-tip: Always include the total file size in the
Content-Rangeheader (after the slash) so the client can calculate the total download progress correctly.
Decision Support
Compare Guide
429 Too Many Requests vs 503 Service Unavailable
Use 429 for caller-specific throttling and 503 for service-wide outages, so retry behavior, escalation paths, and incident ownership stay correct.
Compare Guide
500 Internal Server Error vs 502 Bad Gateway: Root Cause
Debug 500 vs 502 faster: use 500 for origin failures and 502 for invalid upstream responses at gateways, then route incidents to the right team.
Playbook
API Timeout Playbook (502 / 504 / DEADLINE_EXCEEDED)
Use this playbook to separate invalid upstream responses from upstream wait expiration and deadline exhaustion, and apply timeout budgets, safe retries, and circuit-breaker controls safely.
Playbook
Availability and Dependency Playbook (500 / 503 / ServiceUnavailable)
Use this playbook to separate origin-side 500 failures from temporary 503 dependency or capacity outages, then apply safe retry and escalation paths.
Official References
Provider Context
This guidance is specific to HTTP services. Always validate implementation details against official provider documentation before deploying to production.