为啥当它是静态连接时,Web 套接字的延迟会有所不同?
Posted
技术标签:
【中文标题】为啥当它是静态连接时,Web 套接字的延迟会有所不同?【英文标题】:why latency varies in web socket when it's a static connection?为什么当它是静态连接时,Web 套接字的延迟会有所不同? 【发布时间】:2014-08-18 06:54:16 【问题描述】:由于 HTTP 为要通过网络传输的每个数据一次又一次地创建连接,WEB SOCKETS 是静态的,并且连接最初会建立一次并保持不变直到传输完成...但是如果 web 套接字 是静态的,那么为什么每个数据包的延迟不同..???
我创建的latency test app 向我展示了不同的时间延迟。那么 Web 套接字作为静态连接的优势是什么,或者这是 Web 套接字中的常见问题?
我是否需要创建一个缓冲区来控制数据流,因为其中的数据传输是连续的..? 数据连续传输时延迟会增加吗?
【问题讨论】:
基本网络。数据包有许多可能的路线可以到达目的地,但并不总是采用相同的路线。 @BenFortune 好的,所以你的意思是延迟取决于它所走的路线..??所以对于每条路线你都有不同的延迟..??那么socket.io是如何制作实时应用的呢?? 延迟取决于一切:技术、路由、拥塞、服务器负载……没有合理的理由期望它保持不变。 hmm 谢谢..所以这意味着在我们使用 web socket 或任何其他传输方式的情况下延迟变化是好的..但是如果我们如何使用 web-sockets 制作实时应用程序延迟存在吗? @EJP 延迟取决于我所说的,而且还有很多。具体来说,如果传输是连续的,那么拥塞和服务器负载都会增加。 【参考方案1】:使用静态打开的 Web 套接字建立新连接没有任何开销(因为连接已经打开并建立),但是当您在世界的另一端发出请求时,网络需要一些时间,因此会有延迟当您与世界各地的服务器交谈时。
这就是网络的工作原理。
您会从您自己的 LAN 上的服务器获得几乎立即的响应,并且服务器获得的距离越远(就网络拓扑而言),每个数据包经过的路由器越多,总延迟就越大。正如您在之前与该主题相关的问题中所见证的那样,当您从您的位置到服务器位置执行tracert
时,您会看到每个数据包必须遍历许多不同的跃点。这些跃点中的每一个的时间都会加起来,如果繁忙的路由器没有立即处理您的数据包,它们也可能会增加一点延迟。
发送数据包和获得响应之间的延迟只是数据包传输时间的 2 倍加上服务器响应所需的时间,再加上 TCP 的一点点开销(因为它是一个可靠的协议,它需要确认)。您无法加快传输时间,除非您选择更近的服务器或以某种方式影响数据包到更快路由的路由(一旦您选择了要使用的本地 ISP,这通常不在您的控制之下)。
没有多少缓冲会减少到服务器的往返时间。
此外,您的客户端和服务器之间的网络跃点越多,传输时间从一个时刻到下一个时刻的变化就越大。数据包经过的每一个路由器以及它所经过的每一个链路都有自己的负载、拥塞等......随着时间的推移而变化。您可能会观察到最短的传输时间(它永远不会比 x 快),但是随着时间的推移,许多事情会影响它,使其在某些时候比它慢。甚至可能存在 ISP 使路由器脱机进行维护的情况,这会给处理流量的其他路由器增加更多负载,或者跳点之间的路由发生故障,因此临时但更慢且更长的路由被替换为它的位置。从字面上看,有数以百计的事情会导致运输时间随时变化。一般来说,从一分钟到下一分钟不会有太大变化,但很容易在一天中或更长时间内发生变化。
您还没有说这是否相关,但是当您在给定往返中的延迟很差或性能非常重要时,您想要做的就是尽量减少等待的往返次数。您可以通过以下几种方式做到这一点:
1.不要对小块数据进行排序。 发送大量数据最慢的方法是发送一点数据,等待响应,发送更多数据,等待响应,等等...如果您有 100 个字节要发送,并且每次发送数据 1 个字节以等待响应,并且您的往返时间是 X,那么您将有 100X 作为发送所有数据的总时间。相反,收集更多的数据并一次性发送。如果一次发送 100 个字节,总延迟可能只有 X 而不是 100X。
2。如果可以的话,并行发送数据。 发送数据的模式如前所述,等待响应,发送更多数据,当往返时间很差时等待响应很慢。如果您的数据可以被标记为独立存在,那么有时您可以并行发送数据而无需等待先前的响应。在上面的例子中,发送 1 个字节,等待响应,发送下一个字节,等待响应非常慢。但是,如果您发送 1 个字节,然后发送下一个字节,然后发送下一个字节,然后再过一段时间处理所有响应,您将获得更好的吞吐量。显然,如果您已经有 100 字节的数据,您不妨一次发送所有数据,但如果数据是实时到达的,您可能只想在数据到达时将其发送出去,而不是等待之前的响应。显然,您能否做到这一点完全取决于您的客户端和服务器之间的数据协议。
3.一次发送更大的数据。如果可以,一次发送更大的数据。根据您的应用程序,在发送之前实际等待数据累积可能有意义,也可能没有意义,但如果您已经有 100 个字节的数据,请尝试一次发送所有数据,而不是分小块发送。
【讨论】:
@CODeeerrrrrrrr - 我添加了一些关于处理低延迟的更多信息。以上是关于为啥当它是静态连接时,Web 套接字的延迟会有所不同?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我无法通过 Web 套接字连接获得 HubCallerContext 用户?