Что означает 206 Partial Content?

mr. Cooper 35 минут назад Технологии
Что означает 206 Partial Content?

206 Partial Content часто появляется в DevTools рядом с видео или большим файлом. Статус выглядит странно только до тех пор, пока не посмотреть на сам запрос.

Например:

//http

GET /video.mp4 HTTP/1.1
Range: bytes=1000000-1999999

Здесь браузер просит не весь файл. Ему нужны байты с 1000000 по 1999999.

Если сервер поддерживает такой запрос, ответ будет примерно таким:

//http

HTTP/1.1 206 Partial Content
Content-Range: bytes 1000000-1999999/500000000

Файл занимает 500 МБ, но сейчас передан только один его участок. Поэтому 206 не означает, что файл загрузился с ошибкой или сервер потерял часть данных.

Он означает ровно то, что написано в названии: в этом ответе находится часть ресурса.

Зачем вообще загружать файл частями

С маленькими файлами это почти незаметно. С видео на сотни мегабайт - уже совсем другая история.

Когда браузеру требуется определённый участок файла, он может запросить нужный диапазон. Это удобно при воспроизведении видео и перемотке. Необязательно получать весь файл с самого начала только ради того, чтобы добраться до нужного места.

По той же причине диапазонные запросы полезны при возобновлении загрузки. Если клиент уже получил часть большого файла, оставшиеся данные можно запросить отдельно.

В Network поэтому вполне реально увидеть несколько запросов к одному URL:

//text

206  video.mp4
206  video.mp4
206  video.mp4

У каждого запроса может быть свой Range.

Сам статус здесь мало что объясняет. Гораздо интереснее открыть Headers.

На что смотреть в DevTools

В запросе будет что-то вроде:

//http

Range: bytes=0-1048575

А сервер укажет фактически переданный диапазон:

//http

Content-Range: bytes 0-1048575/52428800

Из второй строки видно, что полный размер ресурса - 52428800 байт, а конкретно сейчас отправлены байты от 0 до 1048575.

Есть маленькая деталь: обе границы включаются. Поэтому диапазон 0-1048575 содержит 1048576 байт.

Для диагностики этого обычно достаточно. Если рядом с 206 есть Range и Content-Range, становится понятно, откуда взялся частичный ответ.

Иногда в заголовках встречается и:

//http

Accept-Ranges: bytes

Этот заголовок используется для сообщения о поддержке диапазонных запросов. Но наличие или отсутствие Accept-Ranges само по себе ещё не описывает поведение конкретного запроса.

Почему иногда приходит 200

206 не заменяет обычный 200 OK.

Если клиент просто запросил ресурс:

//http

GET /video.mp4 HTTP/1.1

сервер может вернуть весь ресурс с:

//http

HTTP/1.1 200 OK

Если же клиент указал диапазон:

//http

Range: bytes=5000000-5999999

сервер при успешной обработке этого диапазона возвращает 206 Partial Content.

Есть и другой вариант - диапазон невозможно выполнить. Тогда используется:

//http

416 Range Not Satisfiable

Например, клиент запросил байты, которых за пределами ресурса уже нет.

Сам факт появления 206 поэтому ничего плохого не означает. Нужно смотреть на контекст запроса.

Диапазон может быть не один

HTTP позволяет запросить несколько участков ресурса:

//http

Range: bytes=0-999,5000-5999

В таком случае сервер может вернуть несколько диапазонов в одном ответе 206. Для этого используется формат multipart/byteranges.

Но в обычной работе с видео чаще всего встречается более простой вариант - один диапазон на запрос. Браузер получает нужный участок, затем при необходимости обращается за следующим.

Именно поэтому один большой файл в DevTools может выглядеть как последовательность небольших ответов.

Что означает 206 на практике

Если рядом с video.mp4 появился:

//http

206 Partial Content

это ещё не причина искать ошибку.

Посмотрите на Range в запросе и Content-Range в ответе. Если там указаны корректные диапазоны, сервер просто отдаёт часть ресурса, которую запросил клиент.

Для HTTP это обычный успешный ответ.

И, пожалуй, именно слово Partial здесь чаще всего сбивает с толку. Оно не означает «сервер не смог отправить файл целиком». Оно описывает конкретный ответ: в нём передан только определённый диапазон ресурса.

Поэтому несколько 206 для одного большого файла - вполне нормальная картина. В DevTools вы видите не несколько поломанных загрузок, а работу диапазонных запросов.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи

Почему HTTPS - это 443?
mr. Cooper 1 день назад Технологии
Почему HTTPS - это 443?

Разбираемся в истории номера, связи с HTTP, TLS и причинах, по которым 443 стал стандартом веб...

favorite 0 chat_bubble 0
visibility 17