【发布时间】:2012-10-09 08:02:18
【问题描述】:
所以我认为使用 HTTP 1.1,只要您与该服务器通信,您的 TCP 连接就会持续存在?它实际上是如何工作的,TCP 连接如何知道您何时完成写入套接字?任何形式都很棒,我已经做过研究,但我找不到我要阅读的 RFC。
【问题讨论】:
所以我认为使用 HTTP 1.1,只要您与该服务器通信,您的 TCP 连接就会持续存在?它实际上是如何工作的,TCP 连接如何知道您何时完成写入套接字?任何形式都很棒,我已经做过研究,但我找不到我要阅读的 RFC。
【问题讨论】:
典型的实现是 HTTP 服务器会有一个超时时间(通常称为KeepAliveTimeout 或such),之后它会关闭一个空闲的连接。
为每个连接保留一个线程或整个进程的服务器(例如具有通常的 mpm_prefork 或 mpm_worker 的 apache),keepalives 通常被完全禁用或保持很短(几秒钟)。对于每个连接使用更少内存的基于事件的服务器,例如 nginx,keepalive 超时可以保留在更高的值(通常是一分钟左右)。
【讨论】:
见section 8.1 of RFC 2616。基本上,HTTP 1.1 将所有连接视为持久连接,但 RFC 的语言并没有强制要求这种行为,因为它使用了“应该”这个词。如果是强制的,它将使用“MUST”。
但是,RFC 没有详细说明实现如何做到这一点。从HTTP Persistent Connection page on Wikipedia 可以看出,Apache 的默认超时时间(超过此时间后它会返回持续连接以供其他用途)可能低至五秒。 (尽管考虑到 Apache 提供的所有其他旋钮和刻度盘,这几乎可以肯定是可配置的)。
换句话说,它意味着在短时间内向同一地址发送大量请求,以免浪费时间打开和关闭大量会话。增加此超时不是“搭便车”,因为在连接保持打开状态时资源被占用。在您期望有大量传入客户端的环境中,占用这些资源可能会对性能造成致命影响。
【讨论】: