30

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

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

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

4

3 回答 3

34

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

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

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

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

于 2011-01-21T23:50:40.097 回答
32

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

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

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

于 2010-04-30T06:37:27.940 回答
4

KeepAliveTimeout指令

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

将 KeepAliveTimeout 设置为较高的值可能会导致负载较重的服务器出现性能问题。超时时间越高,就会有越多的服务器进程被占用,等待与空闲客户端的连接。

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

超时指令

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

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

于 2011-02-24T07:02:29.790 回答