我正在使用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
网络服务器将尝试发送整个文件(&gt; 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标头的更多信息,到目前为止,我只能发现服务器必须发送请求的范围。但我无法相信这是为了使用范围请求一次请求一个巨大的文件。
我的网络服务器试图发送整个文件,因为它已经被请求了,但是我看到新的范围请求带有更大的范围,例如从请求标头中复制的Range标头。(@time .. 。)是wireshark的时间
Range: bytes=2162688-652965647 (@ time == 1.646204)
Range: bytes=4980736-652965647 (@ time == 2.754322)
Range: bytes=6356992-652965647 (@ time == 2.922479)
阅读this后,每当我收到整个文件的范围请求时,我都尝试发送更短的范围。但它根本不起作用。
我想知道:
Range: bytes=0-1
和重播之后的Range: bytes=0-65535/652965648
编辑:对于数字3:不是IIS,但浏览器似乎只是简单地中止(并关闭)连接。之后提出新的请求。我无法想象Range Request是为了请求整个文件或文件的巨大部分。
编辑:在iOS7中它似乎已经改变了。第一个范围请求仍然相同(字节0-1)。之后,我看到如上所述的2或3个范围请求,其中最后一个请求继续传输更长时间的字节。但是仍然有多个请求。
答案 0 :(得分:4)
- 整个文件的范围请求是否是iOS中的某种错误(也见过4.3.3)我希望Range:bytes = 0-1并且在重放之后会出现类似Range:bytes = 0 -65535/652965648
醇>
我不知道这是不是一个bug。但是,我可以想到媒体播放器在一个请求中请求整个文件的原因。通过这种方式,媒体播放器可以获得数据流,从中可以从头到尾读取所有数据。
只要媒体播放器从流中读取了足够的数据,它就可以开始播放媒体文件。然后它选择在媒体播放时它将在后台缓冲多少数据。可能有几种不同的方法:
急切地缓冲整个媒体文件。当带宽便宜时(用户不支付或支付统一费率进行数据传输),这是一个很好的策略。假设用户想要查看/收听整个媒体文件。
懒惰缓冲,足以避免滞后。当带宽昂贵(用户按字节付费)时,这是一个很好的策略。
在理想的设置中,媒体播放器根本不需要缓冲任何内容,而是在实时播放媒体时解码流中的数据。但是,这需要底层网络信道超级稳定,并始终以所需的速度传输数据。
情况并非如此,因此媒体播放器会选择缓冲几秒钟或几分钟。
重要的是要注意,无论选择何种策略,媒体播放器在单个请求中请求整个资源仍然是有意义的。
但是,在以下情况下,范围请求对媒体播放器至关重要:
- 我可以以某种方式优雅地否认这个大请求并告诉请求我可以立即提供最大尺寸吗?
醇>
不,你不能。范围请求由客户端/浏览器发起,并且已声明它支持范围请求(通过Accept-Ranges
标头)的服务器必须服从客户端并响应它请求的任何范围。
但是,您可以使用Transfer-Encoding: chunked
标头发送数据。这将使您的服务器能够控制它应传输的大块数据量。但是,它仍然通过单个HTTP连接完成。