为什么HTTP请求和响应会延迟?

14

我正在使用HTTP POST方法发送请求到Http服务器URL。

请求和响应之间的时间差大约为60秒,但据服务器团队称,一旦请求到达他们这里,他们会在7秒内发送响应。

我不认为网络需要剩余53秒的时间才能将数据包传达到服务器端,那么问题可能是什么呢?

在该应用程序中,客户端和服务器之间使用同步通信。请还提供以下详细信息:

  1. 是否因为服务器发送请求的速度比它处理请求的速度更快。在这种情况下,客户端多次在3秒的时间间隔内收到请求,而服务器需要7秒才能处理这些请求。
  2. 网络缓冲区是什么。是否有两个网络级别的缓冲区,一个在客户端,另一个在服务器端。
  3. 如果服务器无法以与客户端发送请求相同的速度处理请求,则所有请求是否都会在客户端缓冲区中缓冲,并且如果有更多待处理的请求超过缓冲区的最大大小,会发生什么情况。
  4. 如果我们在客户端端并且无法控制服务器,有哪些替代方法可以提高性能。

编辑:当我在我的网络中使用Wireshark捕获网络日志时,我发现它出现在Wireshark中比实际应用程序发送到服务器的时间晚20秒。这种延迟的原因是什么?请求出现在网络上比实际发送的时间晚20秒的可能原因是什么。


