HTTP 1.0 持久连接 -- Keep-Alive

http1.1版本之前 许多浏览器和服务器扩展了持久连接

使用 Connection:Keep-Alive 的首部来操作 tcp 的持久连接

实现HTTP/1.0 keep-alive连接的客户端可以通过包含Connection: Keep-Alive首部请求将一条连接保持在打开状态。如果服务器愿意为下一条请求将连接保持在打开状态,就在响应中包含相同的首部(参见图4-14)。如果响应中没有Connection: Keep-Alive首部,客户端就认为服务器不支持keep-alive,会在发回响应报文之后关闭连接。

HTTP 1.0 持久连接 -- Keep-Alive_第1张图片
HTTP/1.0 keep-alive事务首部的握手过程

Keep-Alive 选项

当使用Connection: Keep-Alive 首部时可以附加一个 Keep-Alive首部来调节 keep-alive 的行为

timeout max 都是响应首部发出的 分别表示 服务器希望将连接保持在活跃状态的时间和服务器希望为多少个事务保持此连接的活跃状态,它们都是一个估计值并不是一个承诺值。

此外还可以添加任意未经处理的形如 name[=value]的属性 主要用于诊断和调试

Connection: Keep-Alive

Keep-Alive: max=5, timeout=120

上面的例子表示服务器最多还会为另外5个事务保持连接的活跃状态或者将空闲状态的活跃连接保持两分钟

Keep-Alive连接的限制和规则

1. http/1.0 中keep-alive不是默认使用的 客户端必须发送一个带有 Connection:Keep-Alive 的请求首部的请求来激活 keep-alive 连接

2. Connection:Keep-Alive 首部必须跟随所有希望保持持久连接的报文一起发送:

如果客户端没有发送Connection:Keep-Alive 服务器将会在请求之后关闭连接

如何客户端发现在响应中没有Connection:Keep-Alive首部,则可以知道服务器在发出响应之后会关闭连接

3. 保持持久连接报文实体必须要有正确Content-Length,这样事务处理才能正确的检测出一条报文的结束和另一条报文的结束。

4. 代理和网关必须执行Connection首部的规则。代理或网关必须在将报文转发出去或将其高速缓存之前,删除在Connection首部中命名的所有首部字段以及Connection首部自身。严格来说,不应该与无法确定是否支持Con-nection首部的代理服务器建立keep-alive连接,以防止出现哑代理问题。

你可能感兴趣的:(HTTP 1.0 持久连接 -- Keep-Alive)