当网络套接字是静态连接时,为什么延迟会有所不同?

时间:2014-08-18 06:54:17

标签: node.js sockets websocket socket.io

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

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

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

1 个答案:

答案 0 :(得分:2)

与静态打开的Web套接字建立新连接没有任何开销(因为连接已经打开并建立),但是当您在世界各地做出请求时,网络需要一些时间当您与世界各地的服务器通话时,会出现延迟。

这就是网络的运作方式。

您可以从自己LAN上的服务器获得近乎即时的响应,服务器距离越远(在网络拓扑方面),每个数据包通过的路由器越多,总延迟就越多。正如您在前面提到的与此主题相关的问题中所见,当您从您的位置到服务器位置执行tracert时,您会看到每个数据包必须遍历的大量不同的跃点。每个跳跃的时间都会增加,繁忙的路由器如果不立即处理您的数据包,也可能会增加一点延迟。

发送数据包和获得响应之间的延迟只是数据包传输时间的2倍加上服务器响应的任何内容加上TCP的一小部分开销(因为它是一个可靠的协议,它需要确认)。除非您选择更接近或以某种方式影响数据包路由到更快路径的服务器,否则您无法加快传输时间(一旦您选择使用本地ISP,这通常不在您的控制之下)。 / p>

您端的缓冲量不会减少到服务器的往返时间。

此外,您的客户端和服务器之间的网络中的跃点越多,您在传输时间中从一个时刻到下一个时刻的变化就越多。数据包遍历的每个路由器以及它所经历的每个链路都有自己的负载,拥塞等......随时间变化。您可能会观察到最短的传输时间(它永远不会比x快),但是很多事情会随着时间的推移而影响它,使其慢于某些时刻。甚至可能存在ISP使路由器离线进行维护的情况,这会给处理流量的其他路由器带来更多负载或者跳跃之间的路由下降,因此在其位置上替换了临时但较慢且较长的路由。有数百种东西可以导致运输时间随时变化。一般来说,它从一分钟到下一分钟不会发生很大的变化,但很容易在一天或更长的时间内发生变化。


您还没有说过这是否相关,但是当您在给定的往返时间性能较差或性能非常重要时,您要做的是尽量减少等待的往返次数。您可以通过以下几种方式实现这一目标:

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

<强> 2。如果可以的话,并行发送数据。如上所述,发送数据的模式,等待响应,发送更多数据,等待响应时间往往很慢。如果您的数据可以标记为独立,那么有时您可以并行发送数据而无需等待先前的响应。在上面的例子中,发送1个字节,等待响应,发送下一个字节,等待响应非常慢。但是,如果你发送1个字节,然后发送下一个字节,然后发送下一个字节,然后一段时间后你处理所有的响应,你会获得更多,更好的吞吐量。显然,如果你已经拥有100个字节的数据,你也可以一次性发送所有数据,但如果数据是实时到达的,你可能只想在它到达时发送它而不是等待先前的响应。显然,您是否可以这样做完全取决于客户端和服务器之间的数据协议。

第3。一次发送更大的数据。如果可以,一次发送更大的数据块。根据您的应用程序,在发送数据之前实际等待数据累积可能有意义也可能没有意义,但如果您已经拥有100个字节的数据,则尝试一次性发送数据而不是以较小的数量发送数据。 / p>