【问题标题】:Why is the last chunk of HTTP download really slow?为什么最后一块 HTTP 下载真的很慢?
【发布时间】:2009-09-22 21:01:09
【问题描述】:

我在下载开始时有可用的内容长度。所以我知道我需要请求多少字节。 我以 1024 字节的块下载。在最后一个块中,我请求剩余的字节数。我正在使用读取功能。 但是最后一块需要很长时间才能到达。正常吗?

【问题讨论】:

  • 如果你的浏览器和telnet都能正常处理,而你的客户端没有,为什么不贴相关代码sn-p。

标签: linux http download yslow


【解决方案1】:

也许您的最后一个块不够大,无法刷新缓冲区。

您可以检查如何刷新 fd 并在发送最后一个块后手动执行。

【讨论】:

  • 当您发送 1024 字节时,它看起来足够大,可以让文件描述符内部缓冲区自行刷新。如果内容很小,fd 将等待超时然后刷新,或者当你关闭它时。
  • 我要求的字节数与最后一个块所需的字节数一样多,而不是 1024。
  • 再一次,显然 1024 不会发生这种情况,但更少...“如果内容大小很小,fd 将等待超时然后刷新,或者当你关闭它时”
  • 问题不是发送,而是接收
  • 查看 Nagle 的算法,了解为什么会发生这种情况。看起来你的问题是内容写入套接字后服务器没有关闭连接。
【解决方案2】:

没有。我的猜测是服务器缺少对flush() 的调用,因此输出会挂在某个缓冲区中,直到超时(然后,服务器将刷新)。

【讨论】:

  • 但是我的网络浏览器也应该需要一些时间来下载页面。事实并非如此。浏览器立即加载页面。而我的程序大约需要 8 秒,大部分时间都在等待最后一个块。
  • 浏览器将开始根据迄今为止发送的内容进行操作。例如,在 PHP 中,在写出网页的head 之后调用flush 是一个好主意,这样浏览器就可以在页面的其余部分正在写入时开始加载head 的内容/加载。浏览器一旦通过网络获取标记,也会尝试解析/呈现页面。这可能就是您在浏览器中看到立即呈现的原因。
  • 它在浏览器中工作,因为浏览器已经缓存了页面。
【解决方案3】:

谢谢 我解决了这个问题。我的代码使用应用程序级缓冲区,因此最后一个块需要很长时间才能下载。 我一直在使用 Bryant 书中给出的强大的 io 函数。一段时间前我研究过该代码并忘记了它。我修改了代码,发现代码正在使用缓冲。

bryant's book - rio functions

我犯的另一个错误是使用 HTTP/1.1。 HTTP 1.0 导致服务器在传输数据后关闭连接。 这样就解决了问题。

【讨论】:

  • 你可以在 HTTP/1.1 中使用请求头 Keep-Alive: close
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
相关资源
最近更新 更多