as HTTP为通过网络传输的每个数据一次又一次地创建连接,WEB套接字是静态的,连接将初始化一次,并将保持直到传输完成。但是如果web套接字是静态的,那么为什么每个数据包的延迟不同???
我创建的延迟测试应用程序显示了我不同的时间延迟。那么web套接字作为静态连接的优势是什么,或者这是web套接字中的一个常见问题?
我需要创建一个缓冲区来控制数据流,因为数据传输是连续的…?数据连续传输时延时是否增加?
与静态打开的web套接字建立新连接没有开销(因为连接已经打开并建立),但是当您在世界的另一端发出请求时,网络需要一些时间,因此当您与世界另一端的服务器交谈时存在延迟。
人际关系就是这样的。
你从你自己局域网的服务器得到一个近乎即时的响应,服务器越远(就网络拓扑而言),每个数据包通过的路由器越多,总延迟就越多。正如您在前面与本主题相关的问题中所看到的,当您从您的位置到服务器位置执行tracert
时,您看到每个数据包必须经过许多不同的跳。每一个跳的时间都加起来,如果繁忙的路由器没有立即处理你的数据包,它们也可能会增加一个小的延迟。
发送数据包和获得响应之间的延迟只是数据包传输时间的两倍,加上服务器响应所需的时间,再加上TCP的一点点开销(因为它是一个可靠的协议,它需要确认)。你不能加快传输时间,除非你选择一个更近的服务器或以某种方式影响数据包的路由到一个更快的路由(一旦你选择了一个本地ISP使用,这基本上不在你的控制之下)。
再多的缓冲也不会减少到服务器的往返时间。
此外,网络中客户端和服务器之间的跳数越多,在传输时间中从一个时刻到下一个时刻的变化就越大。数据包经过的每一个路由器和它所经过的每一个链路都有自己的负载、拥塞等。这是随时间变化的。你可能会观察到一个最小的凌日时间(它永远不会比x快),但随着时间的推移,许多事情会影响它,使它在某些时刻比x慢。甚至可能出现这样的情况:ISP让路由器脱机进行维护,这会给处理流量的其他路由器带来更多的负载,或者跳之间的路由下降,因此一个临时的,但速度较慢且较长的路由被取代。从字面上看,有数百种因素会导致穿越时间的变化。一般来说,一分钟一分钟变化不大,但一天或更长的时间内很容易发生变化。
你没有说这是否相关,但是当你在一个给定的往返中有很低的延迟,或者当性能非常重要时,你想做的是最小化你等待的往返次数。您可以通过以下几种方式实现:
1。不要对小块数据进行排序。发送大量数据的最慢方式是发送少量数据,等待响应,发送更多数据,等待响应,等等…如果您有100个字节要发送,并且每次发送1个字节,等待响应,每次往返时间为X,则发送所有数据的总时间为100X。相反,应该收集更大的数据,然后一次性全部发送出去。如果你一次发送100字节,你可能只有X的总延迟,而不是100X。
2。如果可以,并行发送数据。如上所述发送数据,等待响应,发送更多数据的模式,当往返时间较差时等待响应较慢。如果可以对数据进行标记,使其独立存在,那么有时可以并行发送数据,而无需等待先前的响应。在上面的例子中,发送1个字节,等待响应,发送下一个字节,等待响应是非常慢的。但是,如果你发送一个字节,然后发送下一个字节,然后发送下一个字节,然后一段时间后你处理所有的响应,你会得到更好的吞吐量。显然,如果您已经有100字节的数据,那么您也可以一次发送所有的数据,但是如果数据是实时到达的,那么您可能希望在数据到达时就发送出去,而不是等待先前的响应。显然,你是否能做到这一点完全取决于你的客户端和服务器之间的数据协议。
3。一次发送更大的数据。如果可以,一次发送更大的数据块。根据你的应用,在发送数据之前等待数据积累可能是有意义的,也可能没有意义,但如果你已经有100字节的数据,那么尝试一次发送所有数据,而不是发送小块数据。