7
Fiddler(http://www.fiddler2.com/fiddler2/)是你的朋友。下载并启动它,它将提供HTTP时间统计信息,让你更好地诊断问题。 - Liam
1
尝试分解问题。将客户端代码与本地主机进行时间比较,以查看准备响应所花费的时间,并计算出消息大小。这将有助于其他人回答您的问题所在。 - Jason Sperske
3
还要考虑到服务器立即发送数据,但关闭连接需要很长时间的可能性(即长轮询)。 - Jason Sperske
Wireshark抓包是从哪里进行的?客户端机器上吗? - bmm6o
你需要提供一些代码供我们分析。你的问题太泛泛而谈了。你是如何发送HTTP请求和响应每一个对等体的?几年前我也遇到过类似的问题,我很确定你的问题是什么,但在不知道是否实际上是同样的错误的情况下解释这个问题就像是瞎猜一样。 - Havenard
显示剩余8条评论
6个回答

33
关于您的编辑,为了帮助您理解。网络遵循一种称为“开放式源互连(OSI)”的模型。该模型分为七个不同的层,每个层都有一个功能。
这些层在此处:

OSI Model

Wireshark检测位于第三层的数据包,由路由器处理。网络接口卡(NIC)将分配的数据转换为数据包以通过电线发送。只有当您的NIC将其转换为路由器处理的数据包时,Wireshark才能检测到该数据包。一旦转换为数据包,它就包含以下信息:
  • 4位包含版本(IPV4或IPV6)
  • 4位包含互联网头。
  • 8位包含服务类型或服务质量和优先级。
  • 16位包含数据包的字节长度。
  • 16位包含标识符,以帮助重建来自片段的数据包。
  • 3位,第一个是零,后跟一个标志,表示允许分段还是不允许。数量。
  • 13位包含片段偏移量,用于标识到原始位置的位置。
  • 8位包含生存时间(TTL)和路由器间跳数。
  • 8位包含协议(TCP,UDP,ICMP等)
  • 16位包含标题校验和
  • 32位包含源IP地址
  • 32位包含目标IP地址

这些是创建此类数据包时创建的关键160位。

这是什么意思?

您知道,Wireshark需要二十秒钟才能检测到您的数据包。因此我们可以得出结论,您的应用程序实际上需要二十秒钟来构建此数据包。

我们知道服务器也需要重组此数据包以处理数据并可能发送请求。

我们也知道路由器就像交通警察一样,将您的数据发送到互联网或本地网络。

这增加了很多推断,但我该去哪里呢?

您有一个名为:tracert的实用工具。

平均而言,路径请求需要一到两毫秒通过五到六英尺的电缆传递,因此如果初始跳跃生成一到两毫秒,但第二个跳跃在二十到三十毫秒内触发,则可以使用简单的公式:

6 * 20

根据我们的tracert当前速度,我们可以估算时间持续时间。这是一种非常通用的方法,但存在工具以实现精确准确性。但是跳数越多,到达目的地所需的时间就越长。同时,你需要乘以更多因素。 那么客户端和服务器之间呢?
  • 局域网(LAN):网络的内部效率取决于每个网络协议、设备和物理介质的优化。网络管理员必须通过速度来衡量可靠性,以及网络生成的所有流量。因此,设备的吞吐量和物理介质非常重要。您不希望十辆汽车汇入一个单车道隧道,这可能会造成瓶颈,同样适用于网络。

  • 广域网(WAN):这基本上是连接到互联网、云的方式。想象一下:您的计算机位于LAN上,路由器连接到WAN。然后,您的ISP很可能有一个LAN,然后将其WAN打开到更大的分销设施。它继续向上工作,直到到达互联网。

那我能做什么呢?

你知道现在的情况,但我能做什么呢?

当你生成你的服务时,你显然希望确保你的代码精简高效。因为效率对速度非常关键。所以改变缓冲区大小、传输速率等等可以极大地提高你的应用程序。

显然,良好的代码实践会有所帮助。

但我的代码非常稳定啊?

如果你认为此时你的代码不是问题,或者你主机创建服务的方法不是问题,那么这些因素可能是原因:

  • 本地计算机可能产生过多的交互,因此需要更长的时间。
  • 本地网络产生过多的交互或效率低下/吞吐量低。
  • 你的请求正在远距离传输,所以时间被延迟了。
  • 你的互联网服务提供商可能有硬件防火墙、代理等,扫描这些数据包。
  • 你的服务器可能有过多的请求,或者主机方法不够有效。

这些是较大的变量。你所能尝试的就是重构服务,并确保你的服务器以最有效的方式进行主机。否则,你需要让信息技术团队参与,这是至关重要的。

请注意,您与该服务的接口体验可能比其他客户好或差。
我假设您部署在一个位置,并且可能距离服务器有几个州的距离。
工具:
命令行:
- Ping - Tracert
网络和协议分析工具:
- Fiddler(HTTP/HTTPS):查看Fiddler是否显示任何HTTP状态代码以进行故障排除。 - Wireshark:将分析您的网络流量,可以帮助您计算时间持续时间。
还有其他可用于缓解和测试网络速度甚至到其他位置的实用程序,只需搜索“网络工具”。Fluke有一些。
希望这能解释为什么Wireshark甚至要花20秒才能在网络上显示数据包。
希望能对您有所帮助。

1
对于辛勤(而且惊人的:)工作,点个赞。还可以添加http://serverfault.com/questions/10235/what-is-the-osi-model-and-how-does-it-apply-to-todays-networks... - Nadav Ben-Gal
@NadavBen-Gal 谢谢您。那也是一篇不错的帖子。 - Greg

8
使用Wireshark在网络上捕获您的请求和响应,间隔60秒,并将其发送给服务器团队。他们可能会回复一份更接近7秒的请求和响应的捕获。太好了!将它们都发送给网络团队。
另一方面,有可能跟踪显示延迟出现在您的代码中。您的端口可能存在某种限制或延迟,使得请求在相当长的时间内无法离开您的进程。Wireshark跟踪还可以告诉您这一点。

是的,这听起来像是Wireshark而不是Fiddler的工作。 - Yaur
首先,原始问题的提出者应该自己检查捕获(的数据)——他应该在将问题传递给另一个团队之前努力弄清楚问题所在。 - Jon Skeet
@bmm6o 很好的回应,没错。这将缓解代码或服务器相关问题,并直接指向网络作为潜在问题。 - Greg

7

TCP/IP流将控制您所担心的大部分内容。

"发送请求比服务器处理得更快"

不,当使用TCP会话时,您永远不会比服务器接收得更快。传输流是受控的,无法比服务器处理得更快。

"什么是网络缓冲区"

TCP/IP通信涉及两个队列缓冲区:发送缓冲区和接收缓冲区。

当您进行send()调用时,它实际上并不会发送任何内容,它只会将数据排队到发送缓冲区中,并返回给您有多少字节实际上被放入队列中以供发送。如果返回值小于您尝试发送的值,则意味着您必须等待发送其余内容,因为缓冲区已满。

这就是如何控制流量,这是您知道是否正在尝试发送过快的提示。尽可能保持缓冲区充满,只要有数据要发送,但不要忽略事实,即并非所有内容都适合缓冲区,您必须稍后重试。

recv()也有自己的缓冲区。此命令实际上不是接收任何内容,数据已经接收到,recv()只会从接收缓冲区中读取它。当使用阻塞套接字(默认)时,如果缓冲区为空,则recv()将挂起,等待新数据到达。只有在连接终止或尝试使用非阻塞套接字时,recv()才会返回0。

如果您忘记了recv()并且接收缓冲区变满,那也没关系。对等方将无法继续发送,因为send()将开始向他们返回0,但只要您注意send()的返回值,在任何时候都不会丢失数据。

据我所知,默认情况下所有系统的缓冲区大小均为64KB,无论是发送还是接收。有命令可调整此缓冲区大小,但这并不是一个有趣的操作。如果需要更大的缓冲区,请在应用程序中创建它。

"如果我们处于客户端,并且无法控制服务器,有哪些替代方法可以提高性能"

这不是一个有效的问题,您无法这样做。我认为您可能在HTTP请求方面犯了一些错误,特别是考虑到您正在进行POST请求。

在进行POST请求时,您的HTTP标头将包含通常仅在服务器HTTP响应标头中看到的两个标头:Content-Type和Content-Length。在进行POST时,它们非常重要,如果其中一个缺失或错误,则HTTP会话可能会挂起几秒钟或根本无法成功。

HTTP的另一个重要方面是HTTP 1.0和HTTP 1.1之间最基本的区别:HTTP 1.0不支持Keep-Alive。对于初学者来说,使用HTTP 1.0更容易处理,因为在HTTP 1.0中,您连接、发送请求,服务器回答并终止连接,这意味着您已完成下载服务器响应。但在默认情况下,HTTP 1.1则不会出现这种情况。连接保持打开状态,直到超时。您必须注意HTTP响应头Content-Length并计算字节数,以便知道服务器是否已经发送了您请求的内容。
同样需要注意的是,并非所有服务器都支持HTTP 1.0。您可以发出HTTP 1.0请求,但它仍将以1.1方式响应,包括您没有预期的Keep-Alives等功能。在理想情况下不应该发生这种情况,但确实会发生。
您的错误可能在这个区域。由于您的请求正好需要60秒,我怀疑这是因为超时导致的。您可能已经收到了您要接收的所有内容,但应用程序未正确处理,然后一直挂起,直到连接被服务器终止。

2

关于第一点:

在你的第一点中,我认为你想说的是“1. 是由于客户端发送...”,“在这种情况下,很多时候客户端会在间隔时间内得到响应...”。

关于第三点:

  • 服务器通常比客户端更为强大,因此“如果服务器不能以与客户端相同的速度处理请求”的情况非常罕见。如果我没记错,HTTP服务器是按“先来先服务”的方式运行的,你所称的请求缓冲区会是服务器端的队列而不是客户端。我从未听说过“所有请求都被缓存到客户端缓冲区”。

  • 服务器响应的时间通常很快,但结果返回给客户端的时间更多地取决于原始请求的内容,无论它只是检索静态HTML文件,还是检索大型图像或文档,或者必须在DB服务器上执行繁重的查询等。

  • 您是唯一向服务器提交HTTP请求的客户端吗?可能不是。那台服务器机器只是托管HTTP服务器吗?请记住,服务器将处理来自多个客户端的请求,这可能是延迟响应的另一个因素,即使服务器可以同时处理多个请求,并取决于其他请求正在做什么。当服务器处于[分布式]拒绝服务攻击中时,HTTP服务器无法响应的极端案例。

  • 你有任何防火墙保护HTTP服务器或保护HTTP服务器所在网络吗?具有防火墙规则或网络入侵检测系统可能会延迟请求/响应时间。

  • 以下可能是“请求为什么会出现在网络上,在实际发送后20秒才出现”的另一个因素。它被称为“网络拥塞”,通常发生在路由器级别。

关于第四点:

  • 一旦排除或消除与第3点相关的因素,您可以通过以下方式提高性能:

  • 首先,在排除所有其他主要延迟因素之后,确定您期望的响应时间。

  • 其次,确保您在什么条件下/情况下具有合理准确的往返时间测量。我假设HTTP服务器不应该受到责备。

  • 第三,如果仍然遇到延迟,您(或其他人)将需要查看路由器的配置、防火墙的配置以及您的HTML页面代码(如果有)或您的Web应用程序(如果有)。

编辑:

尝试ping你的HTTP服务器以了解网络往返时间。

这里是一个例子:我在客户端PC上从MS-DOS窗口提交了以下命令:

ping www.yahoo.com

输入图像描述

1)请注意,往返时间大约为0.5秒或更短(0.5秒=500毫秒)。我在美国东海岸,Yahoo.com可能位于美国西海岸(我不确定)。

