Apache 一段时间后,FIN pkt与HTTP连接

Apache 一段时间后,FIN pkt与HTTP连接,apache,http,networking,tcp,client-server,Apache,Http,Networking,Tcp,Client Server,已打开2个TCP连接: 1.正常连接(在实现echo服务器、客户端时) 2.HTTP连接 在以服务器身份运行apache时,使用curl(modified)实用程序打开了HTTP连接,其中curl在连接建立后的一段时间内不发送GET请求。 对于连接建立后的正常连接,服务器正在等待客户端的请求。 但正如所观察到的,奇怪的是,在连接建立后的HTTP连接中,若GET请求不是来自客户机(一段时间内),服务器会向客户机发送FIN pkt并关闭其连接部分。 HTTP客户端必须在初始连接后立即发送GET请求。

已打开2个TCP连接: 1.正常连接(在实现echo服务器、客户端时) 2.HTTP连接

在以服务器身份运行apache时,使用curl(modified)实用程序打开了HTTP连接,其中curl在连接建立后的一段时间内不发送GET请求。 对于连接建立后的正常连接,服务器正在等待客户端的请求。 但正如所观察到的,奇怪的是,在连接建立后的HTTP连接中,若GET请求不是来自客户机(一段时间内),服务器会向客户机发送FIN pkt并关闭其连接部分。
HTTP客户端必须在初始连接后立即发送GET请求。

Apache获得了一个名为Timeout的参数

其手册页()说明:

TimeOut指令定义了Apache在各种情况下等待I/O的时间长度:

  • 从客户端读取数据时,等待 如果读取缓冲区为空,TCP数据包将到达
  • 将数据写入客户端时,等待 如果发送缓冲区已满,则确认数据包
  • 在mod_cgi中,等待cgi脚本输出的时间长度
  • 在mod_ext_filter中,等待来自一个 过滤过程
  • 在mod_proxy中,如果ProxyTimeout不是默认值,则为默认超时值 配置
  • 我认为你陷入了一号案件

    编辑

    我潜伏在W3HTTP文档中,没有找到超时的引用

    但在第8章(联系)中,我发现:

    服务器通常会有一些超时值,超过这个值,它们将不再保持非活动连接。(…)持久连接的使用对客户端或服务器的此超时的长度(或存在性)没有任何要求


    这听起来像是“每台服务器或客户端都可以自由选择其关于非活动连接超时的行为”

    感谢Davide的回答,但我的疑问是“HTTP客户端在初始连接后立即发送GET请求是否是一个强制性条件”。这意味着不仅Apache服务器,而且所有HTTP服务器都将遵循此条件(从客户端读取数据时,如果读取缓冲区为空,等待TCP数据包到达的时间长度。)Davide再次感谢您的ans。我将再次解释场景:我们修改了curl/wget,使这些实用程序能够启动连接,但不会将GET请求发送到HTTP服务器(apache/lighthttpd)有一段时间(我的回答是:“依赖于服务器,而不是HTTP协议本身”但是对于正常的TCP连接,我们没有观察到FIN pkt,我也给了您一个TCP echo server的场景,在这个场景中,我们没有观察到FIN pkt,而我们观察到HTTP server。您介意转储这两个连接并发布pcap文件吗?让我们澄清一下。您有一个web服务器正在侦听端口80。当您在eb服务器和echo客户端,连接不会断开(服务器未发送FIN),但如果您在修改的curl和服务器之间建立连接,而不推送任何数据,则服务器会断开连接?是,但没有尝试此条件“web服务器和echo客户端之间的连接”。但尝试了简单连接(没有端口80)echo客户端,echo服务器,在另一种情况下,web服务器(端口80)和修改后的curl之间的TCP连接。观察到web服务器在一段时间后(1秒内)发送FIN,这与echo客户端,服务器不同。因此,只想确认这是由于HTTP(端口80)而发生的魔术。很抱歉,如果没有正确解释我的Que,这在我看来是正确的。那么,为什么我的回答还不够?echo服务器没有超时,apache服务器(不是协议本身)有超时!“HTTP客户端在初始连接后立即发送GET请求是强制性条件吗?”不,但这是一个非常好的主意,否则您可能会遇到服务器读取超时,就像您看起来正在做的那样。HTTP规范并不禁止这些。我不明白您为什么认为您会这样做。这不是一个真正的问题。不,实际上我正在嗅探Web服务器和HTTP客户端之间的数据包,有时(由于CPU负载)我们将数据包保留很长时间,然后首先观察到这个问题。当观察到这个问题时,修改了HTTP客户端以复制它。