我正在使用 codeplex 1.1 版的c# 网络服务器。我已经实现了 Accept-Range 标头并且它确实有效。但是,当我使用 wireshark(版本 1.4.1(SVN Rev 34476 from /trunk-1.4))捕获流量时,我看到以下内容:
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 标头的更多信息,到目前为止我只能发现服务器必须发送请求的范围。但我不敢相信它是为了使用范围请求来一次请求一个巨大的文件。
我的网络服务器尝试发送整个文件,因为它已被请求,但我看到新的范围请求带有更大的范围(只有从请求标头复制的 Range 标头。(@time ...)是Wireshark 的时代
Range: bytes=2162688-652965647 (@ time == 1.646204)
Range: bytes=4980736-652965647 (@ time == 2.754322)
Range: bytes=6356992-652965647 (@ time == 2.922479)
读完这篇文章后,每当我收到整个文件的范围请求时,我都会尝试发送更短的范围。但是它根本不起作用。
我想知道:
- 整个文件的范围请求是否是 iOS 中的某种错误(也可以在 4.3.3 中看到
Range: bytes=0-1
)Range: bytes=0-65535/652965648
- 我可以以某种方式优雅地拒绝这个大请求并告诉请求我可以一次提供最大尺寸吗?(我在 RFC 中没有找到这个)
- IIS 是否只是在一定数量的字节后中止此请求?
编辑:对于数字 3:不是 IIS,但浏览器似乎只是中止(并关闭)连接。之后提出新的请求。我无法想象 Range Request 是为了请求整个文件或文件的巨大部分。
编辑:在 iOS7 中它似乎已经改变了。第一个范围请求仍然相同(字节 0-1)。之后,我看到上面提到的 2 或 3 个范围请求,其中最后一个请求继续传输字节更长的时间。但是仍然完成了多个请求。