HTTP Range 头请求整个文件。

7

我正在使用来自CodePlex版本1.1的c# webserver进行编程工作。我已经实现了Accept-Range头,它可以正常工作。然而,当我使用Wireshark(版本1.4.1(来自/trunk-1.4的SVN Rev 34476))捕获流量时,我看到以下内容:

GET /movies/i_am_legend%20dvd/main.m4v HTTP/1.1
Host: 10.100.1.199:8081
Accept: */*
Range: bytes=0-1
Accept-Encoding: identity
Connection: keep-alive
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl)
X-Playback-Session-Id: 9CED81CC-BFAE-4CF6-A477-0EA62B2C652F

HTTP/1.1 206 PartialContent
Content-Range: bytes 0-1/652965648
Accept-Ranges: bytes
ETag: "0daA8D4/wgt4MFvxdNIPLw=="
Date: Wed, 13 Jun 2012 09:10:18 GMT
Content-Length: 2
Content-Type: video/x-m4v
Server: Tiny WebServer
Connection: keep-alive

..  << 2 bytes data

GET /movies/i_am_legend%20dvd/main.m4v HTTP/1.1
Host: 10.100.1.199:8081
Accept: */*
Range: bytes=0-652965647
Accept-Encoding: identity
Connection: keep-alive
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl)
X-Playback-Session-Id: 9CED81CC-BFAE-4CF6-A477-0EA62B2C652F

HTTP/1.1 206 PartialContent
Content-Range: bytes 0-652965647/652965648
Accept-Ranges: bytes
ETag: "0daA8D4/wgt4MFvxdNIPLw=="
Date: Wed, 13 Jun 2012 09:10:18 GMT
Content-Length: 652965648
Content-Type: video/x-m4v
Server: Tiny WebServer
Connection: keep-alive

网络服务器将尝试发送整个文件(> 600MB),Wireshark显示整个对话为159774字节。如果我使用IIS做同样的事情,我会得到类似的标头。
GET /ipod/main.m4v HTTP/1.1
Host: 10.100.1.199
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl)
Accept: */*
Range: bytes=0-1
Accept-Encoding: identity
X-Playback-Session-Id: C5BBF91D-78AB-42BA-ACE0-D74AB9D845CE
Connection: keep-alive

HTTP/1.1 206 Partial Content
Content-Type: video/x-m4v
Last-Modified: Mon, 11 Jun 2012 10:33:41 GMT
Accept-Ranges: bytes
ETag: "7243cabbd47cd1:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 13 Jun 2012 09:21:03 GMT
Content-Length: 2
Content-Range: bytes 0-1/652965648

..  << 2 bytes of data

GET /ipod/main.m4v HTTP/1.1
Host: 10.100.1.199
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl)
Accept: */*
Range: bytes=0-652965647
Accept-Encoding: identity
X-Playback-Session-Id: C5BBF91D-78AB-42BA-ACE0-D74AB9D845CE
Connection: keep-alive

HTTP/1.1 206 Partial Content
Content-Type: video/x-m4v
Last-Modified: Mon, 11 Jun 2012 10:33:41 GMT
Accept-Ranges: bytes
ETag: "7243cabbd47cd1:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 13 Jun 2012 09:21:03 GMT
Content-Length: 652965648
Content-Range: bytes 0-652965647/652965648

Wireshark显示整个会话为175615字节。

我已经搜索了更多关于Accept-Range头的信息,到目前为止,我只能找到服务器必须发送请求的范围。但我不相信它是用于一次性请求大文件的。

我的Web服务器试图发送整个文件,因为被请求为这样,但我看到新的范围请求进来,带有更大的范围,如此(仅从请求头中复制的范围标头。(@time ...)是wireshark的时间)。

Range: bytes=2162688-652965647 (@ time == 1.646204)
Range: bytes=4980736-652965647 (@ time == 2.754322)
Range: bytes=6356992-652965647 (@ time == 2.922479)

阅读了this之后,每当我接到整个文件的范围请求时,我尝试发送更短的范围。但是这样根本不起作用。

我想知道:

  1. 在iOS中,整个文件的范围请求是否是某种错误(也看到了4.3.3),我期望会有Range: bytes=0-1,然后回放一些像Range: bytes=0-65535/652965648的内容。
  2. 我是否可以优雅地拒绝这个大请求,并告诉请求者我最多可以一次交付多少数据?(我没有在RFC中找到)
  3. IIS是否只是在一定数量的字节后中止此请求?

编辑:对于第3点:不是IIS而是浏览器似乎会简单地中止(并关闭)连接。之后再发出新的请求。我无法想象范围请求是要求整个文件或巨大部分的文件。

编辑: 在iOS7中,似乎发生了变化。第一个范围请求仍然相同(字节0-1)。之后,我看到2或3个范围请求如上所述,其中最后一个请求会持续传输更长时间的字节。然而,仍然进行多个请求。


2
我正在观察类似的行为,并且在我看来,这似乎是iPad/iPhone的问题。 - mindas
@mindas,确实你也面临着同样的问题。由于我使用的Web服务器结构,我没有太多选择,需要重新抛出异常来停止处理范围请求。幸运的是,我一次只有一个客户端连接(但也可以处理2或3个)。希望你能得到一些有用的答案。 - bart s
1
我们在测试中发现,Safari 首先请求前两个字节(范围为 0-1),然后请求整个文件并立即关闭连接,接着它会请求文件的最后几百千字节(其中可能包含重要元数据,顺便说一句,Chrome 也是这样做的),之后开始分小块从开头到结尾请求整个文件。我猜测具体模式会因视频格式而异。 - Abhi Beckert
@AbhiBeckert:感谢您的反馈。我从未见过范围请求在文件末尾请求字节,但正如您所提到的,这可能取决于视频文件格式。我们正在使用.m4v文件。您能否反馈您使用的文件类型? - bart s
1个回答

5
1. iOS是否存在请求整个文件的范围请求(在4.3.3版本中也有出现),我本以为会请求Range: bytes=0-1,并在回复后像这样请求Range: bytes=0-65535/652965648。我不确定这是否是一个bug,但媒体播放器可能请求整个文件的原因是,这样可以从数据流中读取所有从开头到结尾的数据。 2. 我们无法优雅地拒绝大的请求并告诉请求方我们只能一次提供最大尺寸。范围请求由客户端/浏览器发起,如果服务器已经声明支持范围请求(通过Accept-Ranges头),则必须遵守客户端并响应其请求的任何范围。然而,您可以发送带有Transfer-Encoding: chunked头的数据,这将使您的服务器控制它将传输多大的数据块。但是,仍然是通过单个HTTP连接完成的。

1
感谢您的详细回复。我会将其标记为答案。 - bart s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接