HTTP Keep Alive持续时间与TCP超时持续时间之间的关系

时间:2010-04-29 08:44:33

标签: http tcp keep-alive

我试图了解TCP / IP和HTTP超时值之间的关系。这两个超时值是不同还是相同?大多数Web服务器允许用户通过某些配置设置HTTP Keep Alive超时值。 Web服务器如何使用此值?这个值是否只是在底层的TCP / IP套接字上设置,即HTTP Keep Alive超时和TCP / IP保持活动超时相同?或者他们的待遇不同?

我的理解是(可能不正确): 无论配置的HTTP保持活动超时如何,Web服务器都使用底层TCP套接字上的默认超时(即无限期),并创建一个计数器,该计数器线程将指定的HTTP超时间隔倒计时。当Worker线程达到零时,它会关闭连接。

修改 我的问题是关于两个超时持续时间之间的关系或差异,即当HTTP保持活动超时持续时间和Web服务器使用的Socket(SO_TIMEOUT)上的超时不同时会发生什么?我是否应该担心这两个是否相同?

3 个答案:

答案 0 :(得分:30)

他们是两个独立的机制;这个名字是巧合。

HTTP keep-alive(也称为持久连接)保持TCP套接字打开,以便在不设置新连接的情况下发出另一个请求。

TCP keep-alive是一项定期检查,以确保连接仍然正常并正常运行。它通常用于确保NAT盒(例如,DSL路由器)不会“忘记”内部和外部ip /端口之间的映射。

答案 1 :(得分:28)

开放式TCP套接字不需要双方之间的任何通信(让我们称之为Alice和Bob),除非发送实际数据。如果Alice收到了她发送给Bob的所有数据的确认,那么她就无法区分以下情况:

  1. Bob已被拔掉,或者Alice无法访问。
  2. Bob已重新启动,或以其他方式忘记了他与Alice建立的打开的TCP套接字。
  3. Bob已经连接到Alice,并且知道他有一个打开的连接,但没有他想说的任何内容。

如果Alice暂时没有收到鲍勃的消息并且想要区分上述情况,她可以重新发送她的最后一个数据字节,包裹在一个合适的TCP帧中以便可以识别为重传,基本上假装她没有听到了确认。如果Bob被拔掉,即使她在几秒钟内反复发送数据包,她也不会再听到任何消息。如果Bob重新启动或忘记了连接,他将立即回复说连接无效。如果Bob对连接感到满意并且无话可说,他将回复确认重传。

超时表示Alice在发送需要回复的数据包时愿意等待响应的时间。 Keepalive时间表示在重新传输最后一位数据并要求确认之前她应该允许多长时间失效。如果Bob失踪,Keepalive和Timeout值的总和将指示Alice收到她的最后一位数据与她判定Bob已经死亡之间的最坏情况时间。

答案 2 :(得分:4)

  

KeepAliveTimeout 指令

     

描述:服务器等待后续的时间   持久连接上的请求语法:KeepAliveTimeout秒   默认值:KeepAliveTimeout 15上下文:服务器配置,虚拟主机   状态:核心模块:核心Apache等待的秒数   关闭连接之前的后续请求。一旦请求有   已收到,超时值由Timeout指令指定   适用。

     

将KeepAliveTimeout设置为较高的值可能会导致性能下降   重载服务器中的问题。超时越高,越多   服务器进程将等待连接等待   空闲的客户。

     

在基于名称的虚拟主机上下文中,第一个定义的值   一组NameVirtualHost中的虚拟主机(默认主机)将是   用过的。其他值将被忽略。

     

TimeOut 指令

     

描述:服务器等待某些事件的时间   失败请求之前语法:TimeOut seconds默认值:TimeOut 300   上下文:服务器配置,虚拟主机状态:核心模块:核心   TimeOut指令当前定义了Apache的时间量   等待三件事:

     

接收GET请求所需的总时间。数量   在POST或PUT请求上接收TCP数据包之间的时间。该   TCP数据包传输中ACK之间的时间量   响应。我们计划在某些地方单独配置这些   指着路。计时器在1.2之前默认为1200,但是   已降至300,这在大多数情况下仍然远远超过必要   的情况。默认情况下,它不会设置为低,因为可能仍然存在   是一个奇怪的地方在代码中,当一个数据包没有重置定时器   发送。