gpt4 book ai didi

node.js - 为什么在静态连接时Web套接字的延迟会有所不同?

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:39 24 4
gpt4 key购买 nike

HTTP 一次又一次为要通过网络传输的每个数据创建连接时, WEB SOCKETS 是静态的,并且连接最初将建立一次并将一直保持到传输完成...但是如果网络套接字是静态的,那么为什么每个数据包的延迟都不同。

我创建的latency test app向我显示了不同的时间滞后..那么,Web套接字是静态连接的优点是什么?或者这是Web套接字中的常见问题?

我是否需要创建一个缓冲区来控制数据流,因为中的数据传输是连续的?
连续数据传输时,延迟会增加吗?

最佳答案

与静态打开的Web套接字建立新连接没有开销(因为该连接已经打开并已建立),但是当您在世界各地进行请求时,网络连接会花费一些时间,因此当您进行网络连接时会出现延迟正在与世界各地的服务器通信。

网络就是这样工作的。

您会从自己局域网上的服务器获得几乎立即的响应,并且该服务器越远(就网络拓扑而言),每个数据包经过的路由器越多,则总延迟就越大。正如您在与该主题相关的先前问题中所见证的那样,当您从位置到服务器位置执行tracert时,您会看到每个数据包都必须经过许多不同的跃点。这些跃点中的每一个跃点的时间都加起来,并且繁忙的路由器如果没有立即处理您的数据包,也可能各自增加一个小的延迟。

从发送数据包到获得响应之间的等待时间仅为数据包传输时间的两倍,加上服务器响应所需的时间加上TCP的少量开销(由于它是可靠的协议(protocol),因此需要确认)。除非选择的服务器更近或以某种方式影响数据包到更快路由的路由,否则无法加快传输时间(一旦选择了要使用的本地ISP,多数情况下这将不受您的控制)。

您端的任何缓冲量都不会减少与服务器的往返时间。

此外,客户端和服务器之间的网络跳数越多,传输时间从一瞬间到下一瞬间的变化就越大。数据包遍历的每个路由器,并且其所经过的每个链路都有其自身的负载,拥塞等,这些负载会随时间而变化。您可能会观察到一个最小的渡越时间(永远不会比x快),但是随着时间的流逝,许多因素会影响它,使其比某些时候更慢。甚至可能会发生ISP将路由器脱机进行维护的情况,这会给处理流量的其他路由器增加更多负载,或者使跃点之间的路由出现故障,因此使用临时但较慢和较长的路由代替了它。从字面上看,有成百上千种可能导致运输时间随时间而变化的事物。通常,从一分钟到下一分钟变化不大,但是在一天中或更长的时间内很容易变化。

您没有说这是否相关,但是当您在给定的往返行程中延迟时间很短或性能非常重要时,您想要做的就是减少等待的往返次数。您可以通过以下两种方法进行操作:

1.不要对小的数据进行排序。 发送大量数据的最慢方法是发送少量数据,等待响应,发送更多数据,等待响应等...如果要发送的字节数为100,则发送数据每次等待一个字节一次,往返时间为X,则发送所有数据的总时间为100X。相反,请收集更大的数据并立即发送。如果一次发送全部100个字节,则总延迟可能只有X而不是100X。

2.如果可以,请并行发送数据。 如上所述,在往返时间较差时,发送数据,等待响应,发送更多数据,等待响应的模式很慢。如果可以对数据进行标记以使其独立存在,那么有时您可以并行发送数据,而无需等待先前的响应。在上面的示例中,发送1个字节,等待响应,发送下一个字节,等待响应非常慢。但是,如果您发送1个字节,然后发送下一个字节,然后发送下一个字节,然后稍后处理所有响应,则您将获得更好的吞吐量。显然,如果您已经有100字节的数据,则最好一次发送所有数据,但是如果数据是实时到达的,则可能只想在数据到达时将其发送出去,而不必等待先前的响应。显然,您能否执行此操作完全取决于客户端和服务器之间的数据协议(protocol)。

3.一次发送更大的数据。 如果可以,请一次发送更大的数据块。根据您的应用程序,在发送之前实际等待数据累积可能有意义,也可能没有意义,但是如果您已经有100字节的数据,则尝试一次全部发送而不是分小块发送。

关于node.js - 为什么在静态连接时Web套接字的延迟会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com