Несколько месяцев назад была опубликована новая версия стандарта HTTP / 1.1. В нем есть специальный RFC для запросов диапазона, он намного более читабелен, чем старая спецификация, включая примеры для многих элементов: tools.ietf.org/html/rfc7233
Thirler
Ответы:
136
Следующий обмен происходит между Chrome и статическим веб-сервером, получая видео в формате MP4.
Первоначальный запрос - на видео. Обратите внимание на Accept-Rangesзаголовок ответа, чтобы указать, что сервер поддерживает заголовок диапазона:
Обнаружен заголовок диапазона в предыдущем ответе - последующий запрос с открытым диапазоном для подтверждения поддержки. Ответ возвращает статус 206 и Content-Rangeзаголовок, чтобы указать байты, присутствующие в теле ответа:
Пользователь нажимает на полосу воспроизведения видео за пределами загруженного диапазона - выдается запрос диапазона, чтобы начать воспроизведение с выбранной позиции:
Является ли пустой заголовок Transfer-Encoding артефактом способа захвата HTTP-соединения или существует настоящий HTTP-сервер, генерирующий пустые значения для этого заголовка?
swl10
7
В первом случае похоже, что сервер возвращает 64657027 байт контента. Итак, что происходит - клиент просто выбрасывает этот контент, а затем выдает запрос диапазона для частей, которые действительно нужны? Или сервер не возвращает какой-либо контент, потому что что-то в сообщении клиента говорит, что не делайте этого. Если так, то, что это?
Морри
3
@Morrie - похоже, что сервер, зная, что сам поддерживает запросы диапазона, сообщает клиенту: «Я принимаю запросы диапазона» через Accept-Ranges: bytesзаголовок, но он также отправляет длину содержимого для ресурса, чтобы клиент мог делать запросы диапазона с верхним связаны. Насколько мне известно, в сообщении клиента ничего не говорится: «Делайте это» - сервер может выбрать ответ «вот весь ресурс» или «Я принимаю запросы диапазона» - что снова является наличием Accept-Rangesзаголовка. Во всяком случае, так я это понимаю.
Саймон Уайтхед,
4
Но разве Content-Length 64657027 в первом ответе не означает, что на самом деле существует столько байтов полезной нагрузки, следующих за заголовком, которые клиент должен использовать, потому что соединение является Keep-Alive? Мне интересно, что в этом ответном сообщении говорит о том, что на самом деле нет никакой полезной нагрузки.
Morrie
1
@Morrie Keep-alive - это запрос от клиента, и клиент не обязан продолжать использовать соединение. В своей работе я только что пришел к выводу, что, по крайней мере, для chrome, первый запрос GET с диапазоном "0-" немедленно прерывается, как только получен заголовок, вместо использования запроса HEAD. Я считаю, что это способ избежать проблем с любым сервером, который может неправильно реализовать команду HEAD.
Ответы:
Следующий обмен происходит между Chrome и статическим веб-сервером, получая видео в формате MP4.
Первоначальный запрос - на видео. Обратите внимание на
Accept-Ranges
заголовок ответа, чтобы указать, что сервер поддерживает заголовок диапазона:Обнаружен заголовок диапазона в предыдущем ответе - последующий запрос с открытым диапазоном для подтверждения поддержки. Ответ возвращает статус 206 и
Content-Range
заголовок, чтобы указать байты, присутствующие в теле ответа:Последующий запрос диапазона для захвата конца файла (возможно, для захвата конечных метаданных):
Пользователь нажимает на полосу воспроизведения видео за пределами загруженного диапазона - выдается запрос диапазона, чтобы начать воспроизведение с выбранной позиции:
источник
Accept-Ranges: bytes
заголовок, но он также отправляет длину содержимого для ресурса, чтобы клиент мог делать запросы диапазона с верхним связаны. Насколько мне известно, в сообщении клиента ничего не говорится: «Делайте это» - сервер может выбрать ответ «вот весь ресурс» или «Я принимаю запросы диапазона» - что снова является наличиемAccept-Ranges
заголовка. Во всяком случае, так я это понимаю.