【问题标题】:TCP Persistent Connections with HTTP?TCP 与 HTTP 的持久连接?
【发布时间】:2012-10-09 08:02:18
【问题描述】:

所以我认为使用 HTTP 1.1,只要您与该服务器通信,您的 TCP 连接就会持续存在?它实际上是如何工作的,TCP 连接如何知道您何时完成写入套接字?任何形式都很棒,我已经做过研究,但我找不到我要阅读的 RFC。

【问题讨论】:

    标签: http tcp


    【解决方案1】:

    典型的实现是 HTTP 服务器会有一个超时时间(通常称为KeepAliveTimeoutsuch),之后它会关闭一个空闲的连接。

    为每个连接保留一个线程或整个进程的服务器(例如具有通常的 mpm_prefork 或 mpm_worker 的 apache),keepalives 通常被完全禁用或保持很短(几秒钟)。对于每个连接使用更少内存的基于事件的服务器,例如 nginx,keepalive 超时可以保留在更高的值(通常是一分钟左右)。

    【讨论】:

      【解决方案2】:

      section 8.1 of RFC 2616。基本上,HTTP 1.1 将所有连接视为持久连接,但 RFC 的语言并没有强制要求这种行为,因为它使用了“应该”这个词。如果是强制的,它将使用“MUST”。

      但是,RFC 没有详细说明实现如何做到这一点。从HTTP Persistent Connection page on Wikipedia 可以看出,Apache 的默认超时时间(超过此时间后它会返回持续连接以供其他用途)可能低至五秒。 (尽管考虑到 Apache 提供的所有其他旋钮和刻度盘,这几乎可以肯定是可配置的)。

      换句话说,它意味着在短时间内向同一地址发送大量请求,以免浪费时间打开和关闭大量会话。增加此超时不是“搭便车”,因为在连接保持打开状态时资源被占用。在您期望有大量传入客户端的环境中,占用这些资源可能会对性能造成致命影响。

      【讨论】:

      • 所以如果我在我的数据包中添加一个keepalive标头我应该保持TCP会话打开只要服务器支持?
      • @Taylor,不,实际上只要服务器 允许, 就可以了,这略有不同。服务器和客户端都必须同意保持会话打开。我应该补充一点,尝试增加此超时时间是不明智的,这不是免费搭车。如果您想知道如何在 Apache 中执行此操作,请参阅 httpd.apache.org/docs/2.2/mod/core.html#keepalivetimeout,并仔细考虑那里的警告。
      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多