2)请注意,每个往返时间长度不总是相同,但变化很小。

3)从我的本地PC到像Yahoo.com这样的世界级公开服务器,中间会有几个请求、路由器和防火墙,并且响应时间甚至不到1秒。这意味着如果网络和服务器配置正确,则它们很少会成为延迟的原因,这意味着在将其归咎于HTTP服务器之前,应彻底审查/审核您的页面或应用程序。

4)当我从浏览器提交请求http://www.yahoo.com时,加载页面确实需要多于0.5秒,我认为这是因为页面中所有HTML元素和广告,但是HTTP服务器响应很可能只有0.5秒。


Windows现在不再使用DOS,而是称为命令行。此外,一些网络会阻止ICMP请求,最好使用Tracert,因为它会在给定的路由器处失败,但显示到目标的所有其他时间和跳数。 - Greg

0
在第4点上:对于大量数据,传输所花费的时间可能相当可观。如果您的服务器支持,您可能希望在发送数据之前压缩内容。

0

尝试检查您的DNS配置,我认为这可能是一个问题。在您的浏览器或脚本发出请求之前,必须将域名解析为IP地址。

您可以通过向位于Windows中的主机文件添加其他信息来轻松检查此信息:

C:\ Windows \ System32 \ drivers \ etc \ hosts

或在Linux系统中:

\ etc \ hosts

要检查有关域和IP地址的信息,请尝试使用nslookup(Windows和Linux OS上相同的命令)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接