Keep-alive和哑代理

Keep-alive首部只会对这条离开客户端的TCP链路产生影响;如果一台客户端正在与一台服务器对话,客户端可以发送一个Connection:Keep-alive首部来告诉服务器,它希望保持持久连接;如果服务器支持Keep-alive,就在响应中存在一个Connection:Keep-alive首部。

1. Connection首部和盲中继
在代理中,它们不理解Connection首部,而且不理解在沿着转发链路将其发送出去之前,应该将该首部删除,不会对Connection首部进行特殊处理。


假设一个Web应用程序正通过一个盲中继的哑代理与Web服务器进行通信。如下所示


(a). Web应用程序向代理发送了一条报文,其中包含了Connection: Keep-alive首部;客户端请求建立一条Keep-alive连接,需要等待响应,以确定对象是否可它对Keep-alive信道的请求。

(b). 哑代理收到了这个请求,但它并不理解Connection首部(只是将其作为一个扩展首部对待),因此,将报文一字不漏发送给服务器。但Connection首部是个逐跳首部,只适用于单条传输链路,报文在传输到代理时,应该得到处理,不应该沿着传输向下传输。

(c).在服务器端收到这条请求后,会以为是代理希望进行Keep-alive对话。对于服务器来说这没有问题,它同意了对话,并回送一个Connection:Keep-alive响应首部。因此,服务器会认为与代理进行Keep-alive对话,遵循Keep-alive规则。但代理对此一无所知。

(d). 哑代理将服务器的响应报文回送给客户端,并将响应Connection:Keep-alive首部(不处理)一起发送回去。

(e). 客户端收到这个首部后,就会认为服务器同意Keep-alive对话。实际情况是:服务器与代理建立Keep-alive对话,但代理(不会产生请求)一无所知;客户端以为已经与服务器建立了对话,其实这个链路在代理与服务器之间建立。当客户端继续发送请求时,请求被忽略,因为同一连接(数据必须由代理--源端点 产生)上会有其他请求。
后果:这种错误的通信方式会使客户端处于挂起状态,直到客户端或服务器将连接超时,并将其关闭。

2. 代理和逐跳首部
为了避免上述问题,现代代理都不转发Connection首部和所有Connection值中的首部。

插入Proxy-Connection

在不要求所有Web应用程序支持高版本HTTP(HTTP/1.1以上),网景提出一个对盲中继问题的变通方法。虽然解决在客户端后面紧跟着一个盲中继所带来的问题,但并没有解决所有其他情况下的问题。

问题:是由哑代理盲目地转发Connection:Keep-alive之类的逐跳首部惹出的麻烦。逐跳首部只与一条特定的连接有关,不能被转发。当下游服务器将转发来的Connection首部作为来自代理(源)自身请求时,就会引起问题。

网景的变通方法是:浏览器会向代理发送非标准的Proxy-Connection扩展首部,而不是官方支持的Connection首部。如果是盲中继,它会将无意的Proxy-Connection首部转发给服务器,服务器会忽略此首部,不会产生任何问题。

image.png

如果是一个聪明的代理(能够理解持久连接的握手动作),会将Connection首部取代Proxy-Connection首部,后将其发送给服务器。


如果只有一个代理时,可以用这种方法解决这个问题,但在哑代理任意一侧有一个聪明代理时,这个问题会再次露头。


HTTTP/1.1持久连接

HTTP/1.1逐渐停止了对Keep-alive连接的支持,用一种名为持久连接的改进型来取代它。

在所有的连接中默认情况是持久连接的,会在事务处理结束之后,或承诺时间之内将其关闭。要显式地关闭这个持久连接,需要在报文中加入Connection: close首部。而在之前HTTP版本中,Keep-alive连接是可选的,要不就不支持。

HTTP/1.1客户端收到响应后,除非报文中存在Connection:close首部,不然HTTP/1.1持久连接将维持打开状态。但是,客户端或服务器依然可以随时关闭这个持久连接,即使没有接到报文或报文中没有Connection:colse首部。

持久连接的限制和规则

  • 发送了Connection: close请求首部之后,客户端将无法在这种连接发送请求(代理将忽略,除非再次握手)。
  • 建立持久连接的条件: 报文的实体主体部分的长度和相应的Content-Length值一致,代理或服务器才能知道一个事务的结束和另一个事务的开始。
  • 不建议HTTP/1.1服务器与HTTP/1.0客户端建立持久连接,实际还存在这种情况。
  • HTTP/1.1设备可以在任意时刻关闭连接。
  • 在异常的关闭连接后,HTTP/1.1应用程序能够从关闭中恢复出来,只要不存在可能的累积起来的副作用。
  • 一个客户端对任何服务器或代理最多只能维护两条连接。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容