Пример сеанса запроса диапазона http

91

Можно ли показать мне образец http-сеанса с запросами диапазона. Я имею в виду, каковы будут заголовки запроса и ответа?

Chamal
источник
2
Несколько месяцев назад была опубликована новая версия стандарта HTTP / 1.1. В нем есть специальный RFC для запросов диапазона, он намного более читабелен, чем старая спецификация, включая примеры для многих элементов: tools.ietf.org/html/rfc7233
Thirler

Ответы:

136

Следующий обмен происходит между Chrome и статическим веб-сервером, получая видео в формате MP4.

Первоначальный запрос - на видео. Обратите внимание на Accept-Rangesзаголовок ответа, чтобы указать, что сервер поддерживает заголовок диапазона:

GET /BigBuckBunny_320x180.mp4
        Cache-Control: max-age=0
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range:
        Accept: text/html,application/xhtml+xml,application/xml,*/*
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Accept-Encoding: gzip,deflate,sdch
        Accept-Charset: ISO-8859-1,utf-8,*
200 OK
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 64657027
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:24 GMT

Обнаружен заголовок диапазона в предыдущем ответе - последующий запрос с открытым диапазоном для подтверждения поддержки. Ответ возвращает статус 206 и Content-Rangeзаголовок, чтобы указать байты, присутствующие в теле ответа:

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=0-
        Accept: */*
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 64657027
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 0-64657026/64657027

Последующий запрос диапазона для захвата конца файла (возможно, для захвата конечных метаданных):

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=64312833-64657026
        Accept: */*
        If-Range: A023EF02BD589BC472A2D6774EAE3C58
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 344194
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 64312833-64657026/64657027

Пользователь нажимает на полосу воспроизведения видео за пределами загруженного диапазона - выдается запрос диапазона, чтобы начать воспроизведение с выбранной позиции:

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=1073152-64313343
        Accept: */*
        If-Range: A023EF02BD589BC472A2D6774EAE3C58
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 63240192
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 1073152-64313343/64657027
Джонсток
источник
7
Является ли пустой заголовок 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.
Zoomulator