示例http范围请求会话

cha*_*mal 87 session sample http range

是否可以向我展示带范围请求的示例http会话.我的意思是请求和响应标头是什么?

joh*_*tok 133

以下交换是在Chrome和静态Web服务器之间进行的,用于检索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
Run Code Online (Sandbox Code Playgroud)

检测到先前响应中的范围标头 - 具有开放范围的后续请求以确认支持.响应返回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
Run Code Online (Sandbox Code Playgroud)

后续范围请求捕获文件的结尾(可能捕获尾随元数据):

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
Run Code Online (Sandbox Code Playgroud)

用户在下载范围之外的视频进度条中单击 - 发出范围请求以从所选位置开始播放:

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
Run Code Online (Sandbox Code Playgroud)

  • 空白的Transfer-Encoding标头是捕获HTTP通信方式的假象,还是有真正的HTTP服务器为此标头生成空白值? (7认同)
  • 在第一种情况下,看起来服务器返回64657027字节的内容.那么正在发生的事情 - 客户端是不是丢弃了这些内容,然后随后发出了对部件真正需要的范围请求?或者服务器没有返回任何内容,因为客户端消息中的某些内容表示不这样做.如果是这样,它是什么? (7认同)
  • 但是,第一个响应中的内容长度64657027是否意味着在头部之后实际存在许多字节的有效负载,客户端必须消耗这些字节,因为连接是保持活动的?我想知道在响应消息中说什么实际上没有任何有效载荷. (4认同)
  • @Morrie - 看起来服务器知道它本身支持范围请求,通过`Accept-Ranges:bytes`标头告诉客户端"我接受范围请求",但它也向下发送资源的内容长度,以便客户端可以使用上限创建范围请求.在我知道的情况下,客户端消息中没有任何内容表示这样做 - 服务器可以选择响应"这是整个资源"或"我接受范围请求" - 这也是"Accept-Ranges"标题的存在.无论如何,这是我对它的理解. (2认同)