Safari发送两个HTTP Req。同一时间/插座

时间:2013-03-21 19:52:50

标签: http tcp safari wireshark http-1.1

我有一个IPad Safari在30毫秒内发送两个HTTP请求(两个不同的PNG)文件。

我认为即使在Keep Alive HTTP 1.1连接上,也应该有一个明确的请求/响应序列。

我看到Safari浏览器在30毫秒内发送两个GET请求而不等待答案。这会导致某些Web服务器出现问题。

情况: 我有一个HTML5加载SVG,并进一步引用其他图像(如PNG和GIF)。问题不会发生在iPhone 5上,而是发生在IPad上。

请看看这个wireshark转储: http://tinyurl.com/c7m37b9 (第116/117号框架)

IPad(1)信息: 版本5.1.1(9B206) 型号MB2292FD Safari 5.1

[GET /Licht_3.gif HTTP/1.1
...
User-Agent: Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML,      like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
Accept: */*
...
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Connection: keep-alive]

[GET /Licht_3.gif HTTP/1.1
Host: 192.9.225.251:8081
...
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Connection: keep-alive]

[HTTP/1.1 200 OK
...
Content-Type: image/png
Content-Length: 3921]

3 个答案:

答案 0 :(得分:2)

看起来像HTTP pipelining

  

HTTP流水线技术是一种多种HTTP请求的技术   在没有等待相应的情况下发送单个TCP连接   响应。

答案 1 :(得分:1)

我认为这可能是因为浏览器遵守HTTP 1.1 Spec 8.2.4。如果客户端通过中间层连接到服务器并且在连接关闭之前没有从服务器获得响应,则允许客户端重试请求。

我看到了这个错误,并发现以下链接有帮助。

https://www.ravellosystems.com/blog/beware-http-requests-automatic-retries/

http://geek.starbean.net/?p=393

答案 2 :(得分:0)

我也是从移动游侠客户端看到的。我能找到的唯一解决方法是在Nginx中禁用整个服务器的keepalive。禁用keepalive时,我们不会收到重复请求和/或流水线可能无法从Safari客户端运行。

在Nginx中,有一个keepalive_disable选项,但它仅适用于某些浏览器上的POST请求,并且没有很多选项。我们最终使用keepalive_timeout 0禁用该服务器上的keepalive;我希望将来有更好的解决方案。

我认为正确使用流水线会提交多个不同的请求,而不是重复请求。