Page 127 - HTTP权威指南
P. 127
4.5.6 Keep-Alive和哑代理
我 们 来 仔 细 看 看 keep-alive 和 哑 代 理 中 一 些 比 较 微 妙 的 问 题。Web 客 户 端 的
Connection: Keep-Alive 首部应该只会对这条离开客户端的 TCP 链路产生影响。
这就是将其称作“连接”首部的原因。如果客户端正在与一台 Web 服务器对话,客
户端可以发送一个 Connection: Keep-Alive 首部来告知服务器它希望保持连接
的活跃状态。如果服务器支持 keep-alive,就回送一个 Connection: Keep-Alive
首部,否则就不回送。
1. Connection首部和盲中继
问题出在代理上——尤其是那些不理解 Connection 首部,而且不知道在沿着转
发链路将其发送出去之前,应该将该首部删除的代理。很多老的或简单的代理都
是盲中继(blind relay),它们只是将字节从一个连接转发到另一个连接中去,不对
Connection 首部进行特殊的处理。
假设有一个 Web 客户端正通过一个作为盲中继使用的哑代理与 Web 服务器进行对
话。图 4-15 显示的就是这种情形。
(b)服务器认为对方请求
保持连接活跃,因此处理
完连接后不会将其关闭。
(a) Connection: Keep-Alive (b) Connection: Keep-Alive
(c) Connection:
(d) Connection: Keep-Alive哑代理 Keep-Alive
客户端 服务器
(c)代理会忽略连接上所有
下一条请求 新的请求,等待连接关闭。
(e)由于代理不会对其进
行处理,所以客户端在keep-alive
连接上发送的第二条请求会被挂起。
图 4-15 keep-alive 无法与不支持 Connection 首部的代理进行互操作
这幅图中发生的情况如下所示。
(1) 在图 4-15a 中,Web 客户端向代理发送了一条报文,其中包含了 Connection:
Keep-Alive 首部,如果可能的话请求建立一条 keep-alive 连接。客户端等待响
94 应,以确定对方是否认可它对 keep-alive 信道的请求。
100 | 第 4 章