多个并行 Http 请求的优点

cha*_*aco 0 java networking android http web

当我们创建多个连接/请求时,实际上会发生什么?与顺序请求相比,它的速度如何更快,我有这个问题,因为在并行请求的情况下,不会在请求之间共享带宽,从而导致较长的响应时间。

就我而言,我们使用 volley 库在不同线程上发出多个请求,但它有什么用处。

有人可以解释一下并行请求是如何以及为什么是首选的吗?

dga*_*ood 6

我能想到的至少有三个原因:延迟、丢包和流量整形。

\n\n
    \n
  1. 延迟:导致许多网络连接(尤其是蜂窝连接)变慢的主要原因是延迟\xe2\x80\x94,即请求往返服务器所需的时间。假设您发送五个请求,每个请求需要一秒钟的时间才能到达服务器并返回响应。如果您按顺序发送所有五个请求:

    \n\n
    0   1   2   3   4   5\n RQ1 RQ2 RQ3 RQ4 RQ5|\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    然后需要五秒钟。假设您在下一个之后立即向他们发送一个。

    \n\n
    0   1   2   3   4   5\n RQ1    |\n  RQ2   |\n   RQ3  |\n    RQ4 |\n     RQ5|\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这花费的时间要少得多,因为设备可以在前一个请求仍在进行中时传输下一个请求。

  2. \n
  3. 数据包丢失:速度缓慢的另一个原因(同样,尤其是蜂窝网络和 Wi-Fi 网络)是数据包丢失。TCP 通常使用拥塞控制技术来避免在网络链路(两个路由器之间的线路)饱和(满负荷)时导致过多的数据包丢失。当操作系统检测到数据包丢失时,它会暂停数据包的传出流,然后缓慢地再次开始发送数据包(包括重新传输丢失的数据包),速度越来越快,直到数据包丢失,然后再次退回,依此类推。

    \n\n

    由于此退避过程对于每个打开的 TCP 套接字都是独立发生的,因此如果同时打开多个套接字,则一个套接字上丢弃的数据包不会对其他套接字产生影响。因此,请求不会因其他请求期间发生的数据包丢失而任意延迟。

  4. \n
  5. 流量整形:通常,ISP 会对流量进行整形,以优先考虑交互式流量而不是下载流量。这导致每个网络连接一开始都非常快,然后在经过一定时间或传输一定量的数据后就慢得像爬行一样。

    \n\n

    通过在多个连接上并行发出多个请求,您可以同时而不是连续地承受时间损失。

  6. \n
\n\n

所有这一切的结果是,人们尝试设计网络协议来最小化往返次数,尝试同时保持多个请求,并最小化请求之间的依赖关系(根据请求 A 的响应发送请求 B 和 C) ) 越多越好。

\n\n

例如,当您编写 Web 浏览器时,一旦您获得了足以告诉您需要加载给定图像或 CSS 文件的 HTML 部分解析,您就开始获取图像和 CSS。越早启动每个相关请求,加载整个页面并呈现它所需的时间就越少。

\n


kri*_*son 5

假设您和三个朋友站在球场上,手里拿着一个棒球。

你想把球扔给你的每个朋友,所以你把球扔给你的第一个朋友。他把它扔了回去。然后你把球扔给你的第二个朋友,他把球扔回去,然后是你的第三个朋友,依此类推。

现在,假设您与三个棒球和三个朋友站在一块场地上。

你向你的第一个朋友扔了一个球。现在球在空中,所以你拿起另一个球并将其扔给你的第二个朋友。球在空中时,你将最后一个球扔给你的第三个朋友。

很容易看出,通过同时让多个球在空中,整个过程将花费更少的时间。同样的原理也适用于 HTTP 请求。显然,正如您所说,您必须能够拥有多个连接和多个线程;然而,当您能够做到这一点时,您将在更短的时间内完成相同数量的工作。