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|Source-backed guidance under our editorial policy
Start Here
Use the closest compare guide, playbook, or adjacent error page to narrow the decision faster before you start changing production systems.
This page is part of the Error Reference library. Learn more about the project or report a correction.
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...
}
};Seen in Production
Adaptive Bitrate Streaming (HLS/DASH)
Frequency: high
Example: A user with low bandwidth skips to the end of a video. The player requests only the specific 206 chunks for that low-res segment.
Fix: Use 206 to prevent the device from downloading high-res data the user won't actually see.
Software Update Resumption
Frequency: common
Example: A 5GB game update pauses at 40%. When the user hits resume, the client uses 206 to fetch only the remaining 3GB.
Fix: Saves the user 2GB of data and reduces server load.
Debugging Tools
- -Browser DevTools (Network Tab): Look for the "Partial Content" label in the status column.
- -wgetPath: Use
wget --continueto see 206 in action during a resumed download. - -Wireshark: To verify the actual TCP segments and Range handshake at the packet level.
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.
Official References
Provider Context
This guidance is specific to HTTP services. Always validate implementation details against official provider documentation before deploying to production.